写了个自用的猴油脚本为豆列添加快速看过按钮, POST 请求时候缺遇到了 access control checks 的问题

2022-12-21 13:11:12 +08:00
 gap

脚本很简单,就是为豆列中的条目添加了一个「看过」按钮,点击按钮的响应逻辑如下(是从手动操作的请求 copy 出来的 fetch ,其中 id 是动态获取的条目 id ,body 中的 ck 字段我看下其他手动操作的请求,ck 都是固定的值),但该请求却失败了 Fetch API cannot load https://movie.douban.com/j/subject/xxx/interest due to access control checks.

这个请求是从浏览器发出的,应该是可以绕过任何检查吧,是我遗漏了什么吗?感谢指点 🙏

    function handleSeen(id) {
        fetch("https://movie.douban.com/j/subject/" + id + "/interest", {
            "body": "ck=hC6f&interest=collect&rating=&foldcollect=F&tags=&comment=",
            "cache": "default",
            "credentials": "include",
            "headers": {
                "Accept": "application/json, text/javascript, */*; q=0.01",
                "Accept-Language": "en-US,en;q=0.9",
                "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15",
                "X-Requested-With": "XMLHttpRequest"
            },
            "method": "POST",
            "mode": "cors",
            "redirect": "follow",
            "referrer": "https://movie.douban.com/subject/" + id + "/",
            "referrerPolicy": "unsafe-url"
        })
    }
680 次点击
所在节点    问与答
10 条回复
Rache1
2022-12-21 13:27:41 +08:00
贴完整的报错信息,油猴有内置提供了 GM_xmlhttpRequest 方法,可以发起跨域请求。
gap
2022-12-21 14:02:20 +08:00
@Rache1

就这三条报错信息,请求是从豆瓣页面上发起的,请问也需要跨域吗?目前我直接用的 fetch

[Error] Preflight response is not successful. Status code: 403
[Error] Fetch API cannot load https://movie.douban.com/j/subject/30426519/interest due to access control checks.
[Error] Failed to load resource: Preflight response is not successful. Status code: 403 (interest, line 0)
ljsh093
2022-12-21 14:10:06 +08:00
F12 里的网络请求对比下手动操作和脚本操作的参数是否一致呢?
Rache1
2022-12-21 14:17:05 +08:00
@gap 403 一般指没权限,你这请求里面。

在浏览器环境下,有些请求 header 是不能自定义的,只能由浏览器发出,比如 referrer 和 User-Agent ,设置了也是无效的。
ljsh093
2022-12-21 14:28:12 +08:00
@Rache1 新的规范下 referrer 也可以设置了,不过不是 op 这个格式
ysc3839
2022-12-21 14:31:55 +08:00
用户脚本中调用标准的 fetch 或 xhr 都不能绕过检查,要绕过检查需要使用 GM_xmlhttpRequest
Rache1
2022-12-21 14:39:05 +08:00
@ljsh093 多谢,试了一下,试了一下,在 fetch 里面确实可以,xhr 好像还不行。

InDom
2022-12-21 14:59:57 +08:00
你在 www. 下执行 movie. 域的请求, 显然是跨域了, 获取到 cookies 以后用 GM_ 发吧.

除了 ck 之外几乎没有任何检查. 最小 curl 命令如下

curl 'https://movie.douban.com/j/subject/****/interest' -H 'Cookie: dbcl2="****"; ck=****;' --data 'ck=****&interest=collect'
gap
2022-12-21 15:32:35 +08:00
@InDom 感谢提醒!我把脚本 match 的 url pattern 改成 movie 就行啦!
gap
2022-12-21 15:32:53 +08:00
同时谢谢大家的建议,学习到了 GM_xmlhttpRequest

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/903906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX