V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gap
V2EX  ›  问与答

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

  •  
  •   gap · 2022-12-21 13:11:12 +08:00 · 764 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。

    脚本很简单,就是为豆列中的条目添加了一个「看过」按钮,点击按钮的响应逻辑如下(是从手动操作的请求 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"
            })
        }
    
    10 条回复    2022-12-21 15:32:53 +08:00
    Rache1
        1
    Rache1  
       2022-12-21 13:27:41 +08:00
    贴完整的报错信息,油猴有内置提供了 GM_xmlhttpRequest 方法,可以发起跨域请求。
    gap
        2
    gap  
    OP
       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
        3
    ljsh093  
       2022-12-21 14:10:06 +08:00 via iPhone
    F12 里的网络请求对比下手动操作和脚本操作的参数是否一致呢?
    Rache1
        4
    Rache1  
       2022-12-21 14:17:05 +08:00
    @gap 403 一般指没权限,你这请求里面。

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

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

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

    curl 'https://movie.douban.com/j/subject/****/interest' -H 'Cookie: dbcl2="****"; ck=****;' --data 'ck=****&interest=collect'
    gap
        9
    gap  
    OP
       2022-12-21 15:32:35 +08:00
    @InDom 感谢提醒!我把脚本 match 的 url pattern 改成 movie 就行啦!
    gap
        10
    gap  
    OP
       2022-12-21 15:32:53 +08:00
    同时谢谢大家的建议,学习到了 GM_xmlhttpRequest
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3149 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:06 · PVG 22:06 · LAX 06:06 · JFK 09:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.