为了加快PT分享速度,自动督促Transmission获取更多Peers

为何要如此努力地增加PT分享率

学校内连接外网的代价还是挺大的,更不要说在线串流电影或是下载了。虽然我没有追剧的压力,看电影的偏好也比较单一,PT的压力不会很大,不过加入北邮人PT后,使用的是全新的账号,由于怕分享率太低被封禁账号,还是需要在下载资源后,利用电脑的空闲资源,在电影看完被删掉前借此增加一点分享率。

理想情况是,电影下好后在观看过程中进行分享,如果一直有较好的上传速度的话,很快就可以流量回本了,无奈几次实验下来,几乎没有分享多少流量,导致分享率已经跌倒了0.1。

大概有这几点原因导致了我分享率很低:

  • 有些我想看的资源已经是冷门资源
  • 我的网络环境太差,其他人从我这获取资源的速度太慢,导致我只能分享他下载流量的很小比例
  • 我一般看完就删,分享时间非常有限
  • PT内网环境中,大家的下载速度都很快,并且有很多人分享,别人在不知道我这里有资源的情况下就已经下载完成了

其中冷门资源想看只能使用其他资源的上传来补了;从我的下载速度可以稳定在10MB/s看来,网络环境不是瓶颈;我并不想囤积电影,看完就删的习惯不准备改变,也不准备话很长时间挂机分享;看来,针对免费的热门资源,如何提高自己的分享效率成为了比较好的方案。

Transmission

Transmission是Linux上很不错的BT下载器,PT资源也支持,它还支持一个Web客户端,Web客户端使用Http与Transmission服务部通信,这就为我们自动话督促分享量提供了机会。

细看Transmission的一个任务,发现其中Peers通常是由Tracker来提供的,但这里显示Transmission每半个小时才会去询问一次有没有更多Peers,这边就带来了可能很多Peers需要下载我分享的资源时候,我并不知道这一情况,错失了很多上传机会。

Transmission

人工通过在任务上右键>Ask Tracker For More Peers刷了几分钟后,发现上传速度能维持在一个不错的水平了。

解决方案

其实就通过查看Web客户端是如何请求Transmission服务器,每隔一段时间强制刷新Peers列表就可以了。

获取Web客户端与Transmission的通信规范

首先通过Transmission>Preferences>Remote>Allow Remote Access打开Web客户端。

Webclient

然后通过Chrome Dev Tools审查Web客户端和服务器的请求。

ChromeDevTools

分析请求发现torrent-get获取任务ID和详情信息,torrent-reannounce向Tracker发出刷新Peers列表的请求。

通过Copy as cURL直接复制Chrome发出的请求,方便进行实验。

通过脚本自动化刷新Peers列表的过程

最终整理Shell脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while true; do

# 获取Transmission的Session ID,不然后续请求无效
TSID=`curl -sI 'http://localhost:9091/transmission/rpc' |grep -Fi "X-Transmission-Session-Id" | tr -d '\r'`
echo $TSID

# 获取当前任务的ID列表,通过jq工具解析Json
TDATA=`curl -s 'http://localhost:9091/transmission/rpc' -H 'Origin: http://localhost:9091' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H "$TSID" -H 'Content-Type: json' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://localhost:9091/transmission/web/' -H 'X-Requested-With: XMLHttpRequest' -H 'DNT: 1' --data-binary '{"method":"torrent-get","arguments":{"fields":["id"],"ids":"recently-active"}}' --compressed | jq -c '{"method":"torrent-reannounce","arguments":{ids: [.arguments.torrents[].id]}}' | tr -d '\r'`
echo $TDATA

# 发出刷新Peers列表的请求
curl 'http://localhost:9091/transmission/rpc' -H 'Origin: http://localhost:9091' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4' -H "$TSID" -H 'Content-Type: json' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Referer: http://localhost:9091/transmission/web/' -H 'X-Requested-With: XMLHttpRequest' -H 'DNT: 1' --data-binary "$TDATA" --compressed

# 每隔一分钟刷新一次
sleep 60
done

其中有一个坑在将一个命令的输出存入Shell变量时候,有时末尾会有’\r’这个字符,但echo这个变量又和不带’\r’的字符串看不出区别。如果不通过tr -d '\r'删除的话,curl发出的请求就不能被正常相应。