├── 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 |
--------------------------------------------------------------------------------