`
drswinghead
  • 浏览: 4968 次
  • 性别: Icon_minigender_1
  • 来自: 山里人
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

给aria2打了个补丁,支持国内多数下载网站防盗链链接下载

阅读更多
这个补丁的作用,修改重定向时对引用及cookie的处理,使其能正确下载国内多数下载网站的防盗链链接。

补丁修改的机制说明:
在30x重定向时,RFC的HTTP标准规定不能发送Cookie, 不能使用引用。但国内多数下载站点这两者都同时使用,而且设置Cookie的域名比较复杂,这些都被作为防盗链的手段广泛使用,使其只能在浏览器中下载,遵守标准的普通下载工具却无法正常下载这些链接。
针对这种情况,在aria2中修正机制,在记录cookie的时候对域名进行处理,只保留有二级域名, 在查找cookie的时候也只是使用二级域名进行查询。
在做redirect的时候,仍旧按照服务器的响应记录cookie, 并在redirect请求中使用这些cookie。
在做redirect的时候,使用本次地址作为引用发送给服务器。
用户在--header参数中传递的Cookie会与本次服务器设置的Cookie合并,一起用于下一次转向链接的请求。

测试网站列表:
非凡软件下载
sina下载 down.tech.sina.com.cn
www.greendown.cn
...
如果您测试了其他站点,请email我。

补丁如下:
aria2-1.9.2_redirect_no_cookie_no_refer.patch
diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc
index c6c0afb..dfc981f 100644
--- a/src/HttpRequest.cc
+++ b/src/HttpRequest.cc
@@ -218,9 +218,10 @@ std::string HttpRequest::createRequest()
     builtinHds.push_back(std::make_pair("Referer:", getPreviousURI()));
   }
   if(!_cookieStorage.isNull()) {
+      std::string baseDomain = util::getBaseDomainName(getHost());
     std::string cookiesValue;
     std::vector<Cookie> cookies =
-      _cookieStorage->criteriaFind(getHost(),
+        _cookieStorage->criteriaFind(baseDomain, // getHost(),
                                    getDir(),
                                    Time().getTime(),
                                    getProtocol() == Request::PROTO_HTTPS ?
@@ -235,15 +236,25 @@ std::string HttpRequest::createRequest()
   }
   for(std::vector<std::pair<std::string, std::string> >::const_iterator i =
         builtinHds.begin(), eoi = builtinHds.end(); i != eoi; ++i) {
-    std::vector<std::string>::const_iterator j = _headers.begin();
-    std::vector<std::string>::const_iterator jend = _headers.end();
+    // std::vector<std::string>::const_iterator j = _headers.begin();
+    // std::vector<std::string>::const_iterator jend = _headers.end();
+    std::vector<std::string>::iterator j = _headers.begin();
+    std::vector<std::string>::iterator jend = _headers.end();
     for(; j != jend; ++j) {
       if(util::startsWith(*j, (*i).first)) {
         break;
       }
     }
+    // hacked by liuguangzhao@users.sf.net
+    // if user header is not cookie, override it, or leave it there no touched.
+    // for this case, the best methord is combine to cookies part to one Cookie: header line
     if(j == jend) {
       strappend(requestLine, (*i).first, " ", (*i).second, A2STR::CRLF);
+    } else {
+        // combine the new cookie to header line
+        if (util::startsWith((*i).first, "Cookie") && !util::endsWith(*j, (*i).second)) {
+            (*j) += ";" + (*i).second;
+        }
     }
   }
   // append additional headers given by user.
diff --git a/src/HttpResponse.cc b/src/HttpResponse.cc
index 6957fe9..79de4bd 100644
--- a/src/HttpResponse.cc
+++ b/src/HttpResponse.cc
@@ -116,11 +116,13 @@ std::string HttpResponse::determinFilename() const

void HttpResponse::retrieveCookie()
{
+    // hacked by liuguangzhao@users.sf.net
+    std::string baseDomain = util::getBaseDomainName(httpRequest->getHost());
   std::vector<std::string> v = httpHeader->get(HttpHeader::SET_COOKIE);
   for(std::vector<std::string>::const_iterator itr = v.begin(), eoi = v.end();
       itr != eoi; ++itr) {
     httpRequest->getCookieStorage()->parseAndStore(*itr,
-                                                   httpRequest->getHost(),
+                                                   baseDomain, // httpRequest->getHost(),
                                                    httpRequest->getDir());
   }
}
diff --git a/src/Request.cc b/src/Request.cc
index 9fbba5a..4204c0a 100644
--- a/src/Request.cc
+++ b/src/Request.cc
@@ -125,7 +125,8 @@ void Request::setReferer(const std::string& uri)
}

bool Request::redirectUri(const std::string& uri) {
-  _previousUri = A2STR::NIL;
+    // _previousUri = A2STR::NIL;
+    _previousUri = _uri;  // hacked by liuguangzhao@users.sf.net
   _supportsPersistentConnection = true;
   ++_redirectCount;
   std::string redirectedUri;
diff --git a/src/util.cc b/src/util.cc
index 58a37d4..bb10bdc 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -1305,6 +1305,48 @@ void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group)
   }
}

+// hacked by liuguangzhao@users.sf.net
+/*
+  only leave the last 2 or three domain parts
+ */
+    std::string getBaseDomainName(const std::string &s)
+    {
+        std::string baseDomain;
+        std::string ts = s;
+        if (util::isNumericHost(s)) {
+            return s;
+        }
+        size_t colonPos = ts.find(':');
+        if (colonPos != std::string::npos) {
+            ts.resize(colonPos);
+        }
+
+        std::vector<std::string> domParts;
+        std::string delims(".");
+        util::split(ts, std::back_inserter(domParts), delims);
+       
+        int minDomParts = 2;
+        int domLevel = domParts.size();
+        if (domParts.at(domLevel - 1) == "cn"
+            || domParts.at(domLevel - 1) == "cc"
+            || domParts.at(domLevel - 1) == "us") {
+            if (domParts.at(domLevel - 2) == "org"
+                || domParts.at(domLevel - 2) == "com"
+                || domParts.at(domLevel - 2) == "net"
+                || domParts.at(domLevel - 2) == "info") {
+                minDomParts = 3;
+            }
+        }
+
+        baseDomain = domParts.at(domLevel - 2) + "." + domParts.at(domLevel - 1);
+        if (minDomParts == 3) {
+            baseDomain = domParts.at(domLevel - 3) + "." + baseDomain;
+        }
+
+        return baseDomain;
+    }
+
+
} // namespace util

} // namespace aria2
diff --git a/src/util.h b/src/util.h
index 9e1c2a5..01b6a1c 100644
--- a/src/util.h
+++ b/src/util.h
@@ -395,6 +395,9 @@ bool inSameCidrBlock(const std::string& ip1, const std::string& ip2, int bits);

void removeMetalinkContentTypes(const SharedHandle<RequestGroup>& group);

+    // hacked by liuguangzhao@users.sf.net
+    std::string getBaseDomainName(const std::string &s);
+
} // namespace util

} // namespace aria2
0
1
分享到:
评论

相关推荐

    Aria2+ffmpeg+m3u8下载工具(windows版)

    这个"Aria2+ffmpeg+m3u8下载工具(windows版)"是一个专为Windows用户设计的高效解决方案,整合了Aria2、ffmpeg以及jQuery等技术,方便用户批量下载并转换m3u8格式的视频。 首先,Aria2是一个轻量级的多协议、多源...

    aria2下载神器

    **aria2下载神器** aria2是一款强大的开源下载工具,它以其多线程、分段下载的能力而备受赞誉,尤其在处理大文件时,能够显著提高下载速度。在本文中,我们将深入探讨aria2的主要功能、使用方法以及如何通过web控制...

    Aria2下载工具

    **Aria2下载工具详解** Aria2是一款轻量级、多协议、多源的下载管理器,以其高效、稳定和强大的特性深受广大用户喜爱。它支持HTTP、HTTPS、FTP、BitTorrent等多种协议,可以同时从多个源进行下载,极大地提高了下载...

    可以方便的把百度网盘的下载地址导出到aria2aria2rpc支持YAAW

    可以方便的把百度网盘的下载地址导出到 aria2/aria2-rpc,支持 YAAW

    aria2下载工具.zip

    **aria2下载工具详解** aria2是一款开源、免费且功能强大的多协议、多源下载工具。它支持HTTP、HTTPS、FTP、BitTorrent等协议,并具备断点续传、多线程下载、分块下载等功能,使得大文件下载更加高效、稳定。在日常...

    C#封装Aria2c类库接口,大文件下载断点续传,速度快稳定.rar

    FlyVR.Aria2.Aria2cRuntime.Load(new FlyVR.Aria2.Aria2cSettings() { Aria2Args = "", Aria2Host = "localhost", Aria2Path = "aria2c.exe(aria2c的路径)", Aria2Port = 6800 }); FlyVR.Aria2.Aria2c faa = new ...

    Qt. aria2写的一个简易下载例子

    aria2写的一个简易下载例子"主要展示了如何结合Qt的QProcess类和aria2下载工具,创建一个简单的下载管理器。通过理解和应用上述知识点,开发者不仅可以实现文件的高效下载,还能为用户提供友好的交互体验。对于需要...

    aria2-1.37.0-win-64bit-build1.zip

    Aria2 是一个轻量级、多协议、高效的命令行下载工具,支持多种协议和多线程下载,常用于加速文件下载以及处理大文件下载任务。它的主要功能和特点如下: 1. 多协议支持 Aria2 支持多种下载协议,包括: ...

    ubuntu aria2-yaaw下载百度网盘文件方法,亲测可用

    这个方法特别适用于处理大文件,因为aria2支持多线程和断点续传,可以显著提高下载速度。下面将详细介绍如何配置和使用这一组合。 首先,我们需要安装aria2。在Ubuntu终端中输入以下命令: ```bash sudo apt ...

    Aria2下载器.zip(多线程优化版)win10可用

    标题中的"Aria2下载器.zip(多线程优化版)win10可用"指的是一个针对Windows 10操作系统优化过的Aria2下载工具的压缩包。Aria2是一款开源、轻量级且功能强大的下载管理器,支持多种协议,如HTTP(S)、FTP、SFTP、...

    aria2c[Windows系统中下载http]

    1. **安装aria2c**: 首先,你需要下载aria2c的Windows版本,如压缩包文件"aria2-1.18.8-win-32bit-build1",解压后将可执行文件`aria2c.exe`放在系统的PATH环境变量所包含的目录下,这样就可以在任何地方通过命令行...

    Aria2-不限速全平台下载利器

    Aria2-不限速全平台下载利器, 3.1 Aria2 for macOS 3.1.1 懒人版 — Aria2GUI(客户端,推荐) 下载安装Aria2GUI.dmg,位于网盘的Aria2 for Mac文件夹中,或者 github 地址:aria2gui mac 1.3.5客户端。 Aria2是...

    Photon直接下载磁力链接、基于aria2 的免费多线程下载工具

    Photon——可直接下载磁力链接、基于aria2 的免费多线程下载工具Photon 是一款基于 aria2 的、免费的多线程下载软件,拥有易用、友好的图形界面,支持 磁力链,HTTP/HTTPS,BT 和 Metalink。 aria2 以其好用又难用而...

    一个Windows下载器,使用C++,基于Aria2c开发.zip

    标题中的“一个Windows下载器,使用C++,基于Aria2c开发”表明这是一个使用C++编程语言在Windows操作系统上构建的下载管理器程序。它利用了Aria2c库来实现高效的多线程、多源下载功能。Aria2c是一款轻量级的命令行...

    aria2gui,百度网盘下载不限制速度

    aria2 是一个轻量级、多协议且支持多源的下载工具,它可以同时从多个来源和协议下载文件,从而显著提高下载速度。而 aria2GUI 将这个强大的命令行工具包装成了用户友好的图形界面,使得非技术用户也能轻松操作。 在...

    aria2_web下载器

    2. **分块下载与断点续传**:`aria2`可以将大文件分割成多个部分同时下载,并且在下载过程中支持断点续传,即使下载中断,也能从上次中断的地方继续。 3. **限速与优先级设置**:用户可以根据网络状况设定下载速度...

    使用aria2c替代safari的下载

    2. **配置aria2c**:在aria2c的配置文件(通常为`aria2.conf`)中,可以设置全局参数,比如下载目录、最大速度限制等。同时,可以启用JSON-RPC接口,这将允许我们通过其他程序(如浏览器扩展)来控制aria2c。 3. **...

    Aria2.rar绿色软件

    它提供了一个直观的用户界面,用户可以通过浏览器来管理和监控Aria2的下载任务,包括添加新的下载链接、查看下载进度、暂停或恢复任务、设置下载选项等。这对于需要批量处理下载任务或者希望远程控制下载的用户来说...

    aria2-1.35.0-win-64bit-build1.zip

    1. **多源下载**:Aria2支持同时从多个源进行下载,这可以显著提高下载速度,尤其是在网络环境不稳定或资源有限的情况下。它可以从HTTP(S)、FTP、BitTorrent等协议下载文件。 2. **多线程下载**:Aria2允许在一个...

    aria2.zip -下载百度网盘

    综上所述,这个压缩包提供了一套完整的aria2下载工具,让用户可以更高效地从百度网盘下载大文件。用户需要阅读README.md了解如何配置和使用aria2,然后使用aria2c.exe或aria2.exe启动下载。aria2.conf的配置可以根据...

Global site tag (gtag.js) - Google Analytics