├── .gitignore ├── APIs.py ├── QSSwhite.py ├── README.md ├── ToolFuncs.py ├── ToolUI.py ├── ToolUI.ui ├── White ├── 201752212221.png ├── 2017522122216.png ├── 2017522122222.png ├── arrowBottom.png ├── arrowLeft.png ├── arrowRight.png ├── arrowTop.png ├── b721a1c9956b6e836cbdb6c57691ef09.png ├── bottomArrow.png ├── bottomArrowHover.png ├── checkBox.png ├── checkBoxChecked.png ├── checkBoxCheckedHover.png ├── checkBoxCheckedPressed.png ├── checkBoxHover.png ├── checkBoxIndeterminate.png ├── checkBoxIndeterminateHover.png ├── checkBoxIndeterminatePressed.png ├── checkBoxPressed.png ├── close.png ├── closeHover.png ├── closePressed.png ├── delete.png ├── deleteHover.png ├── deletePressed.png ├── downButton.png ├── e52d9567c015cdb440344305380739e7.png ├── error.png ├── feedback.png ├── feedbackHover.png ├── feedbackPressed.png ├── information.png ├── left.png ├── maximize.png ├── maximizeHover.png ├── maximizePressed.png ├── minimize.png ├── minimizeHover.png ├── minimizePressed.png ├── nscc.png ├── ooopic_1484987787.ico ├── ooopic_1484987787.png ├── ooopic_1495455270.png ├── open.png ├── openHover.png ├── openPressed.png ├── progressBar.png ├── progressBarChunk.png ├── question.png ├── radioButton.png ├── radioButtonChecked.png ├── radioButtonCheckedHover.png ├── radioButtonCheckedPressed.png ├── radioButtonHover.png ├── radioButtonPressed.png ├── restore.png ├── restoreHover.png ├── restorePressed.png ├── right.png ├── scan.png ├── skin.png ├── skinHover.png ├── skinPressed.png ├── success.png ├── topArrow.png ├── topArrowHover.png ├── transfer.png ├── upButton.png └── warning.png ├── doc ├── 000.gif ├── 001.gif ├── 001.png ├── 002.png └── 003.png ├── dsr_ids.txt ├── img_links.txt └── link_ids.txt /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | *.csv 3 | *.exe 4 | *.json 5 | 6 | -------------------------------------------------------------------------------- /APIs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import requests 4 | import json 5 | import re 6 | from bs4 import BeautifulSoup as bs 7 | 8 | 9 | class Spiders(object): 10 | def __init__(self): 11 | self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' 12 | ' (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 13 | self.headers_m = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 ' 14 | '(KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'} 15 | 16 | 17 | # 形成富文本,参数是文本内容和字体颜色 18 | def getmsg(self,themsg,thecolor): 19 | msg = '

{}

'.format(thecolor,themsg) 20 | return msg 21 | 22 | # 从文件读取信息,返回一个列表 23 | def get_Infos(self, filename): 24 | Infos = [] 25 | with open(filename, 'r') as f: 26 | data = f.readlines() 27 | for each in data: 28 | if len(each.strip()) > 0: 29 | Infos.append(each.strip()) 30 | return Infos 31 | 32 | # 获取单个天猫商品DSR 33 | def get_TM(self, id, outfile): 34 | url = 'https://dsr-rate.tmall.com/list_dsr_info.htm?itemId=%s' % id 35 | res = requests.get(url, headers=self.headers) 36 | html = res.text 37 | date = re.findall('json.*?\((.*)\)', html)[0] 38 | dsr = json.loads(date)['dsr'] # 转换成字典格式 39 | DSR = id + ',' + str(dsr['gradeAvg']).strip() + ',' + str(dsr['rateTotal']).strip() 40 | with open(outfile, 'a') as f: 41 | f.write(DSR + '\n') 42 | return 43 | 44 | # 获取单个京东商品DSR 45 | def get_JD(self, id, outfile): 46 | url = 'https://club.jd.com/comment/productCommentSummaries.action?referenceIds=%s' % id 47 | res = requests.get(url, headers=self.headers) 48 | html = res.text 49 | dic = json.loads(html)['CommentsCount'][0] 50 | SkuId = str(dic['SkuId']).strip() # 商品ID 51 | GoodRate = str(dic['GoodRate']).strip() # 好评率 52 | GoodCount = str(dic['GoodCount']).strip() # 好评数 53 | GeneralCount = str(dic['GeneralCount']).strip() # 中评数 54 | PoorCount = str(dic['PoorCount']).strip() # 差评数 55 | DSR = SkuId + ',' + GoodRate + ',' + GoodCount + ',' + GeneralCount + ',' + PoorCount 56 | with open(outfile, 'a') as f: 57 | f.write(DSR + '\n') 58 | return 59 | 60 | # 获取天猫主图链接和价格 61 | def getimglink(self, ID, outfile): 62 | # 打开手机端网页 63 | url = "https://detail.m.tmall.com/item.htm?id={}".format(ID) 64 | html = requests.get(url, headers=self.headers_m).text 65 | try: 66 | soup = bs(html, "lxml") 67 | imglink = "https:" + soup.select("div.itbox > a > img")[0].get("src") 68 | except: 69 | imglink = "miss" 70 | infos = re.findall('"price":"(\d+?\.\d\d)"', html) 71 | try: 72 | maxprice = max(list(map(float, infos))) 73 | minprice = min(list(map(float, infos))) 74 | except ValueError: 75 | maxprice = max(infos) 76 | minprice = min(infos) 77 | except: 78 | maxprice = "miss" 79 | minprice = "miss" 80 | thestr = ",".join([str(ID), imglink, str(maxprice), str(minprice)]) 81 | with open(outfile, "a") as f: 82 | f.write(thestr + "\n") 83 | 84 | # 下载图片 85 | def downimg(self, savefile, savename, url): 86 | item = requests.get(url, headers=self.headers).content 87 | Imgname = savefile + '\\' + savename + '.jpg' 88 | with open(Imgname, 'wb') as f: 89 | f.write(item) 90 | return -------------------------------------------------------------------------------- /QSSwhite.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | class QSS(): 4 | def __init__(self): 5 | self.White = '''/**********主界面样式**********/ 6 | QWidget#MainWindow { 7 | font-family:Microsoft YaHei; 8 | font-size:13px; 9 | border: 0px solid rgb(111, 156, 207); 10 | background: rgb(232, 241, 252); 11 | } 12 | QWidget#messageWidget { 13 | background: rgba(173, 202, 232, 50%); 14 | } 15 | /**********菜单栏**********/ 16 | QMenuBar { 17 | font-size:13px; 18 | background: rgb(187, 212, 238); 19 | border: 1px solid rgb(111, 156, 207); 20 | border-left: none; 21 | border-right: none; 22 | } 23 | QMenuBar::item { 24 | font-size:13px; 25 | font-family:Microsoft YaHei; 26 | border: 0px solid transparent; 27 | padding: 5px 10px 5px 10px; 28 | background: transparent; 29 | } 30 | QMenuBar::item:enabled { 31 | font-size:13px; 32 | color: rgb(2, 65, 132); 33 | } 34 | QMenuBar::item:!enabled { 35 | color: rgb(155, 155, 155); 36 | } 37 | QMenuBar::item:enabled:selected { 38 | border-top-color: rgb(111, 156, 207); 39 | border-bottom-color: rgb(111, 156, 207); 40 | background: rgb(198, 224, 252); 41 | } 42 | /**********菜单**********/ 43 | QMenu { 44 | font-size:13px; 45 | font-family:Microsoft YaHei; 46 | border: 1px solid rgb(111, 156, 207); 47 | background: rgb(232, 241, 250); 48 | } 49 | QMenu::item { 50 | font-family:Microsoft YaHei; 51 | height: 18px; 52 | padding: 5px 25px 5px 20px; 53 | padding-left: 30px; 54 | padding-right: 12px; 55 | } 56 | QMenu::item:enabled { 57 | color: rgb(84, 84, 84); 58 | } 59 | QMenu::item:!enabled { 60 | color: rgb(155, 155, 155); 61 | } 62 | QMenu::item:enabled:selected { 63 | color: rgb(2, 65, 132); 64 | background: rgba(255, 255, 255, 200); 65 | } 66 | QMenu::separator { 67 | height: 1px; 68 | background: rgb(111, 156, 207); 69 | } 70 | QMenu::indicator { 71 | width: 13px; 72 | height: 13px; 73 | } 74 | QMenu::icon { 75 | padding-left: 12px; 76 | padding-right: 0px; 77 | } 78 | 79 | /**********状态栏**********/ 80 | QStatusBar { 81 | font-size:13px; 82 | font-family:Microsoft YaHei; 83 | background: rgb(187, 212, 238); 84 | border: 1px solid rgb(111, 156, 207); 85 | border-left: none; 86 | border-right: none; 87 | border-bottom: none; 88 | } 89 | QStatusBar::item { 90 | font-family:Microsoft YaHei; 91 | border: none; 92 | border-right: 1px solid rgb(111, 156, 207); 93 | } 94 | /**********分组框**********/ 95 | QGroupBox { 96 | font-size:13px; 97 | font-family:Microsoft YaHei; 98 | border: 1px solid rgb(111, 156, 207); 99 | border-radius: 4px; 100 | margin-top: 10px; 101 | } 102 | QGroupBox::title { 103 | font-family:Microsoft YaHei; 104 | color: rgb(56, 99, 154); 105 | top: -10px; 106 | left: 10px; 107 | } 108 | /**********滚动条-垂直**********/ 109 | QScrollBar:vertical { 110 | width: 20px; 111 | background: transparent; 112 | margin-left: 3px; 113 | margin-right: 3px; 114 | } 115 | QScrollBar::handle:vertical { 116 | width: 20px; 117 | min-height: 30px; 118 | background: rgb(170, 200, 230); 119 | margin-top: 15px; 120 | margin-bottom: 15px; 121 | } 122 | QScrollBar::handle:vertical:hover { 123 | background: rgb(165, 195, 225); 124 | } 125 | QScrollBar::sub-line:vertical { 126 | height: 15px; 127 | background: transparent; 128 | image: url("White/topArrow.png"); 129 | subcontrol-position: top; 130 | } 131 | QScrollBar::add-line:vertical { 132 | height: 15px; 133 | background: transparent; 134 | image: url("White/bottomArrow.png"); 135 | subcontrol-position: bottom; 136 | } 137 | QScrollBar::sub-line:vertical:hover { 138 | background: rgb(170, 200, 230); 139 | } 140 | QScrollBar::add-line:vertical:hover { 141 | background: rgb(170, 200, 230); 142 | } 143 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 144 | background: transparent; 145 | } 146 | 147 | QScrollBar#verticalScrollBar:vertical { 148 | margin-top: 30px; 149 | } 150 | /**********页签项**********/ 151 | QTabWidget::pane { 152 | font-family:Microsoft YaHei; 153 | border: none; 154 | border-top: 3px solid rgb(0, 78, 161); 155 | background: rgb(187, 212, 238); 156 | } 157 | QTabWidget::tab-bar { 158 | border: none; 159 | } 160 | QTabBar::tab { 161 | font-family:Microsoft YaHei; 162 | border: none; 163 | border-top-left-radius: 4px; 164 | border-top-right-radius: 4px; 165 | color: white; 166 | background: rgb(120, 170, 220); 167 | height: 28px; 168 | min-width: 85px; 169 | margin-right: 5px; 170 | padding-left: 5px; 171 | padding-right: 5px; 172 | } 173 | QTabBar::tab:hover { 174 | background: rgb(0, 78, 161); 175 | } 176 | QTabBar::tab:selected { 177 | color: white; 178 | background: rgb(0, 78, 161); 179 | } 180 | 181 | QTabWidget#tabWidget::pane { 182 | border: 1px solid rgb(111, 156, 207); 183 | background: rgb(232, 241, 252); 184 | margin-top: -1px; 185 | } 186 | 187 | QTabBar#tabBar::tab { 188 | border: 1px solid rgb(111, 156, 207); 189 | border-bottom: none; 190 | color: rgb(70, 71, 73); 191 | background: transparent; 192 | } 193 | QTabBar#tabBar::tab:hover { 194 | color: rgb(2, 65, 132); 195 | } 196 | QTabBar#tabBar::tab:selected { 197 | color: rgb(2, 65, 132); 198 | background: rgb(232, 241, 252); 199 | } 200 | /**********进度条**********/ 201 | QProgressBar { 202 | border: none; 203 | text-align: center; 204 | color: white; 205 | background-color: transparent; 206 | background-image: url("White/progressBar.png"); 207 | background-repeat: repeat-x; 208 | } 209 | QProgressBar::chunk { 210 | border: none; 211 | background-color: transparent; 212 | background-image: url("White/progressBarChunk.png"); 213 | background-repeat: repeat-x; 214 | } 215 | /**********单选框**********/ 216 | QRadioButton{ 217 | font-size:13px; 218 | spacing: 5px; 219 | } 220 | QRadioButton:enabled:checked{ 221 | color: rgb(2, 65, 132); 222 | } 223 | QRadioButton:enabled:!checked{ 224 | color: rgb(70, 71, 73); 225 | } 226 | QRadioButton:enabled:hover{ 227 | color: rgb(0, 78, 161); 228 | } 229 | QRadioButton:!enabled{ 230 | color: rgb(80, 80, 80); 231 | } 232 | QRadioButton::indicator { 233 | width: 20px; 234 | height: 20px; 235 | } 236 | QRadioButton::indicator:unchecked { 237 | image: url("White/radioButton.png"); 238 | } 239 | QRadioButton::indicator:unchecked:hover { 240 | image: url("White/radioButtonHover.png"); 241 | } 242 | QRadioButton::indicator:unchecked:pressed { 243 | image: url("White/radioButtonPressed.png"); 244 | } 245 | QRadioButton::indicator:checked { 246 | image: url("White/radioButtonChecked.png"); 247 | } 248 | QRadioButton::indicator:checked:hover { 249 | image: url("White/radioButtonCheckedHover.png"); 250 | } 251 | QRadioButton::indicator:checked:pressed { 252 | image: url("White/radioButtonCheckedPressed.png"); 253 | } 254 | /**********输入框**********/ 255 | QLineEdit { 256 | border-radius: 4px; 257 | height: 25px; 258 | border: 1px solid rgb(111, 156, 207); 259 | background: white; 260 | } 261 | QLineEdit:enabled { 262 | color: rgb(84, 84, 84); 263 | } 264 | QLineEdit:enabled:hover, QLineEdit:enabled:focus { 265 | color: rgb(51, 51, 51); 266 | } 267 | QLineEdit:!enabled { 268 | color: rgb(80, 80, 80); 269 | } 270 | /**********文本编辑框**********/ 271 | QTextEdit { 272 | font-family:Microsoft YaHei; 273 | font:12px; 274 | border: 1px solid rgb(111, 156, 207); 275 | color: rgb(70, 71, 73); 276 | background: rgb(187, 212, 238); 277 | } 278 | /**********滚动区域**********/ 279 | QScrollArea { 280 | border: 1px solid rgb(111, 156, 207); 281 | background: rgb(187, 212, 238); 282 | } 283 | /**********滚动区域**********/ 284 | QWidget#transparentWidget { 285 | background: transparent; 286 | } 287 | /**********标签**********/ 288 | QLabel { 289 | font-family:Microsoft YaHei; 290 | font:13px; 291 | color: rgb(0, 160, 230); 292 | } 293 | /**********按钮**********/ 294 | QPushButton{ 295 | border-radius: 4px; 296 | border: none; 297 | width: 75px; 298 | height: 25px; 299 | } 300 | QPushButton:enabled { 301 | background: rgb(120, 170, 220); 302 | color: white; 303 | } 304 | QPushButton:!enabled { 305 | background: rgb(180, 180, 180); 306 | color: white; 307 | } 308 | QPushButton:enabled:hover{ 309 | background: rgb(100, 140, 230); 310 | } 311 | QPushButton:enabled:pressed{ 312 | background: rgb(0, 78, 161); 313 | }''' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## PYQT5 电商小工具 2 | 项目结构 3 | - ToolUI.py 4 |
主界面程序代码,使用PYQT5的designer产生的文件(ToolUI.ui)转换成的python代码 5 | - ToolFuncs.py 6 |
主要的函数部分,将界面与函数结合起来 7 | - APIs.py 8 |
爬虫API类,负责爬虫的运行,供主代码调用接口 9 | - QSSwhite.py 10 |
QSS代码,本来应该放在一个.css文件中调用的,但是打包之后调用不了,所以封装成Python文件直接调用,这样有个弊端就是打包之后不能随意换风格样式了。 11 | - ToolUI.ui 12 |
PYQT5的模板文件,可以转换成py文件 13 | - White 14 |
放置程序主界面及QSS调用的图片,只用到了一部分,但是懒得删其他的了 15 | - 其他文件(可以自定义的) 16 | - PICs 17 |
一个存放下载图片的文件夹,是程序第三个模块默认存放图片的文件夹,可以按照保存路径的设置自行更改 18 | - dsr_ids.txt 19 |
程序第一个模块默认读取ID的文件,可以根据实际需求更改名称 20 | - link_ids.txt 21 |
程序第二个模块默认读取ID的文件,可以根据实际需求更改名称 22 | - img_links.txt 23 |
程序第三个模块默认读取链接的文件,可以根据实际需求更改名称 24 | 25 | 项目功能 26 | - 参见程序的各个模块的说明 27 | 28 | 项目运行 29 | - 按照每个模块的“操作流程”中的指示操作就行,很简单,不做解释 30 |
直接放图看效果吧 31 | - 三个模块的不同界面:
32 | ![界面一](https://github.com/Hopetree/TMTools/blob/master/doc/001.png) 33 | ![界面二](https://github.com/Hopetree/TMTools/blob/master/doc/002.png) 34 | ![界面三](https://github.com/Hopetree/TMTools/blob/master/doc/003.png) 35 | - 整体界面效果GIF动图:
36 | ![界面效果](https://github.com/Hopetree/TMTools/blob/master/doc/000.gif) 37 | - 第一个模块操作效果的GIF动图:
38 | ![操作效果](https://github.com/Hopetree/TMTools/blob/master/doc/001.gif) 39 | 40 | 41 | 程序打包 42 | - Pyinstaller 43 |
打包方法:http://www.cnblogs.com/gopythoner/p/6337543.html 44 | 45 | -------------------------------------------------------------------------------- /ToolFuncs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from PyQt5 import QtCore, QtWidgets 4 | from ToolUI import Ui_MainWindow 5 | import sys 6 | from APIs import Spiders 7 | import datetime 8 | import time 9 | import os.path 10 | 11 | 12 | class MainUI(Ui_MainWindow): 13 | def __init__(self): 14 | super().__init__() 15 | self.aboutmsg = "程序使用PYQT5编写,最新版本4.2\n\n本软件的设计初衷是为了解决本人个人工作中的某些任务," \ 16 | "但是本着通用性和共享的原则,本软件可以扩展用到工作之外,不过软件还有很多不足之处有待完善。\n\n" \ 17 | "程序分为三个功能,前两个功能涉及到利用爬虫技术爬取网站信息,因此一旦网页内容有较大变动," \ 18 | "则原信息提取方式会失效,程序也会自动报错,如若程序无法继续使用,可以联系作者进行反馈!!\n\n" \ 19 | "编译日期:2017-5-27\n" 20 | self.authormsg = "作者:爱尔兰咖啡\n\nGithub:https://github.com/Hopetree\n\n如果对本款小工具有疑问或者发现Bug," \ 21 | "可以与本人联系交流!\n\n联系QQ:675737972\n" 22 | 23 | self.actionOpenfile.triggered.connect(QtWidgets.QFileDialog.getOpenFileName) # 查看当前文件夹 24 | self.actionQiut.triggered.connect(self.close) # 菜单栏退出按钮函数 25 | self.actionAbout.triggered.connect(lambda: self.selectInfo("关于软件", self.aboutmsg)) # 关于软件 26 | self.actionAuthor.triggered.connect(lambda: self.selectInfo("作者", self.authormsg)) # 关于作者 27 | self.pushButton_1.clicked.connect(self.startdsr) # DSR开始按钮 28 | self.pushButton_2.clicked.connect(self.startlink) # 主图开始按钮 29 | self.pushButton_3.clicked.connect(self.startimg) # 批量下载图片开始按钮 30 | 31 | # 重写关闭函数 32 | def closeEvent(self, event): 33 | reply = QtWidgets.QMessageBox.question(self, '关闭程序', 34 | "关闭程序可能导致正在进行的操作终止,请确认\n是否退出并关闭程序?", 35 | QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) 36 | if reply == QtWidgets.QMessageBox.Yes: 37 | event.accept() 38 | else: 39 | event.ignore() 40 | 41 | # 消息框函数,传入2个参数,第1个是标题,第2个是显示内容 42 | def selectInfo(self, thetitle, megs): 43 | QtWidgets.QMessageBox.about(self, thetitle, megs) 44 | 45 | # 提取DSR中商品类型 46 | def changePD(self): 47 | if self.radioButton_1.isChecked(): 48 | product = "tmall" 49 | if self.radioButton_2.isChecked(): 50 | product = "jingdong" 51 | return product 52 | 53 | # 更新状态栏 54 | def statusshow(self, astr): 55 | self.statusbar.showMessage(astr) 56 | 57 | # DSR槽函数--------------------------------------------------------------------------------------------------- 58 | # 启动DSR线程的槽函数 59 | def startdsr(self): 60 | self.statusbar.setStyleSheet("color:green") 61 | self.pushButton_1.setDisabled(True) # 线程启动锁定按钮 62 | self.textEdit_1.setText("") # 插入一个空白,每次启动线程都可以清屏 63 | txtname = self.lineEdit_1.text() 64 | product = self.changePD() 65 | self.dsrthread = dsrThread(txtname, product) 66 | self.dsrthread.status_signal.connect(self.statusshow) 67 | self.dsrthread.dsrtext_signal.connect(self.dsrtextshow) 68 | self.dsrthread.dsrprogmax_signal.connect(self.dsrprog_max) 69 | self.dsrthread.dsrprog_signal.connect(self.dsrprog_value) 70 | self.dsrthread.finished.connect(self.dsrpushon) # 线程结束执行函数 71 | self.dsrthread.start() 72 | 73 | # 线程结束后开启DSR按钮 74 | def dsrpushon(self): 75 | self.pushButton_1.setDisabled(False) 76 | 77 | # 更新DSR输出文本 78 | def dsrtextshow(self, astr): 79 | self.textEdit_1.append(astr) 80 | 81 | # 获取DSR进度条最大值 82 | def dsrprog_max(self, n): 83 | self.progressBar_1.setMinimum(0) 84 | self.progressBar_1.setMaximum(n) 85 | 86 | # 更新DSR进度条 87 | def dsrprog_value(self, i): 88 | self.progressBar_1.setValue(i) 89 | 90 | # 主图链接槽函数------------------------------------------------------------------------------------------------ 91 | def startlink(self): 92 | self.statusbar.setStyleSheet("color:blue") 93 | self.pushButton_2.setDisabled(True) # 线程启动锁定按钮 94 | self.textEdit_2.setText("") # 插入一个空白,每次启动线程都可以清屏 95 | txtname = self.lineEdit_2.text() 96 | self.linkthread = linkThread(txtname) 97 | self.linkthread.status_signal.connect(self.statusshow) 98 | self.linkthread.linktext_signal.connect(self.linktextshow) 99 | self.linkthread.progmax_signal.connect(self.linkprog_max) 100 | self.linkthread.progvalue_signal.connect(self.linkprog_value) 101 | self.linkthread.finished.connect(self.linkpushon) # 线程结束执行函数 102 | self.linkthread.start() 103 | 104 | def linkpushon(self): 105 | self.pushButton_2.setDisabled(False) 106 | 107 | def linktextshow(self, astr): 108 | self.textEdit_2.append(astr) 109 | 110 | def linkprog_max(self, n): 111 | self.progressBar_2.setMinimum(0) 112 | self.progressBar_2.setMaximum(n) 113 | 114 | def linkprog_value(self, i): 115 | self.progressBar_2.setValue(i) 116 | 117 | # 批量下载图片槽函数---------------------------------------------------------------------------------------------- 118 | def startimg(self): 119 | self.statusbar.setStyleSheet("color:green") 120 | self.pushButton_3.setDisabled(True) # 线程启动锁定按钮 121 | self.textEdit_3.setText("") # 插入一个空白,每次启动线程都可以清屏 122 | txtname = self.lineEdit_31.text() 123 | imgfile = self.lineEdit_32.text() 124 | self.imgthread = imgThread(txtname, imgfile) 125 | self.imgthread.status_signal.connect(self.statusshow) 126 | self.imgthread.imgtext_signal.connect(self.imgtextshow) 127 | self.imgthread.progmax_signal.connect(self.imgprog_max) 128 | self.imgthread.progvalue_signal.connect(self.imgprog_value) 129 | self.imgthread.finished.connect(self.imgpushon) # 线程结束执行函数 130 | self.imgthread.start() 131 | 132 | def imgpushon(self): 133 | self.pushButton_3.setDisabled(False) 134 | 135 | def imgtextshow(self, astr): 136 | self.textEdit_3.append(astr) 137 | 138 | def imgprog_max(self, n): 139 | self.progressBar_3.setMinimum(0) 140 | self.progressBar_3.setMaximum(n) 141 | 142 | def imgprog_value(self, i): 143 | self.progressBar_3.setValue(i) 144 | 145 | 146 | # DSR线程 147 | class dsrThread(QtCore.QThread): 148 | status_signal = QtCore.pyqtSignal(str) # 发送给状态栏的信号 149 | dsrtext_signal = QtCore.pyqtSignal(str) # 发送给DSR输出框的信号 150 | dsrprogmax_signal = QtCore.pyqtSignal(int) # 发送给进度条的信号,给出最大值 151 | dsrprog_signal = QtCore.pyqtSignal(int) # 发送给进度条的信号,给出每次刷新的进度 152 | 153 | def __init__(self, txtname, product): # 参数:读取的文件名,商品类型 154 | super().__init__() 155 | self.txtname = txtname 156 | self.product = product 157 | self.api = Spiders() 158 | 159 | def run(self): 160 | start = time.time() 161 | T = datetime.datetime.now() 162 | self.status_signal.emit("当前状态:正在进行DSR提取操作...") 163 | try: 164 | IDs = self.api.get_Infos(self.txtname) 165 | except: 166 | self.dsrtext_signal.emit(self.api.getmsg("读取文件失败,请检查文件名称是否有误!", "red")) 167 | else: 168 | nums = len(IDs) 169 | self.dsrprogmax_signal.emit(nums) 170 | i = 1 171 | if self.product == "tmall": 172 | outfile = "TMdsr_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 173 | self.dsrtext_signal.emit(self.api.getmsg("商品类型为【天猫商品】,有效ID总计{}个,开始提取DSR".format(nums), "#464749")) 174 | with open(outfile, 'w') as f: 175 | f.write('商品ID,评分,评论数\n') 176 | for each in IDs: 177 | try: 178 | self.api.get_TM(each, outfile) 179 | except: 180 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 181 | self.dsrtext_signal.emit(self.api.getmsg(msg_b, "red")) 182 | else: 183 | msg_c = "总计{}个商品ID,成功写入第{}个天猫商品:{}".format(nums, i, each) 184 | self.dsrtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 185 | self.dsrprog_signal.emit(i) 186 | i += 1 187 | elif self.product == "jingdong": 188 | outfile = "JDdsr_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 189 | self.dsrtext_signal.emit(self.api.getmsg("商品类型为【京东商品】,有效ID总计{}个,开始提取DSR".format(nums), "#464749")) 190 | with open(outfile, 'w') as f: 191 | f.write('SKUID,好评率,好评数,中评数,差评数\n') 192 | for each in IDs: 193 | try: 194 | self.api.get_JD(each, outfile) 195 | except: 196 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 197 | self.dsrtext_signal.emit(self.api.getmsg(msg_b, "red")) 198 | else: 199 | msg_c = "总计{}个商品ID,成功写入第{}个京东商品:{}".format(nums, i, each) 200 | self.dsrtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 201 | self.dsrprog_signal.emit(i) 202 | i += 1 203 | end = time.time() 204 | msg_d = "DSR提取完毕,耗时:%0.2f秒!\n数据保存在当前目录下表格 %s 中" % (float(end - start), outfile) 205 | self.dsrtext_signal.emit(self.api.getmsg(msg_d, "green")) 206 | self.status_signal.emit("当前状态:DSR信息提取操作完毕!") 207 | 208 | 209 | class linkThread(QtCore.QThread): 210 | status_signal = QtCore.pyqtSignal(str) 211 | linktext_signal = QtCore.pyqtSignal(str) 212 | progmax_signal = QtCore.pyqtSignal(int) 213 | progvalue_signal = QtCore.pyqtSignal(int) 214 | 215 | def __init__(self, txtname): 216 | super().__init__() 217 | self.txtname = txtname 218 | self.api = Spiders() 219 | 220 | def run(self): 221 | start = time.time() 222 | T = datetime.datetime.now() 223 | self.status_signal.emit("当前状态:正在进行天猫主图链接提取操作...") 224 | try: 225 | IDs = self.api.get_Infos(self.txtname) 226 | except: 227 | self.linktext_signal.emit(self.api.getmsg("读取文件失败,请检查文件名称是否有误!", "red")) 228 | else: 229 | nums = len(IDs) 230 | outfile = "links_" + T.strftime("%Y%m%d%H%M") + "_" + str(nums) + ".csv" 231 | with open(outfile, "w") as f: 232 | f.write("商品ID,主图链接,原价,折扣价" + "\n") 233 | self.progmax_signal.emit(nums) 234 | self.linktext_signal.emit(self.api.getmsg("读取文件成功,有效ID总计{}个,开始提取天猫主图链接".format(nums), "#464749")) 235 | i = 1 236 | for each in IDs: 237 | try: 238 | self.api.getimglink(each, outfile) 239 | except: 240 | msg_b = "总计{}个商品ID,第{}个商品:{}写入信息失败!".format(nums, i, each) 241 | self.linktext_signal.emit(self.api.getmsg(msg_b, "red")) 242 | else: 243 | msg_c = "总计{}个商品ID,成功写入第{}个天猫主图信息:{}".format(nums, i, each) 244 | self.linktext_signal.emit(self.api.getmsg(msg_c, "#464749")) 245 | self.progvalue_signal.emit(i) 246 | i += 1 247 | end = time.time() 248 | msg_d = "天猫主图链接提取完毕,耗时:%0.2f秒!\n数据保存在当前目录下表格 %s 中" % (float(end - start), outfile) 249 | self.linktext_signal.emit(self.api.getmsg(msg_d, "green")) 250 | self.status_signal.emit("当前状态:天猫主图信息提取操作完毕!") 251 | 252 | 253 | class imgThread(QtCore.QThread): 254 | status_signal = QtCore.pyqtSignal(str) 255 | imgtext_signal = QtCore.pyqtSignal(str) 256 | progmax_signal = QtCore.pyqtSignal(int) 257 | progvalue_signal = QtCore.pyqtSignal(int) 258 | 259 | def __init__(self, txtname, imgfile): 260 | super().__init__() 261 | self.txtname = txtname 262 | self.imgfile = imgfile 263 | self.api = Spiders() 264 | 265 | def run(self): 266 | start = time.time() 267 | self.status_signal.emit("当前状态:正在进行批量下载图片操作...") 268 | if os.path.isfile(self.txtname): # 如果文件存在 269 | if not os.path.isdir(self.imgfile): 270 | try: 271 | os.mkdir(self.imgfile) 272 | self.imgtext_signal.emit(self.api.getmsg("创建一个新的文件夹,名称为 {}".format(self.imgfile), "green")) 273 | except: 274 | self.imgfile = "PICs" 275 | msg_a = "输入的文件夹名称不合格,使用默认文件夹: {}".format(self.imgfile) 276 | self.imgtext_signal.emit(self.api.getmsg(msg_a, "red")) 277 | try: 278 | os.mkdir(self.imgfile) 279 | except: 280 | pass 281 | infos = self.api.get_Infos(self.txtname) 282 | newinfos = [x for x in infos if "," in x and len(x) > 3] # 只要有效链接 283 | num = len(newinfos) 284 | self.progmax_signal.emit(num) 285 | msg_b = '获取有效图片链接总计{}个,开始批量下载图片...'.format(num) 286 | self.imgtext_signal.emit(self.api.getmsg(msg_b, "#464749")) 287 | i = 1 288 | for each in newinfos: 289 | savename = each.split(",")[0] 290 | imgurl = each.split(",")[1] 291 | try: 292 | self.api.downimg(self.imgfile, savename, imgurl) 293 | except: 294 | bugmsg = '第{}个图片链接:{} 下载失败!'.format(i, imgurl) 295 | self.imgtext_signal.emit(self.api.getmsg(bugmsg, "red")) 296 | else: 297 | msg_c = "正在下载第{}个图片,保存为:{}".format(i, savename) 298 | self.imgtext_signal.emit(self.api.getmsg(msg_c, "#464749")) 299 | self.progvalue_signal.emit(i) 300 | i += 1 301 | end = time.time() 302 | msg_d = "图片批量下载完毕,耗时:%0.2f秒!\n所有图片保存在文件夹 %s 中" % (float(end - start), self.imgfile) 303 | self.imgtext_signal.emit(self.api.getmsg(msg_d, "green")) 304 | else: 305 | themsg2 = '文件不存在,请创建文件再操作!' 306 | self.imgtext_signal.emit(self.api.getmsg(themsg2, "red")) 307 | self.status_signal.emit("当前状态:批量下载图片操作完毕!") 308 | 309 | 310 | if __name__ == '__main__': 311 | app = QtWidgets.QApplication(sys.argv) 312 | myui = MainUI() 313 | myui.show() 314 | sys.exit(app.exec_()) 315 | -------------------------------------------------------------------------------- /ToolUI.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Form implementation generated from reading ui file 'ToolUI.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.6 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt5 import QtCore, QtGui, QtWidgets 10 | # 导入样式文件 11 | from QSSwhite import QSS 12 | 13 | class Ui_MainWindow(QtWidgets.QMainWindow): 14 | def __init__(self): 15 | super().__init__() 16 | self.setupUi(self) 17 | 18 | def setupUi(self, MainWindow): 19 | MainWindow.setObjectName("MainWindow") 20 | MainWindow.resize(640, 540) 21 | MainWindow.setWindowIcon(QtGui.QIcon("White/ooopic_1484987787.ico")) 22 | MainWindow.setMaximumSize(QtCore.QSize(640, 540)) 23 | self.centralwidget = QtWidgets.QWidget(MainWindow) 24 | self.centralwidget.setObjectName("centralwidget") 25 | self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) 26 | self.tabWidget.setGeometry(QtCore.QRect(20, 4, 604, 473)) 27 | self.tabWidget.setObjectName("tabWidget") 28 | self.tab_1 = QtWidgets.QWidget() 29 | self.tab_1.setObjectName("tab_1") 30 | self.groupBox_11 = QtWidgets.QGroupBox(self.tab_1) 31 | self.groupBox_11.setGeometry(QtCore.QRect(30, 10, 535, 151)) 32 | self.groupBox_11.setObjectName("groupBox_11") 33 | self.label_11 = QtWidgets.QLabel(self.groupBox_11) 34 | self.label_11.setGeometry(QtCore.QRect(50, 18, 461, 123)) 35 | self.label_11.setObjectName("label_11") 36 | self.groupBox_12 = QtWidgets.QGroupBox(self.tab_1) 37 | self.groupBox_12.setGeometry(QtCore.QRect(30, 180, 535, 251)) 38 | self.groupBox_12.setObjectName("groupBox_12") 39 | self.label_4 = QtWidgets.QLabel(self.groupBox_12) 40 | self.label_4.setGeometry(QtCore.QRect(40, 30, 60, 24)) 41 | self.label_4.setObjectName("label_4") 42 | self.lineEdit_1 = QtWidgets.QLineEdit(self.groupBox_12) 43 | self.lineEdit_1.setGeometry(QtCore.QRect(102, 30, 156, 24)) 44 | self.lineEdit_1.setObjectName("lineEdit_1") 45 | self.radioButton_1 = QtWidgets.QRadioButton(self.groupBox_12) 46 | self.radioButton_1.setGeometry(QtCore.QRect(270, 26, 110, 32)) 47 | icon = QtGui.QIcon() 48 | icon.addPixmap(QtGui.QPixmap("White/e52d9567c015cdb440344305380739e7.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 49 | self.radioButton_1.setIcon(icon) 50 | self.radioButton_1.setIconSize(QtCore.QSize(30, 30)) 51 | self.radioButton_1.setObjectName("radioButton_1") 52 | self.radioButton_2 = QtWidgets.QRadioButton(self.groupBox_12) 53 | self.radioButton_2.setGeometry(QtCore.QRect(398, 26, 111, 32)) 54 | icon1 = QtGui.QIcon() 55 | icon1.addPixmap(QtGui.QPixmap("White/b721a1c9956b6e836cbdb6c57691ef09.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 56 | self.radioButton_2.setIcon(icon1) 57 | self.radioButton_2.setIconSize(QtCore.QSize(22, 22)) 58 | self.radioButton_2.setObjectName("radioButton_2") 59 | self.pushButton_1 = QtWidgets.QPushButton(self.groupBox_12) 60 | self.pushButton_1.setGeometry(QtCore.QRect(40, 70, 91, 30)) 61 | icon2 = QtGui.QIcon() 62 | icon2.addPixmap(QtGui.QPixmap("White/ooopic_1494068712.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 63 | self.pushButton_1.setIcon(icon2) 64 | self.pushButton_1.setIconSize(QtCore.QSize(20, 20)) 65 | self.pushButton_1.setObjectName("pushButton_1") 66 | self.label_5 = QtWidgets.QLabel(self.groupBox_12) 67 | self.label_5.setGeometry(QtCore.QRect(160, 72, 71, 24)) 68 | self.label_5.setObjectName("label_5") 69 | self.progressBar_1 = QtWidgets.QProgressBar(self.groupBox_12) 70 | self.progressBar_1.setGeometry(QtCore.QRect(240, 75, 250, 20)) 71 | self.progressBar_1.setProperty("value", 0) 72 | self.progressBar_1.setObjectName("progressBar_1") 73 | self.textEdit_1 = QtWidgets.QTextEdit(self.groupBox_12) 74 | self.textEdit_1.setGeometry(QtCore.QRect(40, 120, 455, 121)) 75 | self.textEdit_1.setObjectName("textEdit_1") 76 | self.tabWidget.addTab(self.tab_1, "") 77 | self.tab_2 = QtWidgets.QWidget() 78 | self.tab_2.setObjectName("tab_2") 79 | self.groupBox_21 = QtWidgets.QGroupBox(self.tab_2) 80 | self.groupBox_21.setGeometry(QtCore.QRect(30, 180, 535, 251)) 81 | self.groupBox_21.setObjectName("groupBox_21") 82 | self.lineEdit_2 = QtWidgets.QLineEdit(self.groupBox_21) 83 | self.lineEdit_2.setGeometry(QtCore.QRect(102, 30, 156, 24)) 84 | self.lineEdit_2.setObjectName("lineEdit_2") 85 | self.label_6 = QtWidgets.QLabel(self.groupBox_21) 86 | self.label_6.setGeometry(QtCore.QRect(40, 30, 60, 24)) 87 | self.label_6.setObjectName("label_6") 88 | self.label_7 = QtWidgets.QLabel(self.groupBox_21) 89 | self.label_7.setGeometry(QtCore.QRect(160, 72, 71, 24)) 90 | self.label_7.setObjectName("label_7") 91 | self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_21) 92 | self.pushButton_2.setGeometry(QtCore.QRect(40, 70, 91, 30)) 93 | self.pushButton_2.setIcon(icon2) 94 | self.pushButton_2.setIconSize(QtCore.QSize(20, 20)) 95 | self.pushButton_2.setObjectName("pushButton_2") 96 | self.progressBar_2 = QtWidgets.QProgressBar(self.groupBox_21) 97 | self.progressBar_2.setGeometry(QtCore.QRect(240, 75, 250, 20)) 98 | self.progressBar_2.setProperty("value", 0) 99 | self.progressBar_2.setObjectName("progressBar_2") 100 | self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox_21) 101 | self.textEdit_2.setGeometry(QtCore.QRect(40, 120, 455, 121)) 102 | self.textEdit_2.setObjectName("textEdit_2") 103 | self.groupBox_22 = QtWidgets.QGroupBox(self.tab_2) 104 | self.groupBox_22.setGeometry(QtCore.QRect(30, 10, 535, 151)) 105 | self.groupBox_22.setObjectName("groupBox_22") 106 | self.label_2 = QtWidgets.QLabel(self.groupBox_22) 107 | self.label_2.setGeometry(QtCore.QRect(50, 18, 461, 123)) 108 | self.label_2.setObjectName("label_2") 109 | self.tabWidget.addTab(self.tab_2, "") 110 | self.tab_3 = QtWidgets.QWidget() 111 | self.tab_3.setObjectName("tab_3") 112 | self.groupBox_31 = QtWidgets.QGroupBox(self.tab_3) 113 | self.groupBox_31.setGeometry(QtCore.QRect(30, 180, 535, 251)) 114 | self.groupBox_31.setObjectName("groupBox_31") 115 | self.progressBar_3 = QtWidgets.QProgressBar(self.groupBox_31) 116 | self.progressBar_3.setGeometry(QtCore.QRect(240, 75, 250, 20)) 117 | self.progressBar_3.setProperty("value", 0) 118 | self.progressBar_3.setObjectName("progressBar_3") 119 | self.pushButton_3 = QtWidgets.QPushButton(self.groupBox_31) 120 | self.pushButton_3.setGeometry(QtCore.QRect(40, 70, 91, 30)) 121 | self.pushButton_3.setIcon(icon2) 122 | self.pushButton_3.setIconSize(QtCore.QSize(20, 20)) 123 | self.pushButton_3.setObjectName("pushButton_3") 124 | self.label_8 = QtWidgets.QLabel(self.groupBox_31) 125 | self.label_8.setGeometry(QtCore.QRect(40, 30, 60, 24)) 126 | self.label_8.setObjectName("label_8") 127 | self.lineEdit_31 = QtWidgets.QLineEdit(self.groupBox_31) 128 | self.lineEdit_31.setGeometry(QtCore.QRect(102, 30, 156, 24)) 129 | self.lineEdit_31.setObjectName("lineEdit_31") 130 | self.textEdit_3 = QtWidgets.QTextEdit(self.groupBox_31) 131 | self.textEdit_3.setGeometry(QtCore.QRect(40, 120, 455, 121)) 132 | self.textEdit_3.setObjectName("textEdit_3") 133 | self.label_9 = QtWidgets.QLabel(self.groupBox_31) 134 | self.label_9.setGeometry(QtCore.QRect(160, 72, 71, 24)) 135 | self.label_9.setObjectName("label_9") 136 | self.label_10 = QtWidgets.QLabel(self.groupBox_31) 137 | self.label_10.setGeometry(QtCore.QRect(272, 30, 72, 24)) 138 | self.label_10.setObjectName("label_10") 139 | self.lineEdit_32 = QtWidgets.QLineEdit(self.groupBox_31) 140 | self.lineEdit_32.setGeometry(QtCore.QRect(348, 30, 146, 24)) 141 | self.lineEdit_32.setObjectName("lineEdit_32") 142 | self.groupBox_32 = QtWidgets.QGroupBox(self.tab_3) 143 | self.groupBox_32.setGeometry(QtCore.QRect(30, 10, 535, 151)) 144 | self.groupBox_32.setObjectName("groupBox_32") 145 | self.label_3 = QtWidgets.QLabel(self.groupBox_32) 146 | self.label_3.setGeometry(QtCore.QRect(50, 18, 461, 123)) 147 | self.label_3.setObjectName("label_3") 148 | self.tabWidget.addTab(self.tab_3, "") 149 | MainWindow.setCentralWidget(self.centralwidget) 150 | self.menubar = QtWidgets.QMenuBar(MainWindow) 151 | self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 23)) 152 | self.menubar.setObjectName("menubar") 153 | self.menu_F = QtWidgets.QMenu(self.menubar) 154 | self.menu_F.setObjectName("menu_F") 155 | self.menu_H = QtWidgets.QMenu(self.menubar) 156 | self.menu_H.setObjectName("menu_H") 157 | MainWindow.setMenuBar(self.menubar) 158 | self.statusbar = QtWidgets.QStatusBar(MainWindow) 159 | self.statusbar.setObjectName("statusbar") 160 | MainWindow.setStatusBar(self.statusbar) 161 | self.actionOpenfile = QtWidgets.QAction(MainWindow) 162 | icon3 = QtGui.QIcon() 163 | icon3.addPixmap(QtGui.QPixmap("White/2017522122222.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 164 | self.actionOpenfile.setIcon(icon3) 165 | self.actionOpenfile.setObjectName("actionOpenfile") 166 | self.actionQiut = QtWidgets.QAction(MainWindow) 167 | icon4 = QtGui.QIcon() 168 | icon4.addPixmap(QtGui.QPixmap("White/ooopic_1495455270.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 169 | self.actionQiut.setIcon(icon4) 170 | self.actionQiut.setObjectName("actionQiut") 171 | self.actionAbout = QtWidgets.QAction(MainWindow) 172 | icon5 = QtGui.QIcon() 173 | icon5.addPixmap(QtGui.QPixmap("White/201752212221.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 174 | self.actionAbout.setIcon(icon5) 175 | self.actionAbout.setObjectName("actionAbout") 176 | self.actionAuthor = QtWidgets.QAction(MainWindow) 177 | icon6 = QtGui.QIcon() 178 | icon6.addPixmap(QtGui.QPixmap("White/2017522122216.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) 179 | self.actionAuthor.setIcon(icon6) 180 | self.actionAuthor.setObjectName("actionAuthor") 181 | self.menu_F.addAction(self.actionOpenfile) 182 | self.menu_F.addSeparator() 183 | self.menu_F.addAction(self.actionQiut) 184 | self.menu_H.addAction(self.actionAbout) 185 | self.menu_H.addSeparator() 186 | self.menu_H.addAction(self.actionAuthor) 187 | self.menubar.addAction(self.menu_F.menuAction()) 188 | self.menubar.addAction(self.menu_H.menuAction()) 189 | 190 | self.retranslateUi(MainWindow) 191 | self.tabWidget.setCurrentIndex(0) 192 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 193 | 194 | def retranslateUi(self, MainWindow): 195 | _translate = QtCore.QCoreApplication.translate 196 | MainWindow.setWindowTitle(_translate("MainWindow", "电商小工具")) 197 | self.groupBox_11.setTitle(_translate("MainWindow", "操作流程")) 198 | self.label_11.setText(_translate("MainWindow", "

1、程序运行可以获取天猫或京东商品的DSR信息并生成数据表格

2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个

3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称

4、选择商品类型,启动开始按钮,等待程序运行结束后获取信息表格

")) 199 | self.groupBox_12.setTitle(_translate("MainWindow", "运行过程")) 200 | self.label_4.setText(_translate("MainWindow", "文件名称:")) 201 | self.radioButton_1.setText(_translate("MainWindow", "天猫商品")) 202 | self.radioButton_1.setChecked(True) #设置默认选中 203 | self.radioButton_2.setText(_translate("MainWindow", "京东商品")) 204 | self.pushButton_1.setText(_translate("MainWindow", "开始")) 205 | self.label_5.setText(_translate("MainWindow", "完成进度:")) 206 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_1), _translate("MainWindow", "商品DSR提取")) 207 | self.groupBox_21.setTitle(_translate("MainWindow", "运行过程")) 208 | self.label_6.setText(_translate("MainWindow", "文件名称:")) 209 | self.label_7.setText(_translate("MainWindow", "完成进度:")) 210 | self.pushButton_2.setText(_translate("MainWindow", "开始")) 211 | self.groupBox_22.setTitle(_translate("MainWindow", "操作流程")) 212 | self.label_2.setText(_translate("MainWindow", "

1、程序运行可以获取天猫商品的主图链接和价格(原价&折扣价)

2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个

3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称

4、上述步骤完成后按下开始按钮,等待程序运行结束后获取信息表格

")) 213 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "天猫主图提取")) 214 | self.groupBox_31.setTitle(_translate("MainWindow", "运行过程")) 215 | self.pushButton_3.setText(_translate("MainWindow", "开始")) 216 | self.label_8.setText(_translate("MainWindow", "文件名称:")) 217 | self.label_9.setText(_translate("MainWindow", "完成进度:")) 218 | self.label_10.setText(_translate("MainWindow", "图片文件夹:")) 219 | self.groupBox_32.setTitle(_translate("MainWindow", "操作流程")) 220 | self.label_3.setText(_translate("MainWindow", "

1、程序运行可以按照所给图片链接下载图片并按要求给图片命名

2、在程序所在目录创建一个文本,在其中放入图片链接和名称,每行放一个

3、文件中格式如:1234,https://www.img.jpg,即名称和链接用英文逗号连接

4、输入包含链接的文件名称和图片保存文件夹名称,按开始按钮开始下载图片

")) 221 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "图片批量下载")) 222 | self.menu_F.setTitle(_translate("MainWindow", "文件(F)")) 223 | self.menu_H.setTitle(_translate("MainWindow", "帮助(H)")) 224 | self.actionOpenfile.setText(_translate("MainWindow", "查看文件夹")) 225 | self.actionOpenfile.setShortcut(_translate("MainWindow", "Ctrl+O")) 226 | self.actionQiut.setText(_translate("MainWindow", "退出")) 227 | self.actionQiut.setShortcut(_translate("MainWindow", "Ctrl+Q")) 228 | self.actionAbout.setText(_translate("MainWindow", "关于")) 229 | self.actionAuthor.setText(_translate("MainWindow", "作者")) 230 | 231 | # 添加默认值 232 | self.lineEdit_1.setText("dsr_ids.txt") 233 | self.lineEdit_2.setText("link_ids.txt") 234 | self.lineEdit_31.setText("img_links.txt") 235 | self.lineEdit_32.setText("PICs") 236 | # 设置提示语 237 | for each in [self.lineEdit_1,self.lineEdit_2,self.lineEdit_31]: 238 | each.setToolTip("温馨提示:请先确认文件是否存在!") 239 | self.lineEdit_32.setToolTip("警告:请勿使用非法文件名称,否则程序会崩溃!") 240 | #设置鼠标样式和提示语 241 | for each in [self.pushButton_1,self.pushButton_2,self.pushButton_3]: 242 | each.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) 243 | # 添加样式风格 244 | self.mystyle() 245 | 246 | def mystyle(self): 247 | qss = QSS() 248 | self.setStyleSheet(qss.White) 249 | 250 | if __name__ == '__main__': 251 | import sys 252 | app = QtWidgets.QApplication(sys.argv) 253 | myui = Ui_MainWindow() 254 | myui.show() 255 | sys.exit(app.exec_()) 256 | -------------------------------------------------------------------------------- /ToolUI.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 640 10 | 540 11 | 12 | 13 | 14 | 15 | 640 16 | 540 17 | 18 | 19 | 20 | MainWindow 21 | 22 | 23 | 24 | 25 | 26 | 20 27 | 4 28 | 604 29 | 473 30 | 31 | 32 | 33 | 2 34 | 35 | 36 | 37 | 商品DSR提取 38 | 39 | 40 | 41 | 42 | 30 43 | 10 44 | 535 45 | 151 46 | 47 | 48 | 49 | 操作流程 50 | 51 | 52 | 53 | 54 | 50 55 | 18 56 | 461 57 | 123 58 | 59 | 60 | 61 | <html><head/><body><p>1、程序运行可以获取天猫或京东商品的DSR信息并生成数据表格</p><p>2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个</p><p>3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称</p><p>4、选择商品类型,启动开始按钮,等待程序运行结束后获取信息表格</p></body></html> 62 | 63 | 64 | 65 | 66 | 67 | 68 | 30 69 | 180 70 | 535 71 | 251 72 | 73 | 74 | 75 | 运行过程 76 | 77 | 78 | 79 | 80 | 40 81 | 30 82 | 60 83 | 24 84 | 85 | 86 | 87 | 文件名称: 88 | 89 | 90 | 91 | 92 | 93 | 102 94 | 30 95 | 156 96 | 24 97 | 98 | 99 | 100 | 101 | 102 | 103 | 270 104 | 26 105 | 110 106 | 32 107 | 108 | 109 | 110 | 111 | 112 | 113 | 天猫商品 114 | 115 | 116 | 117 | Icon/e52d9567c015cdb440344305380739e7.pngIcon/e52d9567c015cdb440344305380739e7.png 118 | 119 | 120 | 121 | 30 122 | 30 123 | 124 | 125 | 126 | 127 | 128 | 129 | 398 130 | 26 131 | 111 132 | 32 133 | 134 | 135 | 136 | 京东商品 137 | 138 | 139 | 140 | Icon/b721a1c9956b6e836cbdb6c57691ef09.pngIcon/b721a1c9956b6e836cbdb6c57691ef09.png 141 | 142 | 143 | 144 | 22 145 | 22 146 | 147 | 148 | 149 | 150 | 151 | 152 | 40 153 | 70 154 | 91 155 | 30 156 | 157 | 158 | 159 | 开始 160 | 161 | 162 | 163 | Icon/ooopic_1494068712.icoIcon/ooopic_1494068712.ico 164 | 165 | 166 | 167 | 20 168 | 20 169 | 170 | 171 | 172 | 173 | 174 | 175 | 160 176 | 72 177 | 71 178 | 24 179 | 180 | 181 | 182 | 完成进度: 183 | 184 | 185 | 186 | 187 | 188 | 240 189 | 75 190 | 250 191 | 20 192 | 193 | 194 | 195 | 24 196 | 197 | 198 | 199 | 200 | 201 | 40 202 | 120 203 | 455 204 | 121 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 天猫主图提取 213 | 214 | 215 | 216 | 217 | 30 218 | 180 219 | 535 220 | 251 221 | 222 | 223 | 224 | 运行过程 225 | 226 | 227 | 228 | 229 | 102 230 | 30 231 | 156 232 | 24 233 | 234 | 235 | 236 | 237 | 238 | 239 | 40 240 | 30 241 | 60 242 | 24 243 | 244 | 245 | 246 | 文件名称: 247 | 248 | 249 | 250 | 251 | 252 | 160 253 | 72 254 | 71 255 | 24 256 | 257 | 258 | 259 | 完成进度: 260 | 261 | 262 | 263 | 264 | 265 | 40 266 | 70 267 | 91 268 | 30 269 | 270 | 271 | 272 | 开始 273 | 274 | 275 | 276 | Icon/ooopic_1494068712.icoIcon/ooopic_1494068712.ico 277 | 278 | 279 | 280 | 20 281 | 20 282 | 283 | 284 | 285 | 286 | 287 | 288 | 240 289 | 75 290 | 250 291 | 20 292 | 293 | 294 | 295 | 24 296 | 297 | 298 | 299 | 300 | 301 | 40 302 | 120 303 | 455 304 | 121 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 30 313 | 10 314 | 535 315 | 151 316 | 317 | 318 | 319 | 操作流程 320 | 321 | 322 | 323 | 324 | 50 325 | 18 326 | 461 327 | 123 328 | 329 | 330 | 331 | <html><head/><body><p>1、程序运行可以获取天猫商品的主图链接和价格(原价&amp;折扣价)</p><p>2、在程序所在目录创建一个文本文件,在其中放入商品ID,每行放一个</p><p>3、在文件名称输入框中输入放有商品ID的文件名称或直接使用默认文件名称</p><p>4、上述步骤完成后按下开始按钮,等待程序运行结束后获取信息表格</p></body></html> 332 | 333 | 334 | 335 | 336 | 337 | 338 | 图片批量下载 339 | 340 | 341 | 342 | 343 | 30 344 | 180 345 | 535 346 | 251 347 | 348 | 349 | 350 | 运行过程 351 | 352 | 353 | 354 | 355 | 240 356 | 75 357 | 250 358 | 20 359 | 360 | 361 | 362 | 24 363 | 364 | 365 | 366 | 367 | 368 | 40 369 | 70 370 | 91 371 | 30 372 | 373 | 374 | 375 | 开始 376 | 377 | 378 | 379 | Icon/ooopic_1494068712.icoIcon/ooopic_1494068712.ico 380 | 381 | 382 | 383 | 20 384 | 20 385 | 386 | 387 | 388 | 389 | 390 | 391 | 40 392 | 30 393 | 60 394 | 24 395 | 396 | 397 | 398 | 文件名称: 399 | 400 | 401 | 402 | 403 | 404 | 102 405 | 30 406 | 141 407 | 24 408 | 409 | 410 | 411 | 412 | 413 | 414 | 40 415 | 120 416 | 455 417 | 121 418 | 419 | 420 | 421 | 422 | 423 | 424 | 160 425 | 72 426 | 71 427 | 24 428 | 429 | 430 | 431 | 完成进度: 432 | 433 | 434 | 435 | 436 | 437 | 277 438 | 30 439 | 68 440 | 24 441 | 442 | 443 | 444 | 图片文件夹: 445 | 446 | 447 | 448 | 449 | 450 | 350 451 | 30 452 | 141 453 | 24 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 30 462 | 10 463 | 535 464 | 151 465 | 466 | 467 | 468 | 操作流程 469 | 470 | 471 | 472 | 473 | 50 474 | 18 475 | 461 476 | 123 477 | 478 | 479 | 480 | <html><head/><body><p>1、程序运行可以按照所给图片链接下载图片并按要求给图片命名</p><p>2、在程序所在目录创建一个文本,在其中放入图片链接和名称,每行放一个</p><p>3、文件中格式如:1234,https://img1234.jpg,即名称和链接用英文逗号连接</p><p>4、输入包含链接的文件名称和图片保存文件夹名称,按开始按钮开始下载图片</p></body></html> 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 0 491 | 0 492 | 640 493 | 23 494 | 495 | 496 | 497 | 498 | 文件(F) 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 帮助(H) 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | Icon/2017522122222.icoIcon/2017522122222.ico 520 | 521 | 522 | 查看文件夹 523 | 524 | 525 | Ctrl+O 526 | 527 | 528 | 529 | 530 | 531 | Icon/ooopic_1495455270.icoIcon/ooopic_1495455270.ico 532 | 533 | 534 | 退出 535 | 536 | 537 | Ctrl+Q 538 | 539 | 540 | 541 | 542 | 543 | Icon/201752212221.icoIcon/201752212221.ico 544 | 545 | 546 | 关于 547 | 548 | 549 | 550 | 551 | 552 | Icon/2017522122216.icoIcon/2017522122216.ico 553 | 554 | 555 | 作者 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | -------------------------------------------------------------------------------- /White/201752212221.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/201752212221.png -------------------------------------------------------------------------------- /White/2017522122216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/2017522122216.png -------------------------------------------------------------------------------- /White/2017522122222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/2017522122222.png -------------------------------------------------------------------------------- /White/arrowBottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/arrowBottom.png -------------------------------------------------------------------------------- /White/arrowLeft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/arrowLeft.png -------------------------------------------------------------------------------- /White/arrowRight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/arrowRight.png -------------------------------------------------------------------------------- /White/arrowTop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/arrowTop.png -------------------------------------------------------------------------------- /White/b721a1c9956b6e836cbdb6c57691ef09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/b721a1c9956b6e836cbdb6c57691ef09.png -------------------------------------------------------------------------------- /White/bottomArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/bottomArrow.png -------------------------------------------------------------------------------- /White/bottomArrowHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/bottomArrowHover.png -------------------------------------------------------------------------------- /White/checkBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBox.png -------------------------------------------------------------------------------- /White/checkBoxChecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxChecked.png -------------------------------------------------------------------------------- /White/checkBoxCheckedHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxCheckedHover.png -------------------------------------------------------------------------------- /White/checkBoxCheckedPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxCheckedPressed.png -------------------------------------------------------------------------------- /White/checkBoxHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxHover.png -------------------------------------------------------------------------------- /White/checkBoxIndeterminate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxIndeterminate.png -------------------------------------------------------------------------------- /White/checkBoxIndeterminateHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxIndeterminateHover.png -------------------------------------------------------------------------------- /White/checkBoxIndeterminatePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxIndeterminatePressed.png -------------------------------------------------------------------------------- /White/checkBoxPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/checkBoxPressed.png -------------------------------------------------------------------------------- /White/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/close.png -------------------------------------------------------------------------------- /White/closeHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/closeHover.png -------------------------------------------------------------------------------- /White/closePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/closePressed.png -------------------------------------------------------------------------------- /White/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/delete.png -------------------------------------------------------------------------------- /White/deleteHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/deleteHover.png -------------------------------------------------------------------------------- /White/deletePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/deletePressed.png -------------------------------------------------------------------------------- /White/downButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/downButton.png -------------------------------------------------------------------------------- /White/e52d9567c015cdb440344305380739e7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/e52d9567c015cdb440344305380739e7.png -------------------------------------------------------------------------------- /White/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/error.png -------------------------------------------------------------------------------- /White/feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/feedback.png -------------------------------------------------------------------------------- /White/feedbackHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/feedbackHover.png -------------------------------------------------------------------------------- /White/feedbackPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/feedbackPressed.png -------------------------------------------------------------------------------- /White/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/information.png -------------------------------------------------------------------------------- /White/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/left.png -------------------------------------------------------------------------------- /White/maximize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/maximize.png -------------------------------------------------------------------------------- /White/maximizeHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/maximizeHover.png -------------------------------------------------------------------------------- /White/maximizePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/maximizePressed.png -------------------------------------------------------------------------------- /White/minimize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/minimize.png -------------------------------------------------------------------------------- /White/minimizeHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/minimizeHover.png -------------------------------------------------------------------------------- /White/minimizePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/minimizePressed.png -------------------------------------------------------------------------------- /White/nscc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/nscc.png -------------------------------------------------------------------------------- /White/ooopic_1484987787.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/ooopic_1484987787.ico -------------------------------------------------------------------------------- /White/ooopic_1484987787.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/ooopic_1484987787.png -------------------------------------------------------------------------------- /White/ooopic_1495455270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/ooopic_1495455270.png -------------------------------------------------------------------------------- /White/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/open.png -------------------------------------------------------------------------------- /White/openHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/openHover.png -------------------------------------------------------------------------------- /White/openPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/openPressed.png -------------------------------------------------------------------------------- /White/progressBar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/progressBar.png -------------------------------------------------------------------------------- /White/progressBarChunk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/progressBarChunk.png -------------------------------------------------------------------------------- /White/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/question.png -------------------------------------------------------------------------------- /White/radioButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButton.png -------------------------------------------------------------------------------- /White/radioButtonChecked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButtonChecked.png -------------------------------------------------------------------------------- /White/radioButtonCheckedHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButtonCheckedHover.png -------------------------------------------------------------------------------- /White/radioButtonCheckedPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButtonCheckedPressed.png -------------------------------------------------------------------------------- /White/radioButtonHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButtonHover.png -------------------------------------------------------------------------------- /White/radioButtonPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/radioButtonPressed.png -------------------------------------------------------------------------------- /White/restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/restore.png -------------------------------------------------------------------------------- /White/restoreHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/restoreHover.png -------------------------------------------------------------------------------- /White/restorePressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/restorePressed.png -------------------------------------------------------------------------------- /White/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/right.png -------------------------------------------------------------------------------- /White/scan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/scan.png -------------------------------------------------------------------------------- /White/skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/skin.png -------------------------------------------------------------------------------- /White/skinHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/skinHover.png -------------------------------------------------------------------------------- /White/skinPressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/skinPressed.png -------------------------------------------------------------------------------- /White/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/success.png -------------------------------------------------------------------------------- /White/topArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/topArrow.png -------------------------------------------------------------------------------- /White/topArrowHover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/topArrowHover.png -------------------------------------------------------------------------------- /White/transfer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/transfer.png -------------------------------------------------------------------------------- /White/upButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/upButton.png -------------------------------------------------------------------------------- /White/warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/White/warning.png -------------------------------------------------------------------------------- /doc/000.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/doc/000.gif -------------------------------------------------------------------------------- /doc/001.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/doc/001.gif -------------------------------------------------------------------------------- /doc/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/doc/001.png -------------------------------------------------------------------------------- /doc/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/doc/002.png -------------------------------------------------------------------------------- /doc/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hopetree/TMTools/2b0231e2f97514ee8b59bf9cbc53125c059320b3/doc/003.png -------------------------------------------------------------------------------- /dsr_ids.txt: -------------------------------------------------------------------------------- 1 | 546666014655 2 | 544152763179 3 | 544837631720 4 | 544153244109 5 | 544185822300 6 | 544265692399 7 | 544271056624 8 | 546017035695 9 | 544302552993 10 | 544309252510 11 | 544311396254 12 | 544312588360 13 | 544312968443 14 | 545998738146 15 | 544314708904 16 | 536643600886 17 | 544326941497 18 | 544328421219 19 | 544333537944 20 | 544336348648 21 | 544336861645 22 | 544337705856 23 | 544337936435 24 | 544343274417 25 | 537458957084 26 | 537343603894 27 | 537422902907 28 | 536536655815 29 | 544819265085 30 | 544359935827 31 | 544361867173 32 | 544367323612 33 | 544368883258 34 | 544818030230 35 | 544372392503 36 | 546593437480 37 | 544373594695 38 | 544390519660 39 | 544391675648 40 | 544420086217 41 | 544422583760 42 | 544436367877 43 | 544476232597 44 | 544476812352 45 | 544477428095 46 | 544509202974 47 | 544511994692 48 | 544512966703 49 | 544514114233 50 | 546438003878 51 | 544514278631 52 | 544529967660 53 | 544530831819 54 | 544531435265 55 | 544531475690 56 | 544531767984 57 | 537923134453 58 | 544532275796 59 | 544535168455 60 | 548501653503 61 | 544535684013 62 | 544568801153 63 | 544569153809 64 | 544569373025 65 | 544571918945 66 | 544572158674 67 | 544579286554 68 | 544590443823 69 | 544590495428 70 | 544590739019 71 | 544597415143 72 | 544597551179 73 | 544692860161 74 | 544700720638 75 | 544700880714 76 | 544702884258 77 | 544737742294 78 | 544744588720 79 | 544774556701 80 | 544775249142 81 | 544779266824 82 | 545206651780 83 | 544779402784 84 | 544781270700 85 | 544799011571 86 | 544799655310 87 | 545084538881 88 | 544799699591 89 | 544814257257 90 | 544814533547 91 | 523047682715 92 | 545354152439 93 | 527342726716 94 | 527343474863 95 | 543241031871 96 | 534487039093 97 | 534487431525 98 | 547707135012 99 | 530548026526 100 | 530567177173 101 | 102 | -------------------------------------------------------------------------------- /img_links.txt: -------------------------------------------------------------------------------- 1 | 544548445329,https://img.alicdn.com/bao/uploaded/i1/TB1sbuhQXXXXXawXFXXXXXXXXXX_!!0-item_pic.jpg 2 | 544548003932,https://img.alicdn.com/bao/uploaded/i2/TB16ZCeQXXXXXcWXFXXXXXXXXXX_!!0-item_pic.jpg 3 | 544528534682,https://img.alicdn.com/bao/uploaded/i3/TB1gPJ3QXXXXXb6XVXXXXXXXXXX_!!0-item_pic.jpg 4 | 544609679174,https://img.alicdn.com/bao/uploaded/i2/TB1DwyeQXXXXXXzXVXXXXXXXXXX_!!0-item_pic.jpg 5 | 543311930274,https://img.alicdn.com/bao/uploaded/i2/TB1JlFPQXXXXXXtapXXXXXXXXXX_!!0-item_pic.jpg 6 | 544492192140,https://img.alicdn.com/bao/uploaded/i3/TB1f_8VQXXXXXcDaXXXXXXXXXXX_!!0-item_pic.jpg 7 | 544547501317,https://img.alicdn.com/bao/uploaded/i3/TB13mdUQXXXXXcWaXXXXXXXXXXX_!!0-item_pic.jpg 8 | 123,345 9 | 12,ok 10 | , 11 | 543322475402,https://img.alicdn.com/bao/uploaded/i3/TB1DmivQXXXXXcJXXXXXXXXXXXX_!!0-item_pic.jpg 12 | 544543339488,https://img.alicdn.com/bao/uploaded/i2/TB1SY5fQXXXXXaRXFXXXXXXXXXX_!!0-item_pic.jpg 13 | 534708152356,https://img.alicdn.com/bao/uploaded/i3/TB1kuifQXXXXXcWXpXXXXXXXXXX_!!0-item_pic.jpg 14 | 544525138573,https://img.alicdn.com/bao/uploaded/i4/TB1lmlQQXXXXXXMapXXXXXXXXXX_!!0-item_pic.jpg 15 | 544545603384,https://img.alicdn.com/bao/uploaded/i1/TB1gxipQXXXXXaCXpXXXXXXXXXX_!!0-item_pic.jpg 16 | 537689268308,https://img.alicdn.com/bao/uploaded/i4/TB1lS9gQXXXXXaIXFXXXXXXXXXX_!!0-item_pic.jpg 17 | 544609935330,https://img.alicdn.com/bao/uploaded/i4/TB1s1mdQXXXXXbAXFXXXXXXXXXX_!!0-item_pic.jpg 18 | 545091392968,https://img.alicdn.com/bao/uploaded/i1/TB1uVayQXXXXXcFXXXXXXXXXXXX_!!0-item_pic.jpg 19 | 544521136983,https://img.alicdn.com/bao/uploaded/i1/TB1xhCyQXXXXXaeXXXXXXXXXXXX_!!0-item_pic.jpg 20 | 544515517081,https://img.alicdn.com/bao/uploaded/i4/TB1y.lTQXXXXXcraXXXXXXXXXXX_!!0-item_pic.jpg 21 | 544576079443,https://img.alicdn.com/bao/uploaded/i3/TB1XCegQXXXXXX5XFXXXXXXXXXX_!!0-item_pic.jpg 22 | 544609655317,https://img.alicdn.com/bao/uploaded/i1/TB13PyXQXXXXXXOXVXXXXXXXXXX_!!0-item_pic.jpg 23 | 544549756290,https://img.alicdn.com/bao/uploaded/i4/TB1Is9jQXXXXXanXFXXXXXXXXXX_!!0-item_pic.jpg 24 | 544554484050,https://img.alicdn.com/bao/uploaded/i4/TB15sXNQXXXXXXCapXXXXXXXXXX_!!0-item_pic.jpg 25 | 544557514995,https://img.alicdn.com/bao/uploaded/i4/TB1kM9eQXXXXXcNXFXXXXXXXXXX_!!0-item_pic.jpg 26 | 544578291151,https://img.alicdn.com/bao/uploaded/i3/TB12alKQXXXXXciapXXXXXXXXXX_!!0-item_pic.jpg 27 | 543306725816,https://img.alicdn.com/bao/uploaded/i1/TB18_xMQXXXXXaCapXXXXXXXXXX_!!0-item_pic.jpg 28 | 544520740452,https://img.alicdn.com/bao/uploaded/i1/TB1HiezQXXXXXazXXXXXXXXXXXX_!!0-item_pic.jpg 29 | 30 | -------------------------------------------------------------------------------- /link_ids.txt: -------------------------------------------------------------------------------- 1 | 544914567850 2 | --------------------------------------------------------------------------------