uTorrent 自动屏蔽迅雷脚本(uTorrent block xunlei/thunder)

2018-11-19 17:10:27 +08:00
 SHF

uTorrent 自动屏蔽迅雷脚本

GitHub: https://github.com/ShenHongFei/utorrent-block-xunlei

方法

  1. 根据 uTorrent 的 WebUI API 发送 http request 获取到所有种子的 peers 信息
  2. 按照 client name 筛选出使用迅雷的 peer IP,写入 ipfilter.dat 文件
  3. 发送 http request 让 uTorrent 重新加载 ipfilter.dat

屏蔽列表

-XL0012-***

Xunlei/***

7.x.x.x

Xfplay

效果

每隔一段时间,已连接用户中使用迅雷客户端的 IP 将会被封锁

脚本

utorrent=
    init: ->
        @root_url= 'http://127.0.0.1:10000/gui/'
        @cookies= request.jar()
        token_html = await request
            uri: @root_url + 'token.html'
            auth:
                user: 'admin'
                pass: 'xxxxxx'
            jar: @cookies
        $ = cheerio.load token_html
        @token = $('div').text()
        await @get_torrents()
        
    call: ({api='', params, method='GET'}={})->
        JSON.parse await request
            uri: @root_url + api
            method: method
            qs:{
                token: @token
                params...
            }
            auth:
                user: 'admin'
                pass: 'xxxxxx'
            jar: @cookies
    
    get_torrents: -> 
        @torrents = (await @call params: list: 1).torrents
        @hashes = @torrents.map (x)-> x[0]
        
    get_peers: (hash)->
        resp = await @call params:
            action: 'getpeers'
            hash: hash
        resp.peers
    
    get_all_peers: ->
        peers = []
        for hash in @hashes
            peers.append((await @get_peers hash)[1])
        for peer in peers
            ip: peer[1]
            client: peer[5]
        
    block_xunlei: ->
        peers = await @get_all_peers()
        blocks = peers.filter (x)-> x.client.match /(-XL0012-)|(Xunlei)|(^7\.)|(Xfplay)/i
        if blocks.isEmpty()
            log 'no xunlei clients detected'
            log peers
            return
        else
            log blocks
        ipfilter = new File 'C:/Users/shf/AppData/Roaming/uTorrent/ipfilter.dat'
        ipfilter.data += (x.ip for x in blocks).join('\n') + '\n'
        ipfilter.save()
        log 'ipfilter.dat updated'
        await @call params:
            action: 'setsetting'
            s: 'ipfilter.enable'
            v: '1'
        log 'ipfilter.dat reloaded'

    run: ->
        await @init()
        await @block_xunlei()
        @task = setInterval => 
            await @block_xunlei()
        , 3*60*1000

        
    stop: ->
        @task.clearInterval()

日志

未检测到迅雷时

no xunlei clients detected
当前已连接 peers
[ { ip: '180.94.154.163', client: 'µTorrent/3.5.4.0' },
  { ip: '223.140.248.38', client: 'BitComet 1.53' },
  { ip: '101.88.108.19', client: 'µTorrent/2.2.1.0' },
  { ip: '39.161.242.50', client: 'Unknown FD/5.1.0.0' },
  { ip: '171.88.70.72', client: 'Transmission 2.94' },
  { ip: '218.79.69.196', client: '[FAKE] µTorrent/3.0.0.0' },
  { ip: '123.204.251.13', client: 'BitComet 1.51' },
  { ip: '118.150.188.121', client: 'μTorrent 3.5.3' },
  { ip: '118.150.188.121', client: 'μTorrent 3.5.3' },
  { ip: '118.150.188.121', client: 'μTorrent 3.5.3' } ]
[ { ip: '222.164.100.163', client: '7.9.34.4908' } ]

检测到迅雷时

使用迅雷的 peers
[ { ip: '183.25.54.216', client: '-XL0012-溶 S 鑋亾#+4 厓' } ]
reading C:/Users/shf/AppData/Roaming/uTorrent/ipfilter.dat
wrote C:/Users/shf/AppData/Roaming/uTorrent/ipfilter.dat
ipfilter.dat updated
ipfilter.dat reloaded

uTorrent Log

[2018-11-19 16:50:25] Loaded ipfilter.dat (51 entries)

14545 次点击
所在节点    分享发现
38 条回复
imn1
2018-11-20 11:14:50 +08:00
这其实是个哲学话题
有两个圈子,BT 和 XL,XL 从 BT 获取资源,但没有反向分享
但不能说 XL 完全没有分享,XL 平台是有向 XL 圈子分享的,否则 BT 无源的老旧资源,XL 也下载不了
所以说,只是两个圈子打架的事

其实我自己也在做类似的行为,我从 BT 下载(限速上传),但却扔到 emule 里面上传(下载极少,上传带宽多两倍)
我这样做是因为 emule 可以一次挂着上千个文件,BT 做不到(或者说机器承受不了),但从 BT 用户角度,我这也是在吸血

这个事情看立场、角度如何吧

@SHF
我 qbt 长期 10+MB/s,不知道你为何会慢
Cu635
2018-11-20 16:21:10 +08:00
@imn1
胡扯哲学话题。
“ XL 平台是有向 XL 圈子分享的”这就叫吸血。
这就和这件事性质一样:你的朋友管你借钱,借钱完了该还的时候他有钱不还给你,同时他却向他的“朋友们”放贷——就算不收利息他也会赢得他朋友们的名声。如果说这件事你也是认为“不能说他完全没有名声,只是他是有向他那个圈子分享”的,再过来说“哲学话题”。
imn1
2018-11-20 17:08:40 +08:00
@Cu635
和你说的例子相似又不同,相似是生利,就是 XL 自定的规则盖过了 P2P 圈的共享精神
不同是 XL 也不能完全说无本,能存放更久的资源也需要付出,就看这个本和利是否对称合理了

如果 XL 完全封杀免费用户,那就没得说了
免费用户也是能下到一些久远的内容的,单从这点看,它免费分发的量是大于获取的量的,这点不能否认

如果朋友拿了我的钱,一半放贷,一半资助别人,赚了名声,我什么也没捞着,确实不爽
但如果我那些钱本来就打算资助别人,就要另外看了
到底是痛骂这个朋友,还是睁眼闭眼过去,各自衡量
BT 圈就能保证更多的人分享么?分给谁不是分呢?区别只是分多少,怎么分而已

10 年前问过别人一个问题:婊子捐的钱收不收?
问自己没用,问灾民
精神是否大于物质,理想是否高于现实,说的就是这个哲学问题

今年刚从 XL 退会了,观察后续情况如何吧,至少这个月还下了两个 bt 拖不动的上世纪的咚咚,只是慢点,挂了一周多
SHF
2018-11-20 18:10:01 +08:00
@imn1 解决这个问题最好方法是设计一个客户端同时支持这些协议,把所有的 BT, XL, emule 圈子合并在一起,这样整个圈子就扩大了,下载文件的时候从各个来源下载加快速度。
Cu635
2018-12-06 23:22:13 +08:00
@imn1
你搞差了,不是“ XL 完全封杀免费用户”的问题,而是说这些 bt 下载软件是有客户端标识的,软件会知道跟它连接的其它客户端是什么软件、版本号是多少,浏览器这个标识叫 user-agent,bt 我不清楚叫啥了,这样的话,XL 在技术是可以从所有类型的客户端下载( deluge、utorrent、其它 XL 等),但是只给 XL 的其它客户端上传,这个区分不是免费不免费用户的问题。然后因为迅雷下载快,用户们都选择使用迅雷,等着资源只有 XL 才有而其它的都没有的时候,再来一个免费用户限速之类的限制,这不就是垄断了么。
而且由于技术原因,存放的成本几乎可以忽略不计。

我特意强调“借钱完了该还的时候他有钱不还给你”,这个就是告诉你他故意赖的。

“如果朋友拿了我的钱,一半放贷,一半资助别人,赚了名声,我什么也没捞着,确实不爽”,我的那个例子还有这他当老赖的情节呢……
而他得名声,你却什么也没得着,还被人老赖连本金都没有拿回来,你说“问自己没用,问灾民”也对,那要是你这个时候家人(或者干脆就你自己)正要动手术需要医疗费救命呢?他仍然赖着,仍然拿着他老赖的钱去当“及时雨”呢?
Cu635
2018-12-06 23:23:10 +08:00
@SHF
那是迅雷故意吸血的,不是技术问题能解决的。
imn1
2018-12-07 01:42:29 +08:00
@Cu635
我没有搞差,我说的免费用户和你这里说的一样,只是他们是 XL 圈内的免费用户而已
如果 XL 所有用户都要付费(破解那些不计算),才是我前面说的「 XL 完全封杀免费用户」,但它没有这样做,就是说 XL 也是有免费分发的
一个现实状况是:XL 免费分发出去要比我个人多得多,所以我只把它视为一个渠道商而已

如果我的钱本就打算捐出去,例如通过 red cross,rc 收了 10%作为行政费,90%分给其他人
当我需要手术,估计就不存在捐出去这个打算了
而且,捐了给 rc 后的话,我要手术救命,难道还去向 rc 讨回来么?捐赠本来就不求回报的,只要不是骗钱给自己享乐,它获取部分利益(美其名「行政费」),我不介意

我 emule 没有屏蔽什么用户,只要对方是需要的,我不去计较他的本意是什么
P2P 没问题,P2B2P 我也觉得没问题,多了一层中转而已,如果 P2B2C,后面这个 2C 没有免费途径,我才会介意
如果哪天 XL 不给钱不让下,我也会屏蔽它的

其实说到底,我和你看法的区别是,你把 XL 的免费用户没有归入共享圈,我则无视他们头上的 XL 标签,也视为共享圈内有资源需求的人

@SHF
我 bt 下完跑,但挂 emule 就是这个原因,10~20TB 挂 bt 我的机器会死的,emule 就没问题
SHF
2018-12-08 12:35:51 +08:00
@imn1 所以说如果客户端能在遇到对方是迅雷用户的时候伪装成迅雷,这样就好了,从技术上说这个也不难实现啊,根据已有的开源的客户端修改一下逻辑挺简单的吧,不知道为什么没有人去开发这个。
Maskeney
2018-12-13 21:43:42 +08:00
@SHF #7 看来 aria2 无望屏蔽了 刚刚还在你的 repo 上提了个 issue sad
dt743
2018-12-14 09:16:18 +08:00
楼主这么一讲我也注意到了,qb 增强版屏蔽迅雷,同时会误杀。
我就说怎么同个种子,增强版的用户会大量减少
1265578519
2018-12-14 23:20:38 +08:00
烦死这群 utorrent 吸血鬼了,只下载不上传,特别是老外。
关于迅雷这方面,是完全遵守 BT 网络的,不会出现评论中说的什么只会上传给迅雷相同客户的问题,这种事情自己抓包测试就行,不用跟风造谣。
总结,还是看人,特别是老外,尼玛就是喜欢限速 1KB 上行。
1265578519
2018-12-14 23:25:23 +08:00
关于各大客户端的速度方面,感兴趣的话可以看看: http://bbs.itzmx.com/thread-88860-1-1.html
具体各位也可以仔细测试下,来探讨下,说实在的 utorrent 基本上没什么存在的必要了,,代码太屎了,要推倒格式化重新用 iocp 模型完全开发一遍才行,这样才能提高性能。
???发回复还要铜板?吓得我去充了 200 块才发成功这条回复
maogang39
2018-12-23 16:42:39 +08:00
几乎被 xl 给把上传都给霸占了,
还有两个 xl 在给我上传。2.0.4 可以使用这个吗?真小白还是看不明白怎么使用这个脚本。
[![捕获.JPG]( https://i.loli.net/2018/12/23/5c1f49c0884e4.jpg)]( https://i.loli.net/2018/12/23/5c1f49c0884e4.jpg)
fengyeso
2018-12-24 04:07:19 +08:00
撸了个 python 版的,应该可以跑起来。顺便感谢楼主造福人类
https://github.com/yefengo/utorrent-block-xunlei
SHF
2018-12-24 15:14:55 +08:00
@xxhjkl @maogang39

v1.0 正式发布:
1. 发布压缩包,解压修改配置后可直接运行。
2. 修改屏蔽逻辑
3. 减少 ipfilter.dat 文件的读写

下载及使用说明见 https://github.com/ShenHongFei/utorrent-block-xunlei
另有 Python 脚本的实现(见 #34 楼),感谢 @fengyeso
Suzutan
2019-02-14 20:52:06 +08:00
![无标题.png]( https://i.loli.net/2019/02/14/5c656423a7c64.png)

迅雷这个不算吸血算什么?
pedoer
2019-10-10 18:04:37 +08:00
请问怎么屏蔽 7.8.9.4550 这种无客户端标记的?
SHF
2019-10-11 03:57:38 +08:00
@pedoer 类似 7.x.x.xxxx 这样的客户端直接当做迅雷屏蔽

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/509327

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX