半肾
精华
|
战斗力 鹅
|
回帖 0
注册时间 2019-8-30
|
本帖最后由 冰箱研会长 于 2020-7-18 15:49 编辑
其实最初的版本在闭坛的那一天就写完了, 闭坛期间把ARM机的shell换成了Powershell, 顺带着用powershell写了个更完善的版本放到了Github上.
可能有人看我在其他地方发过, 然而我发现在那些地方根本百度不到! 所以我就一直等待着S1重开的这一天, 想着一定要在PC区重新发一遍, 让有需求的人能比较容易的找到.
这个脚本的起因是下载VCB的高达Origin的时候, 列表里一堆迅雷, 我一个个手动的加到屏蔽列表里面, 同时百度的时候看到qbit有人写了利用webapi的脚本,
我就想也许可以利用Transmission的api来实现同样的事情.
一番搜索之后, 我发现Transmission有利用RPC接口的官方轮子transmission-remote, 这下就可以在shell里实现屏蔽列表的实时增补了.
- #!/bin/zsh
- Username=aaaaaaaaaaaaaa
- #transmission webgui的用户名
- Password=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- #transmission webgui的密码
- ClientList=(Xunlei Thunder "\-DL3760\-" "\-XL0012\-" "\-UW110Q\-" "\-FD51\]\%C7\-" "\-LrD250\-")
- #这里指定要修改的客户端列表, 每个客户端用空格分隔
- ListAddress="/var/www/html/blocklist.txt"
- #这里写你的list的储存位置
- for CertainClient ($ClientList){
- transmission-remote --auth $Username:$Password -t all -ip |grep $CertainClient |awk '{print $1}' | xargs -L1 -I {ip} echo "{ip}" >> "templist.txt"
- }
- Temp=("${(@f)$(< templist.txt)}")
- for EachIp in $Temp
- do
- if [ $(grep -c $EachIp $ListAddress) -gt 0 ]
- then
- echo "$EachIp exists, not adding"
- else
- echo "$EachIp didn't exist, adding"
- echo "$EachIp - $EachIp , 0 , Autogen" >> $ListAddress
- fi
- done
- echo "updating blocklist..."
- transmission-remote --auth $Username:$Password --blocklist-update
- #transmission-remote --auth $Username:$Password -t all --reannounce
- #sleep 2s
- #echo "stoping all current torrents..."
- transmission-remote --auth $Username:$Password -t all --stop
- sleep 2s
- #echo "starting all current torrents..."
- transmission-remote --auth $Username:$Password -t all --start
- rm "templist.txt"
复制代码
这个是ZSH版本的, 我得承认我学习ZSH的时间一共不到4个小时, 结果就是这一坨大屎, 用了一堆字符串处理的外部命令, 奇妙的中间缓存文件, 总之就是非常不优雅.
编写体验极差, 在这里发上来的另一个原因也是希望有好心人教教我, 我实在不忍心看到口耳相传的ZSH被我用成这个德性.
- <# function TBTblocklist(){
- #This function use ConvertFrom-SourceTable script!!!
- [string]$Username = "aaaaaaaaa";
- [string]$Password="aaaaaaaaaaaaa";
- [string]$ListAddress="/var/www/html/blocklist.txt";
- [string[]]$ClientList=@('Xunlei','Thunder','-XL0012-','-DL3760-');
- [bool]$ClientNoticed=0;
- $CurrentPeers=transmission-remote --auth "$($Username):$($Password)" -t all -ip;
- $CurrentPeers = $CurrentPeers.Trim() -replace '\s{2,}',',' | ConvertFrom-Csv;
- $CurrentPeers = $CurrentPeers | Where-Object {[string]$_.Address -ne "Address"};
- $CurrentPeers | ForEach-Object{
- if( ($ClientList -contains $_.Client.split(' ')[0]) -And !(Select-String -Path $ListAddress -Pattern "$($_.Address) -SimpleMatch -Quiet") ){
- Write-Output "$($_.Address.ToString()) - $($_.Address.ToString()),0,$($_.Client.ToString())" >> $ListAddress;
- Write-Output "$($_.Address.ToString()) with $($_.Client.ToString()) Client detected, adding";
- $ClientNoticed=1;
- }
- }
- transmission-remote --auth "$($Username):$($Password)" --blocklist-update;
- Write-Output "Blocklist Updated!";
- $CurrentTorrents=transmission-remote --auth "$($Username):$($Password)" -t all -l| Select-Object -SkipLast 1 ;
- $CurrentTorrents= $CurrentTorrents.Trim() -replace '\s{2,}',',' | ConvertFrom-Csv;
- $CurrentTorrents | ForEach-Object {
- if( ($_.Status.ToString().Contains("Seeding")) -And ($ClientNoticed) ){
- transmission-remote --auth "$($Username):$($Password)" -t $($_.ID) -S;
- Write-Output "Torrent $($_.ID) stopped!";
- Start-Sleep -s 2;
- transmission-remote --auth "$($Username):$($Password)" -t $($_.ID) -s;
- Write-Output "Torrent $($_.ID) started!"
- }
- }
- }
- 这个是旧版本 不推荐#>
- function TBTblocklist(){
- #This function use ConvertFrom-SourceTable script!!!
- [string]$Username = "aaaaaaaaaaaa";
- [string]$Password="aaaaaaaaaaaaaaaaaa";
- [string]$ListAddress="/var/www/html/blocklist.txt";
- [string[]]$ClientList=@('Xunlei','Thunder','-XL0012-','-DL3760-');
- $CurrentTorrents=transmission-remote --auth "$($Username):$($Password)" -t all -l| Select-Object -SkipLast 1 ;
- $CurrentTorrents= $CurrentTorrents.Trim() -replace '\s{2,}',',' | ConvertFrom-Csv;
- $CurrentTorrents | ForEach-Object {
- [bool]$ClientNoticed=0;
- $CurrentPeers=transmission-remote --auth "$($Username):$($Password)" -t $($_.ID) -ip;
- $CurrentPeers = $CurrentPeers.Trim() -replace '\s{2,}',',' | ConvertFrom-Csv;
- $CurrentPeers = $CurrentPeers | Where-Object {[string]$_.Address -ne "Address"};
- $CurrentPeers | ForEach-Object{
- if( ($ClientList -contains $_.Client.split(' ')[0]) -And !(Select-String -Path $ListAddress -Pattern "$($_.Address) -SimpleMatch -Quiet") ){
- Write-Output $_.Client
- Write-Output "$($_.Address.ToString()) - $($_.Address.ToString()),0,$($_.Client.ToString())" >> $ListAddress;
- Write-Output "$($_.Address.ToString()) with $($_.Client.ToString()) Client detected, adding";
- $ClientNoticed=1;
- }
- }
- transmission-remote --auth "$($Username):$($Password)" --blocklist-update;
- Write-Output "Blocklist Updated For Torrent $($_.ID)";
- if( ($_.Status.ToString().Contains("Seeding")) -And ($ClientNoticed) ){
- transmission-remote --auth "$($Username):$($Password)" -t $($_.ID) -S;
- Write-Output "Torrent $($_.ID) stopped!";
- Start-Sleep -s 2;
- transmission-remote --auth "$($Username):$($Password)" -t $($_.ID) -s;
- Write-Output "Torrent $($_.ID) started!"
- }
- }
- }
复制代码
这个是写成方程形式的Powershell版本, 实操是在Jetson Nano上, 版本是 Linux ARM64 7.0.3.
吐槽这个arm版本, 目录下面一堆dll, 解释器启动需要1s!
脚本的原理很简单, 本质上就是利用Powershell的特性, 先把plaintxt的外部输出里的分隔符(这里两个以上的空格都被我当成是分隔符了)换成逗号,
然后用CSV的方式将输出转化为PsObject的数组, 之后就是遍历数组, 该屏蔽的屏蔽, 该重启的重启,
因为我个人一般做种2.0之后就不做了, 后面还加了一个判断任务是否人为暂停的部分, 这样手动暂停的任务就不会被重开了.
ZSH的版本没有这个判断, 因为我写不出来.
原来这个to psobject的转换用的是iRon7大佬的ConvertFrom-SourceTable, 可惜种子任务右对齐的ID没法被正确的转换, 我就用了比较笨的CSV方法.
用这个脚本需要机器上安装一个web服务器, 脚本里的ListAddress就是只想服务器在本机的绝对目录的, 同时这个文件的url要写在Transmission的黑名单地址里.
脚本会自动让Transmission更新屏蔽列表, 同时重启符合条件的任务.
我直接用crontab定时了这个脚本, 基本上5min启停一次.
基本就是这样, 如果用的是Powershell版本的话, 你可以在屏蔽列表里面看到每一个ip用的都是什么客户端, zsh因为我不会写所以都是Autogen > <.
|
|