jc3213 / download_with_aria2

The browser extenson for aria2 download utility via JSON-RPC
https://jc3213.github.io/download_with_aria2/
GNU Lesser General Public License v2.1
64 stars 9 forks source link

`workupload.com` unable download #96

Closed detiam closed 3 months ago

detiam commented 3 months ago

我今天遇到了和 #72 差不多的问题,如果不开 启用捕获网络请求 则根本没法捕获下载。 发现用火狐devtool自带的 复制curl命令 可以下载,然后发现 复制请求头 然后填到 aria2 这个自定义请求头的位置也可以下载 图片

Referer: https://workupload.com/
Host: f61.workupload.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: captcha=秘密; token=秘密
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1

但是用这个插件下载的时候,这个地方是这个样子的 图片 自定义请求头为空,请求来源也不一样,然后也无法下载

jc3213 commented 3 months ago

你能提供一个页面给我参考吗?这个地址,是根据downloads.onCreated事件触发时,downloadItem.referrer这个值提取出来的请求来源Referer。如果自动提取的Referer无法使用,你可以打开设置里的启用下载弹窗功能,这个功能会在下载开始前弹出一个窗口用以确认并修改下载任务的信息,你可以在这个窗口下手动修改Referer

至于自定义请求头的查看跟修改……大多数用户不需要所以我也没做。如果不想要请求头你可以将这个网站添加到请求头的例外规则中。目前我还是想办法优化任务管理器的性能表现为主。我还准备制作一个管理当前页面下载相关规则的子页面。即管理自动代理规则请求头列外规则抓取下载域名相关规则的快速设置窗口。但是目前制作了个简单的HTML,js啥的还没写。只比新建文件夹好一丢丢

detiam commented 3 months ago

你能提供一个页面给我参考吗?这个地址,是根据downloads.onCreated事件触发时,downloadItem.referrer这个值提取出来的请求来源Referer。如果自动提取的Referer无法使用,你可以打开设置里的启用下载弹窗功能,这个功能会在下载开始前弹出一个窗口用以确认并修改下载任务的信息,你可以在这个窗口下手动修改Referer

https://workupload.com/file/QRGqwypEy56

至于自定义请求头的查看跟修改……大多数用户不需要所以我也没做。如果不想要请求头你可以将这个网站添加到请求头的例外规则中。目前我还是想办法优化任务管理器的性能表现为主。我还准备制作一个管理当前页面下载相关规则的子页面。即管理自动代理规则请求头列外规则抓取下载域名相关规则的快速设置窗口。但是目前制作了个简单的HTML,js啥的还没写。只比新建文件夹好一丢丢

这个功能感觉还是比较有用的吧,我是想要请求头的

jc3213 commented 3 months ago

https://workupload.com/file/QRGqwypEy56

chromium firefox useragent

我自己测试的结果时,你需要修改User-Agent为任意浏览器,我使用Edge跟Firefox的用户代理就可以正常下载,默认的Transmission/4.0.0就会出错。这个网站重点检查对象应该是User-Agent

以下是火狐129开发者版本的UA

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0
detiam commented 3 months ago

@jc3213 已更新,可是我还是不能下载,会下载下面这个html

<html>
  <head>
    <title>workupload - Are you a human?</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <script src="/js/39b9ad5.js?v=KUUBLZ75"></script>

                <link rel="stylesheet" type="text/css" href="/css/4280ebd.css?v=KUUBLZ75"/>

      <link rel="preconnect" href="https://fundingchoicesmessages.google.com" />
      <link rel="preconnect" href="https://googleads.g.doubleclick.net" />
      <link rel="preconnect" href="https://pagead2.googlesyndication.com" />

      <!-- Matomo -->
      <script>
        var _paq = window._paq = window._paq || [];
        _paq.push(["disableCookies"]);
        _paq.push(['trackPageView']);
        _paq.push(['enableLinkTracking']);
        (function() {
          var u="//t.workupload.com/";
          _paq.push(['setTrackerUrl', u+'matomo.php']);
          _paq.push(['setSiteId', '1']);
          var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
          g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
        })();
      </script>
      <!-- End Matomo Code -->

  </head>
  <body>

    <div class="container pt-5">
      <div class="row" style="margin-top: 20%;">
        <div class="col-md-8 col-md-offset-2">
          <center>
            <i class="fa fa-shield-check"></i>
            <img src="/bundles/app/img/workupload_logo_medium.svg" alt="workupload logo" style="max-width: 300px; display: block;">
            Security Check
            <span style="font-size:25px; display:block;">Checking that you are not a robot.</span>
            <span style="font-size:20px; display:block;">This process is performed automatically. You will be redirected shortly.</span>
          </center>
        </div>
      </div>
    </div>

        <input id="captcha_93024" type="hidden"  disabled="disabled" /><script>
            async function sha256(message, find, i) {
                const msgBuffer = new TextEncoder().encode(message); 
                const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
                const hashArray = Array.from(new Uint8Array(hashBuffer));
                const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');

                if(find.includes(hashHex)){
                    return i;
                }
            }

            $(document).ready(function () {
                let solvePuzzle = function(){
                    $.ajax({
                        url: "/puzzle",
                        type: 'GET',
                        dataType: 'json',
                        success: function(res) {
                            let found = 0;
                            let i = 0;
                            while (i < res.data.range) {
                                sha256(res.data.puzzle + i, res.data.find, i).then(function(s){
                                    if(typeof s !== "undefined"){
                                        $('#captcha_93024').val($('#captcha_93024').val() + s + ' ');
                                        found++;
                                        if(found == res.data.find.length){
                                            $.ajax({
                                                url: "/captcha",
                                                type: 'POST',
                                                dataType: "json",
                                                data: {
                                                    captcha: $('#captcha_93024').val()
                                                }
                                            }).always(function(data, textStatus, xhr){
                                                $('#captcha_93024').val('');
                                                if(typeof window.captchaCallback !== "undefined"){
                                                    window.captchaCallback();
                                                }
                                            });
                                        }
                                    }
                                });
                                i++;
                            }
                        }
                    });
                };
                solvePuzzle();
                setInterval(solvePuzzle, 20000);
            });

        </script>

    <script>
      window.captchaCallback = function(){
        location.reload();
      }
    </script>

  </body>
</html>

换了最新版chromium也一样,但是我手动填入cookie,ua 和 referer 就可以下载

jc3213 commented 3 months ago

我火狐129开发者,使用全新用户档案,安装后扩展后打开抓取,刚开始跟你一样出错,我用Chromium版本测试又是正常的因此怀疑是User-Agent,直接提取navigator.userAgent后,填入就能正常下载了,我无法复现你后续的问题。

detiam commented 3 months ago

我火狐129开发者,使用全新用户档案,安装后扩展后打开抓取,刚开始跟你一样出错,我用Chromium版本测试又是正常的因此怀疑是User-Agent,直接提取navigator.userAgent后,填入就能正常下载了,我无法复现你后续的问题。

找到办法复现了,如果打开 启用下载弹窗 下载就会下载那个html页面,如果不开就能正常下载文件 启用下载弹窗 有什么不一样吗

detiam commented 3 months ago

@jc3213

jc3213 commented 3 months ago

无法传递header这个确实是我的疏忽,不过你的pull request跟我预期的不太一样,回头我关掉重新写以下。最简单的修复方法其实是添加aria2Global.header = options.header; 这样也能避免一写新手用户操作到请求头导致出错。

aria2Global = settings.disposition({...jsonrpc, ...options});
aria2Global.header = options.header;
jc3213 commented 3 months ago

@ivysrono @detiam 我重写了下获取请求头的方法,这样尽可能的还原浏览器的请求头,至少我测试起来没啥问题。你们能帮忙测试下最新的版本吗?

PS:请用全新用户档案测试,该版本会移除几个设置与对应的功能。

detiam commented 2 months ago

@jc3213 没提示窗口直接正常下载了 图片 好!

jc3213 commented 2 months ago

我现在把所有能获取的请求头全部塞到options.header里面了。我不是太理解同时定义options.refereroptions['user-agent']后,再在options.header中添加['Referer: someweb', 'User-Agent: browserUA']这样到底是哪一个更优先。我问Copilot倒是告诉我options.header里的优先,导致修改ua的代码异常奇怪,关键还没法测试是否正常工作。想找过去issue里无Referer才能下载的网站做测试结果已经boom了,因此还是把Headers的例外规则留了下来(理论不需要)。

对于一些限制单次尝试的网站没用webRequestBlocking测试过,但问题应该不会太大,因为mv3禁止了这个功能必须用declaritiveNetRequest,因此这个功能估计依然会是火狐独占。