python调用迅雷批量下载bt并自动后台点击窗口。

发布于 12 天前  43 次阅读


看动漫少不了bt,之前一直是用rssowl的rss订阅批量下载bt种子,然后一起拉进迅雷下载。bt文件少还无所谓,当文件有几十上百个的时候简直噩梦,要不停点击 ‘立即下载’(一键下载功能对bt无效)。

然现在既然开始用python下载bt种子了,那么迅雷也是时候跟上脚步了。

简介:

首先先大概说一下思路再贴代码:

  • 1 打开迅雷 (这步其实可以省略,添加迅雷任务就会自动启动迅雷,但保险起见...)
  • 2 获取bt文件的全部路径。
  • 3 把bt文件转换为磁力链接(目前还没发现如何直接添加bt文件的任务,只学会了用磁力链接添加任务)
  • 4 for循环添加磁力链接任务到迅雷
  • 5 后台窗口句柄识别迅雷的''新建下载任务''窗口并后台点击’‘立即下载‘’ (后台点击需要通过管理员权限运行!
  • 6 删除种子文件(为防止未知错误导致种子文件找不回了,我选择print了所有磁力链接)

完整py文件代码:

import os
import time
from win32com.client import Dispatch
import bencode
import hashlib
from urllib.parse import quote
import win32gui, win32ui, win32con, win32api
xunleipath = r'D:\soft\Thunder\Program\Thunder.exe'  #迅雷路径,用于打开迅雷
pa = r'D:\desktop\bt'  #bt种子文件夹路径
os.startfile(xunleipath)
time.sleep(3)
#获取文件夹全部文件完整路径
def dirlist(path):
        allfile = []
        filelist = os.listdir(path)

        for filename in filelist:
                filepath = os.path.join(path, filename)
                if os.path.isdir(filepath):
                        dirlist(filepath, allfile)
                else:
                        allfile.append(filepath)
        return allfile
ppp = dirlist(pa)

#转换bt为磁力链接
def torrent_file_to_magnet(torrent_file):
        data = open(torrent_file, 'rb').read()
        metadata = bencode.bdecode(data)
        name = metadata['info']['name']
        dn = quote(name)
        info_bts = bencode.bencode(metadata['info'])
        info_hash = hashlib.sha1(info_bts).hexdigest()
        return f'magnet:?xt=urn:btih:{info_hash}&dn={dn}'

#添加迅雷任务
thunder = Dispatch('ThunderAgent.Agent64.1')
for i in ppp:
        try:
                ii = torrent_file_to_magnet(i)
                thunder.AddTask(ii)
                thunder.CommitTasks()
                time.sleep(2)
                print(ii)
                os.remove(i) #删除种子文件
        except:
                pass
def doClick(cx, cy):
    long_position = win32api.MAKELONG(cx, cy)  # 模拟鼠标指针 传送到指定坐标
    win32api.SendMessage(child, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position)  # 模拟鼠标按下
    win32api.SendMessage(child, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position)  # 模拟鼠标弹起

while True:
        hWnd = win32gui.FindWindow(None, "新建任务面板")  # 窗口的类名可以用Visual Studio的SPY++工具获取
        child = win32gui.FindWindowEx(hWnd, None, "Chrome_RenderWidgetHostHWND", None)
        print(hWnd)
        if hWnd == 0 :
                break
        else:
                doClick(158,561) #点击立即下载,根据bt种子文件多少窗口大小有2种,依次点击
                doClick(230, 456)
                time.sleep(1)

print('共:',len(ppp))
print('当前文件夹内容:',dirlist(pa))

需要安装的模块:

pip install bencode.py
pip install pywin32

个人环境:

python3.10

win10 x64

迅雷11.1.12.1692去广告SVIP绿色精简最终版

顺便附上这个版本迅雷下载地址吧:

迅雷11.1.12.1692去广告SVIP绿色精简最终版下载

关于代码有什么问题可以随时留言,有什么更好的方案也请多多指教!