├── README.md ├── task.php ├── runTask.py └── XunLeiDownloader.py /README.md: -------------------------------------------------------------------------------- 1 | 2 | 借助win32接口,使用迅雷下载 3 | 4 | 该脚本依赖pywin32,需要保证已经执行了 `pip install pywin32`,我目前是 Python 2.7 的环境。 5 | 6 | 存在一个迅雷BUG,一定要在迅雷已经启动的情况下执行本脚本,如果是从本脚本启动迅雷那么第一个下载会报连接超时而下载失败。 7 | 8 | ``` 9 | xld = XunLeiDownloader() 10 | 11 | xld.startDownload("http://cdn2.ime.sogou.com/6d5e6e18998276c3bff1bc6b69da3ee6/5bb4638d/dl/index/1535443172/sogou_pinyin_91a.exe") 12 | ``` 13 | 14 | 15 | -------------------------------------------------------------------------------- /task.php: -------------------------------------------------------------------------------- 1 | 25 | 26 | 27 | 28 | EOF; 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /runTask.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -* 3 | 4 | 5 | from XunLeiDownloader import XunLeiDownloader; 6 | import urllib2 7 | import time 8 | import sys 9 | 10 | # 解决中文转码 11 | reload(sys) 12 | sys.setdefaultencoding( "utf-8" ) 13 | 14 | 15 | url = "http:/:/task.php?type=fetch_task" 16 | while True: 17 | req = urllib2.Request(url) 18 | if (req): 19 | try: 20 | res_data = urllib2.urlopen(req) 21 | task = res_data.read() 22 | if (task): 23 | print task 24 | xld = XunLeiDownloader() 25 | xld.startDownload(task) 26 | xld = None 27 | 28 | except: 29 | pass 30 | time.sleep(5) 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /XunLeiDownloader.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -* 3 | 4 | # 该脚本依赖pywin32,需要保证已经执行了 `pip install pywin32` 5 | 6 | # 存在一个迅雷BUG,一定要在迅雷已经启动的情况下执行本脚本, 7 | # 如果是从本脚本启动迅雷那么第一个下载会报连接超时而下载失败 8 | 9 | import win32gui 10 | import win32api 11 | import win32con 12 | import win32clipboard 13 | from ctypes import * 14 | 15 | import os 16 | import time 17 | import sys 18 | 19 | # 解决中文转码 20 | reload(sys) 21 | sys.setdefaultencoding( "utf-8" ) 22 | 23 | 24 | 25 | class XunLeiDownloader: 26 | xunleiExePath = "" 27 | 28 | def __init__(self, xunleiExePath = r"C:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe"): 29 | self.xunleiExePath = xunleiExePath 30 | 31 | def ctrlV(self): 32 | win32api.keybd_event(win32con.VK_CONTROL, 0,0,0) 33 | time.sleep(0.1) 34 | win32api.keybd_event(ord('V'), 0,0,0) 35 | time.sleep(0.1) 36 | win32api.keybd_event(ord('V'), 0,win32con.KEYEVENTF_KEYUP,0) 37 | time.sleep(0.1) 38 | win32api.keybd_event(win32con.VK_CONTROL, 0,win32con.KEYEVENTF_KEYUP,0) 39 | 40 | def leftMouseClick(self, posX, posY): 41 | win32api.SetCursorPos([posX, posY]) 42 | win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0,0,0) 43 | time.sleep(0.2) 44 | win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0,0,0) 45 | time.sleep(0.1) 46 | 47 | 48 | def startDownload(self, downloadUrls): 49 | gdi32 = windll.gdi32 50 | user32 = windll.user32 51 | hdc = user32.GetDC(None) 52 | 53 | win32clipboard.OpenClipboard() 54 | win32clipboard.EmptyClipboard() 55 | win32clipboard.SetClipboardData(win32con.CF_TEXT, "") 56 | win32clipboard.CloseClipboard() 57 | 58 | os.startfile(self.xunleiExePath) 59 | wndMain = None 60 | while not wndMain: 61 | time.sleep(1) 62 | wndMain = win32gui.FindWindow(None, u"迅雷") 63 | wndMainRect = win32gui.GetWindowRect(wndMain) 64 | self.leftMouseClick(wndMainRect[0]+35, wndMainRect[1]+100) 65 | time.sleep(0.1) 66 | win32clipboard.OpenClipboard() 67 | win32clipboard.EmptyClipboard() 68 | win32clipboard.SetClipboardData(win32con.CF_TEXT, downloadUrls.decode('utf-8').encode('gbk')) 69 | win32clipboard.CloseClipboard() 70 | 71 | wndCreateDownload = win32gui.FindWindow(None, u"新建下载") 72 | 73 | if wndCreateDownload: 74 | wndCreateDownloadRect = win32gui.GetWindowRect(wndCreateDownload) 75 | self.leftMouseClick(wndCreateDownloadRect[0]+60, wndCreateDownloadRect[1]+70) 76 | self.ctrlV() 77 | self.leftMouseClick(wndCreateDownloadRect[0]+10, wndCreateDownloadRect[1]+10) 78 | 79 | time.sleep(0.5) 80 | c = gdi32.GetPixel(hdc,wndCreateDownloadRect[0] + 150,wndCreateDownloadRect[1]+ 215) 81 | chex = hex(c) 82 | print chex 83 | win32api.SetCursorPos([wndCreateDownloadRect[0] + 150,wndCreateDownloadRect[1]+ 215]) 84 | 85 | if ((chex == "0xfefefe") or (chex == "0xffffff")): 86 | # 开始下载 87 | self.leftMouseClick(wndCreateDownloadRect[2]-150, wndCreateDownloadRect[3]-250) 88 | else: 89 | # 无效链接地址取消下载 90 | self.leftMouseClick(wndCreateDownloadRect[2]-30, wndCreateDownloadRect[1]+15) 91 | 92 | 93 | print "关闭[新建下载]\r\n" 94 | alreadyExistDlg = win32gui.FindWindowEx(None,None,'XLUEModalHostWnd',"MessageBox") 95 | if alreadyExistDlg: 96 | alreadyExistDlgRect = win32gui.GetWindowRect(alreadyExistDlg) 97 | self.leftMouseClick(alreadyExistDlgRect[0]+390, alreadyExistDlgRect[1]+35) 98 | # win32gui.SendMessage(wndCreateDownload, win32con.WM_CLOSE) 这么关闭迅雷自己撸的非标准GUI框架窗体会有BUG 99 | else: 100 | print "[新建下载]不存在\r\n" 101 | --------------------------------------------------------------------------------