V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gap
V2EX  ›  问与答

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

  •  
  •   gap · Dec 21, 2022 · 1171 views
    This topic created in 1231 days ago, the information mentioned may be changed or developed.

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

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

    InDom
        8
    InDom  
       Dec 21, 2022   ❤️ 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
       Dec 21, 2022
    @InDom 感谢提醒!我把脚本 match 的 url pattern 改成 movie 就行啦!
    gap
        10
    gap  
    OP
       Dec 21, 2022
    同时谢谢大家的建议,学习到了 GM_xmlhttpRequest
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1347 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 16:38 · PVG 00:38 · LAX 09:38 · JFK 12:38
    ♥ Do have faith in what you're doing.