BuffMain.py 74 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406
  1. import sys
  2. from stringprep import in_table_c11
  3. from PyQt6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QWidget, QPushButton, QTabWidget, \
  4. QLabel, QLineEdit, QTextEdit, QFormLayout, QMessageBox, QTreeWidget, QTreeWidgetItem, QDialog, \
  5. QVBoxLayout as QDialogVBoxLayout, QLineEdit as QDialogLineEdit, QDialogButtonBox, QCheckBox, QComboBox
  6. from PyQt6.QtCore import Qt
  7. import requests as req
  8. import time, random, numpy as np
  9. import threading
  10. import asyncio
  11. import json
  12. from PyQt6.QtWidgets import QFileDialog
  13. from PyQt6.QtCore import pyqtSignal, QObject, pyqtSlot
  14. import sqlite3
  15. from CollectibleDialog import CollectibleDialog
  16. from AppearanceDialog import AppearanceDialog
  17. from TypeDialog import TypeDialog
  18. from QualityDialog import QualityDialog
  19. from CategoryDialog import CategoryDialog
  20. from SelectLogDialog import SelectLogDialog
  21. from InitDB import InitDB
  22. from BUFFAPI import BUFFAPI
  23. from BUFFXP import BUFFXP
  24. from datetime import datetime
  25. class MainWindow(QMainWindow):
  26. # 定义一个信号,用于传递日志信息
  27. log_added = pyqtSignal(str, str, str, str, str, str, str, str)
  28. def __init__(self):
  29. super().__init__()
  30. # 设置一个选品停止的flag
  31. self.stop_selecting_flag = False
  32. # 向BUFF选品日志列表中写内容的槽函数
  33. self.log_added.connect(self._add_select_log) # 连接信号到槽函数
  34. # 初始化数据库
  35. InitDB.init_db()
  36. self.xp_goodsurl = 'https://buff.163.com/api/market/goods'
  37. self.xp_getPaintwearChoicesUrl = 'https://buff.163.com/api/market/goods/info?goods_id='
  38. self.xp_getPriceUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&page_num=1&sort_by=price.asc&goods_id='
  39. self.xp_my_headers = {
  40. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
  41. "Host": "buff.163.com",
  42. "Referer": "https://buff.163.com/market/?game=csgo",
  43. "X-Requested-With": "XMLHttpRequest"
  44. }
  45. # todo 为了测试 page_size = 1
  46. self.sh_getToBuyUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&allow_epay=1&allow_tradable_cooldown=1&page_num=1&page_size=1&sort_by=price.asc&goods_id='
  47. self.sh_buyGoodsUrl = 'https://buff.163.com/api/market/goods/buy'
  48. # self.sh_getToBuyUrl = 'https://buff.163.com/api/market/goods/sell_order?game=csgo&allow_epay=1&allow_tradable_cooldown=1&page_num=1&page_size=95&sort_by=price.asc&goods_id='
  49. self.sh_fbjUrl= 'https://buff.163.com/api/market/bill_order/ask_seller_to_send_offer'
  50. self.sh_my_headers = {
  51. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
  52. "Host": "buff.163.com",
  53. "Referer": "https://buff.163.com/market/?game=csgo",
  54. "X-Requested-With": "XMLHttpRequest"
  55. }
  56. # 初始化 phone_edit_map
  57. self.setup_phone_edit_map()
  58. # 设置窗口标题和大小
  59. self.setWindowTitle("垂直布局示例")
  60. self.setGeometry(100, 100, 1500, 800)
  61. # 创建一个垂直布局
  62. layout = QVBoxLayout()
  63. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保垂直布局内容靠左对齐
  64. # 创建一个水平布局来放置按钮
  65. button_layout = QHBoxLayout()
  66. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保水平布局内容靠左对齐
  67. # 创建两个按钮
  68. button1 = QPushButton("选品")
  69. # 增加停止选品和停止扫货按钮
  70. stop_select_button = QPushButton("停止选品")
  71. button_layout.addWidget(button1)
  72. button_layout.addWidget(stop_select_button)
  73. # 连接按钮的点击事件
  74. button1.clicked.connect(self.show_selected_phone_number)
  75. stop_select_button.clicked.connect(self.stop_selecting) # 新增连接停止选品按钮的点击事件
  76. button_sh = QPushButton("扫货")
  77. button_layout.addWidget(button_sh)
  78. button_sh.clicked.connect(self.beginSH)
  79. button_stop_sh = QPushButton("停止扫货")
  80. button_layout.addWidget(button_stop_sh)
  81. button_stop_sh.clicked.connect(self.stopSH)
  82. # 将水平布局添加到垂直布局中
  83. layout.addLayout(button_layout)
  84. # 创建一个Tab容器
  85. self.tab_widget = QTabWidget()
  86. # 向Tab容器中添加10个标签页
  87. for i in range(1, 11): # 修改循环范围以添加第11个标签页
  88. tab = QWidget()
  89. tab_layout = QVBoxLayout()
  90. # tab_layout.setAlignment(Qt.AlignmentFlag.AlignVCenter) # 确保标签页布局内容靠左对齐
  91. if i == 1:
  92. form_layout = self.create_account_info_form("选品")
  93. tab_layout.addLayout(form_layout)
  94. elif i == 2:
  95. tree_layout = self.create_category_info_form()
  96. tab_layout.addLayout(tree_layout)
  97. elif i == 3:
  98. quality_layout = self.create_quality_info_form()
  99. tab_layout.addLayout(quality_layout)
  100. elif i == 4:
  101. type_layout = self.create_type_info_form()
  102. tab_layout.addLayout(type_layout)
  103. elif i == 5:
  104. appearance_layout = self.create_appearance_info_form()
  105. tab_layout.addLayout(appearance_layout)
  106. elif i == 6:
  107. collectible_layout = self.create_collectible_info_form()
  108. tab_layout.addLayout(collectible_layout)
  109. elif i == 7:
  110. config_layout = self.create_config_info_form("选品")
  111. tab_layout.addLayout(config_layout)
  112. elif i == 8:
  113. select_log_layout = self.create_select_log_info_form() # 添加BUFF选品日志标签页
  114. tab_layout.addLayout(select_log_layout)
  115. elif i == 9:
  116. shzhtab_layout = self.setup_shzhtab()
  117. tab_layout.addLayout(shzhtab_layout)
  118. elif i == 10:
  119. shpztab_layout = self.setup_shpztab()
  120. tab_layout.addLayout(shpztab_layout)
  121. else:
  122. label = QLabel(f"这是标签页 {i}")
  123. tab_layout.addWidget(label)
  124. tab.setLayout(tab_layout)
  125. if i == 1:
  126. self.tab_widget.addTab(tab, "选品账号信息")
  127. elif i == 2:
  128. self.tab_widget.addTab(tab, "BUFF品类信息")
  129. elif i == 3:
  130. self.tab_widget.addTab(tab, "BUFF品质信息")
  131. elif i == 4:
  132. self.tab_widget.addTab(tab, "BUFFTYPE信息")
  133. elif i == 5:
  134. self.tab_widget.addTab(tab, "BUFF外观信息")
  135. elif i == 6:
  136. self.tab_widget.addTab(tab, "BUFF收藏品信息")
  137. elif i == 7:
  138. self.tab_widget.addTab(tab, "BUFF选品配置")
  139. elif i == 8:
  140. self.tab_widget.addTab(tab, "BUFF选品日志")
  141. elif i == 9:
  142. self.tab_widget.addTab(tab, "扫货账号信息")
  143. elif i == 10:
  144. self.tab_widget.addTab(tab, "扫货配置信息")
  145. # 将Tab容器添加到布局中
  146. layout.addWidget(self.tab_widget)
  147. # 创建一个中心部件,并将布局设置为中心部件的布局
  148. container = QWidget()
  149. container.setLayout(layout)
  150. # 将中心部件设置为主窗口的中心部件
  151. self.setCentralWidget(container)
  152. # 扫货时候关闭选品 选品时候关闭扫货 todo
  153. def beginSH(self):
  154. print('开始扫货')
  155. self.stop_shopping_flag = False
  156. # 必填条件,没有则跳出
  157. self.sh_phone_number = self.sh_phone_edit.text()
  158. QMessageBox.information(self, "扫货手机号码", f"扫货手机号码: {self.sh_phone_number}")
  159. # 判断phone_number是否为空,为空则跳出方法
  160. if not self.sh_phone_number:
  161. QMessageBox.information(self, "扫货手机号码", "扫货手机号码不能为空")
  162. return
  163. # 判断扫货cookie是否为空,为空则退出方法
  164. self.sh_cookie_text = self.sh_cookie_edit.toPlainText()
  165. QMessageBox.information(self, "扫货Cookie", f"扫货Cookie: {self.sh_cookie_text}")
  166. if not self.sh_cookie_text:
  167. QMessageBox.information(self, "扫货Cookie", "扫货Cookie不能为空")
  168. return
  169. # 判断扫货xcsrftoken是否为空,为空则退出方法
  170. self.sh_xcsrftoken_text = self.sh_xcsrftoken_edit.toPlainText()
  171. QMessageBox.information(self, "扫货xcsrftoken", f"扫货xcsrftoken: {self.sh_xcsrftoken_text}")
  172. if not self.sh_xcsrftoken_text:
  173. QMessageBox.information(self, "扫货xcsrftoken", "扫货xcsrftoken不能为空")
  174. return
  175. try:
  176. # 获取扫货线程self.shpz_thread_count_edit的值
  177. self.shpz_thread_count = int(self.shpz_thread_count_edit.text())
  178. if self.shpz_thread_count > 0 :
  179. j = 0
  180. while j < self.shpz_thread_count:
  181. print(f'开启扫货线程 - {j+1}')
  182. thread_BUFFSH = threading.Thread(target=self.BUFFSH,args=(j+1))
  183. thread_BUFFSH.start()
  184. j += 1
  185. except Exception as e:
  186. print(f"Error: {e}")
  187. def BUFFSH(self, thread_num):
  188. while True:
  189. print(f'BUFFSH线程 - {thread_num}')
  190. if self.stop_selecting_flag:
  191. print(f'人工停止扫货')
  192. return
  193. # 获取BUFF选品日志标签页列表中的数据
  194. sh_start_time = 0
  195. # 间隔扫货
  196. for i1 in range(self.select_log_tree_widget.topLevelItemCount()):
  197. if self.stop_selecting_flag:
  198. print(f'人工停止扫货')
  199. return
  200. #假设为10条数据,三个进程,第1,4,7由第一个进程处理 第2,5,8由第二个进程处理
  201. if i1 % self.shpz_thread_count == thread_num - 1:
  202. item = self.select_log_tree_widget.topLevelItem(i1)
  203. if self.stop_shopping_flag:
  204. print(f'人工停止扫货')
  205. return
  206. goods_id = item.text(1)
  207. goods_min_wear = item.text(3)
  208. goods_max_wear = item.text(4)
  209. goods_buy_price = item.text(6)
  210. # 请求BUFF 商品信息列表,获取可以购买的商品
  211. current_time = time.time()
  212. time_since_last_request = current_time - sh_start_time
  213. if time_since_last_request < float(self.shpz_pause_time_edit.text()):
  214. wait_time = float(self.shpz_pause_time_edit.text()) - time_since_last_request
  215. print(f"暂停 {wait_time:.2f} seconds before making the next request.")
  216. time.sleep(wait_time)
  217. goods_items_list = self.getGoodsInfo(goods_id, goods_min_wear, goods_max_wear, goods_buy_price)
  218. for goods_item in goods_items_list:
  219. if self.stop_selecting_flag:
  220. print(f'人工停止扫货')
  221. return
  222. # post请求购买接口
  223. try:
  224. print(f"商品ID: {goods_item['goods_id']} 订单id: {goods_item['id']} 购买价格: {goods_item['price']}")
  225. api_data ={
  226. "game": "csgo",
  227. "goods_id": goods_item['goods_id'],
  228. "sell_order_id": goods_item['id'],
  229. "price": goods_item['price'],
  230. "pay_method": 1,
  231. "allow_tradable_cooldown": 0,
  232. "token": "",
  233. "cdkey_id": "",
  234. "hide_non_epay": False
  235. }
  236. api_header = {
  237. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
  238. "Host": "buff.163.com", "X-Requested-With": "XMLHttpRequest",
  239. 'Referer': f"https://buff.163.com/goods/{goods_item['goods_id']}?from=market",
  240. 'Cookie': self.sh_cookie_text,
  241. 'x-csrftoken': self.sh_cookie_text}
  242. # todo
  243. print(f'api_header: {api_header}')
  244. res = req.post(self.sh_buyGoodsUrl, headers=api_header, data=api_data)
  245. print(f'post 请求 {self.buyGoodsUrl} 返回报文: {res.text.strip()}')
  246. if res.json()['code'] == 'OK':
  247. print(f'购买成功')
  248. except Exception as e:
  249. print(f'购买商品信息接口请求--失败', e)
  250. finally:
  251. sh_start_time = time.time()
  252. # # 结束时间为当前时间
  253. # end_time = time.time()
  254. # # 从start_time到end_time 必须修改pause_time秒
  255. # if float(end_time - start_time) < float(self.pause_time_edit.text()):
  256. # time.sleep(float(self.pause_time_edit.text()) - (end_time - start_time) + random.randint(0, 5))
  257. print(f'停止扫货')
  258. def getGoodsInfo(self, goods_id, goods_min_wear, goods_max_wear, goods_buy_price):
  259. # 获取当前时间戳
  260. timestamp = time.time()
  261. # 将时间戳转换为datetime对象
  262. dt_object = datetime.fromtimestamp(timestamp)
  263. print(f"{dt_object.strftime('%Y-%m-%d %H:%M:%S')}获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息")
  264. # 开始时间为当前时间
  265. goods_id_list = []
  266. start_time = time.time()
  267. self.sh_my_headers.update({
  268. 'Cookie': self.sh_cookie_text
  269. })
  270. try:
  271. # todo 为了测试,先去除磨损区间
  272. # api_url = f'{self.getToBuyUrl}{goods_id}&min_price=0&max_price={goods_buy_price}&min_paintwear={goods_min_wear}&max_paintwear={goods_max_wear}'
  273. api_url = f'{self.sh_getToBuyUrl}{goods_id}&min_price=0&max_price={goods_buy_price}'
  274. # print(f'api_url = {api_url}')
  275. api2_res = req.get(api_url, headers=self.sh_my_headers)
  276. # print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息的返回报文: {api2_res.text.strip()}')
  277. data = api2_res.json()['data']
  278. # 如果data中的code不等于OK,则跳出循环
  279. if api2_res.json()['code'] != 'OK':
  280. print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息请求返回报文: {api2_res.text.strip()}')
  281. print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息接口请求返回报文code不等于OK,跳出循环')
  282. return
  283. goods_id_list = data['items']
  284. print(f"获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息:", len(goods_id_list))
  285. except Exception as e:
  286. print(f'获取商品id:{goods_id}的在磨损区间{goods_min_wear}-{goods_max_wear}是否有低于{goods_buy_price}的商品信息接口请求--失败', e)
  287. finally:
  288. # # # 结束时间为当前时间
  289. # end_time = time.time()
  290. # # 从start_time到end_time 必须修改pause_time秒
  291. # if float(end_time - start_time) < float(self.pause_time_edit.text()):
  292. # time.sleep(float(self.pause_time_edit.text()) - (end_time - start_time) )
  293. return goods_id_list
  294. def stopSH(self):
  295. # 在这里添加停止扫货的逻辑
  296. # 设置扫货停止标志为True
  297. self.stop_shopping_flag = True
  298. QMessageBox.information(self, "停止扫货", "扫货操作已终止")
  299. def setup_shpztab(self):
  300. # 创建表单布局
  301. form_layout = QFormLayout()
  302. # 添加输入字段
  303. self.shpz_pause_time_edit = QLineEdit()
  304. self.shpz_pause_time_edit.setFixedWidth(500)
  305. form_layout.addRow("API接口请求暂停时间(秒)", self.shpz_pause_time_edit)
  306. # 添加扫货线程数输入字段
  307. self.shpz_thread_count_edit = QLineEdit()
  308. self.shpz_thread_count_edit.setFixedWidth(500)
  309. form_layout.addRow("扫货线程数", self.shpz_thread_count_edit)
  310. # 创建主布局
  311. main_layout = QVBoxLayout()
  312. main_layout.addLayout(form_layout)
  313. # 创建保存按钮
  314. self.shpz_save_button = QPushButton("保存")
  315. self.shpz_save_button.clicked.connect(self.shpz_save_settings)
  316. self.shpz_save_button.setFixedSize(100, 50)
  317. # 创建一个水平布局来放置保存按钮
  318. button_layout = QHBoxLayout()
  319. button_layout.setContentsMargins(300, 0, 0, 0)
  320. button_layout.addWidget(self.shpz_save_button, alignment=Qt.AlignmentFlag.AlignLeft)
  321. # 将垂直布局添加到表单布局中
  322. form_layout.addRow(button_layout)
  323. form_layout.setContentsMargins(300, 0, 0, 0)
  324. # 添加pause_time_edit到主布局
  325. main_layout.addWidget(self.shpz_pause_time_edit)
  326. main_layout.addWidget(self.shpz_thread_count_edit)
  327. # 加载默认值
  328. self.load_shpz_settings_from_db()
  329. return main_layout
  330. def shpz_save_settings(self):
  331. import sqlite3
  332. # 连接到SQLite数据库(如果数据库不存在,则会自动创建)
  333. conn = sqlite3.connect('buff.db')
  334. c = conn.cursor()
  335. c.execute('DELETE FROM shpz_settings')
  336. # 插入数据
  337. c.execute("INSERT INTO shpz_settings (pause_time, thread_count) VALUES (?, ?)",
  338. (float(self.shpz_pause_time_edit.text()), int(self.shpz_thread_count_edit.text())))
  339. # 提交更改并关闭连接
  340. conn.commit()
  341. conn.close()
  342. QMessageBox.information(self, "成功", "设置已保存")
  343. def load_shpz_settings_from_db(self):
  344. import sqlite3
  345. # 连接到SQLite数据库
  346. conn = sqlite3.connect('buff.db')
  347. c = conn.cursor()
  348. # 查询数据
  349. c.execute("SELECT pause_time, thread_count FROM shpz_settings LIMIT 1")
  350. default_value = c.fetchone()
  351. # 设置默认值
  352. pause_time_default = default_value[0] if default_value else "5"
  353. thread_count_default = default_value[1] if default_value else "1" # 默认扫货线程数为1
  354. # 设置输入字段的默认值
  355. self.shpz_pause_time_edit.setText(str(pause_time_default))
  356. self.shpz_thread_count_edit.setText(str(thread_count_default))
  357. # 关闭数据库连接
  358. conn.close()
  359. def setup_shzhtab(self):
  360. # 创建表单布局
  361. form_layout = QFormLayout()
  362. # 从数据库中获取默认值
  363. conn = sqlite3.connect('buff.db')
  364. c = conn.cursor()
  365. c.execute("SELECT phone, email, code, cookie,xcsrftoken FROM sh_account_info LIMIT 1")
  366. default_values = c.fetchone()
  367. conn.close()
  368. # 设置默认值
  369. phone_default = default_values[0] if default_values else "17756576757"
  370. email_default = default_values[1] if default_values else "704541015@qq.com"
  371. code_default = default_values[2] if default_values else "0012312"
  372. cookie_default = default_values[3] if default_values else ""
  373. xcsrftoken_default = default_values[3] if default_values else ""
  374. # 添加输入字段
  375. self.sh_phone_edit = QLineEdit(phone_default)
  376. self.sh_email_edit = QLineEdit(email_default)
  377. self.sh_code_edit = QLineEdit(code_default)
  378. self.sh_cookie_edit = QTextEdit(cookie_default)
  379. self.sh_xcsrftoken_edit = QTextEdit(xcsrftoken_default)
  380. # 设置输入字段的宽度
  381. self.sh_phone_edit.setFixedWidth(500)
  382. self.sh_email_edit.setFixedWidth(500)
  383. self.sh_code_edit.setFixedWidth(500)
  384. self.sh_cookie_edit.setFixedWidth(500)
  385. self.sh_xcsrftoken_edit.setFixedWidth(500)
  386. form_layout.addRow("扫货手机号码", self.sh_phone_edit)
  387. form_layout.addRow("扫货邮箱号", self.sh_email_edit)
  388. form_layout.addRow("扫货邮箱特殊代码", self.sh_code_edit)
  389. form_layout.addRow("扫货cookie", self.sh_cookie_edit)
  390. form_layout.addRow("扫货xcsrftoken", self.sh_xcsrftoken_edit)
  391. # 创建主布局
  392. main_layout = QVBoxLayout()
  393. main_layout.addLayout(form_layout)
  394. # 连接保存按钮信号和槽
  395. self.sh_save_button = QPushButton("保存")
  396. self.sh_save_button.clicked.connect(self.save_sh_account_info)
  397. self.sh_save_button.setFixedSize(100, 50)
  398. # 创建一个水平布局来放置保存按钮
  399. button_layout = QHBoxLayout()
  400. button_layout.setContentsMargins(300, 0, 0, 0)
  401. button_layout.addWidget(self.sh_save_button, alignment=Qt.AlignmentFlag.AlignLeft)
  402. # 将垂直布局添加到表单布局中
  403. form_layout.addRow(button_layout)
  404. form_layout.setContentsMargins(300, 0, 0, 0)
  405. return main_layout
  406. def save_sh_account_info(self):
  407. import sqlite3
  408. # 连接到SQLite数据库(如果数据库不存在,则会自动创建)
  409. conn = sqlite3.connect('buff.db')
  410. c = conn.cursor()
  411. c.execute('DELETE FROM sh_account_info')
  412. # 插入数据
  413. c.execute("INSERT INTO sh_account_info (phone, email, code, cookie,xcsrftoken) VALUES (?, ?, ?, ?,?)",
  414. (self.sh_phone_edit.text(), self.sh_email_edit.text(), self.sh_code_edit.text(),
  415. self.sh_cookie_edit.toPlainText(), self.sh_xcsrftoken_edit.toPlainText()))
  416. # 提交更改并关闭连接
  417. conn.commit()
  418. conn.close()
  419. QMessageBox.information(self, "成功", "扫货账号信息已保存")
  420. def create_account_info_form(self, prefix):
  421. form_layout = QFormLayout()
  422. # 从sqlite中accounts获取信息,降数据库中得到值填到输入框中
  423. # 从数据库中获取默认值
  424. conn = sqlite3.connect('buff.db')
  425. c = conn.cursor()
  426. c.execute("SELECT phone_number, email, email_alias, cookie FROM accounts LIMIT 1")
  427. default_values = c.fetchone()
  428. conn.close()
  429. # 设置默认值
  430. phone_default = default_values[0] if default_values else "17756576757"
  431. email_default = default_values[1] if default_values else "704541015@qq.com"
  432. code_default = default_values[2] if default_values else "0012312"
  433. cookie_default = default_values[3] if default_values else ""
  434. # 创建输入框及其标签
  435. phone_label = QLabel(f"{prefix}手机号码")
  436. phone_edit = QLineEdit()
  437. phone_edit.setFixedWidth(500) # 设置固定宽度为500像素
  438. phone_edit.setText(phone_default) # 设置选品手机号码默认值
  439. form_layout.addRow(phone_label, phone_edit)
  440. email_label = QLabel(f"{prefix}邮箱号")
  441. email_edit = QLineEdit()
  442. email_edit.setFixedWidth(500) # 设置固定宽度为500像素
  443. email_edit.setText(email_default) # 设置选品邮箱号默认值
  444. form_layout.addRow(email_label, email_edit)
  445. email_alias_label = QLabel(f"{prefix}邮箱特殊代码")
  446. email_alias_edit = QLineEdit()
  447. email_alias_edit.setFixedWidth(500) # 设置固定宽度为500像素
  448. email_alias_edit.setText(code_default) # 设置选品邮箱特殊代码默认值
  449. form_layout.addRow(email_alias_label, email_alias_edit)
  450. cookie_label = QLabel(f"{prefix}cookie")
  451. cookie_edit = QTextEdit() # 使用QTextEdit代替QLineEdit
  452. cookie_edit.setFixedWidth(500) # 设置固定宽度为500像素
  453. cookie_edit.setText(cookie_default) # 设置选品cookie默认值
  454. form_layout.addRow(cookie_label, cookie_edit)
  455. # 保存输入框的引用以便后续访问
  456. self.phone_edit_map[prefix] = phone_edit
  457. self.email_edit_map[prefix] = email_edit
  458. self.email_alias_edit_map[prefix] = email_alias_edit
  459. # 添加保存按钮
  460. save_button = QPushButton("保存")
  461. save_button.clicked.connect(self.save_account_info)
  462. save_button.setFixedSize(100, 50) # 设置固定宽度为500像素
  463. # 创建一个水平布局来放置保存按钮
  464. button_layout = QHBoxLayout()
  465. button_layout.setContentsMargins(300, 0, 0, 0)
  466. button_layout.addWidget(save_button, alignment=Qt.AlignmentFlag.AlignLeft)
  467. # 将垂直布局添加到表单布局中
  468. form_layout.addRow(button_layout)
  469. form_layout.setContentsMargins(300, 0, 0, 0)
  470. return form_layout
  471. def save_account_info(self):
  472. phone_number = self.phone_edit_map["选品"].text()
  473. # 获取选品邮箱号
  474. email = self.email_edit_map["选品"].text()
  475. email_alias = self.email_alias_edit_map["选品"].text()
  476. cookie = self.phone_edit_map["选品"].parent().findChild(QTextEdit).toPlainText()
  477. if not phone_number or not email or not email_alias or not cookie:
  478. QMessageBox.warning(self, "保存账号信息", "所有字段都必须填写")
  479. return
  480. try:
  481. conn = sqlite3.connect('buff.db')
  482. cursor = conn.cursor()
  483. cursor.execute('delete from accounts ')
  484. cursor.execute('''
  485. INSERT INTO accounts (phone_number, email, email_alias, cookie)
  486. VALUES (?, ?, ?, ?)
  487. ''', (phone_number, email, email_alias, cookie))
  488. conn.commit()
  489. conn.close()
  490. QMessageBox.information(self, "保存账号信息", "账号信息已成功保存")
  491. except Exception as e:
  492. QMessageBox.critical(self, "保存账号信息", f"保存账号信息时发生错误: {e}")
  493. def create_category_info_form(self):
  494. layout = QVBoxLayout()
  495. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  496. # 创建树形控件
  497. self.tree_widget = QTreeWidget()
  498. self.tree_widget.setHeaderLabels(["选择", "品类名称", "品类编码"])
  499. self.tree_widget.setColumnCount(3)
  500. self.tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  501. self.tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  502. self.tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  503. self.tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  504. # 启用复选框
  505. self.tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  506. self.tree_widget.setColumnWidth(1, 300) # 设置品类名称列的宽度
  507. self.tree_widget.setColumnWidth(2, 150) # 设置品类编码列的宽度
  508. self.tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "品类名称", "品类编码"])) # 设置表头
  509. self.tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  510. # 添加默认的品类信息
  511. conn = sqlite3.connect('buff.db')
  512. c = conn.cursor()
  513. c.execute("SELECT name,code,selected FROM categories ")
  514. rows = c.fetchall()
  515. for row in rows:
  516. item = QTreeWidgetItem(self.tree_widget)
  517. item.setText(1, row[0])
  518. item.setText(2, row[1])
  519. checkbox = QCheckBox()
  520. #row[2]为1 设置成True ,为0 设置成False
  521. checkbox.setChecked(True if row[2] == 1 else False)
  522. self.tree_widget.setItemWidget(item, 0, checkbox)
  523. conn.close()
  524. layout.addWidget(self.tree_widget)
  525. # 创建按钮布局
  526. button_layout = QHBoxLayout()
  527. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  528. # 创建添加按钮
  529. add_button = QPushButton("添加")
  530. add_button.clicked.connect(self.add_category)
  531. button_layout.addWidget(add_button)
  532. # 创建删除按钮
  533. delete_button = QPushButton("删除")
  534. delete_button.clicked.connect(self.delete_category)
  535. button_layout.addWidget(delete_button)
  536. # 创建编辑按钮
  537. edit_button = QPushButton("编辑")
  538. edit_button.clicked.connect(self.edit_category)
  539. button_layout.addWidget(edit_button)
  540. # 创建保存按钮
  541. save_button = QPushButton("保存")
  542. save_button.clicked.connect(self.save_categories)
  543. button_layout.addWidget(save_button)
  544. layout.addLayout(button_layout)
  545. return layout
  546. def add_category(self):
  547. CategoryDialog.add_category(self)
  548. def delete_category(self):
  549. CategoryDialog.delete_category(self)
  550. def edit_category(self):
  551. CategoryDialog.edit_category(self)
  552. def save_categories(self):
  553. CategoryDialog.save_categories(self)
  554. def create_quality_info_form(self):
  555. layout = QVBoxLayout()
  556. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  557. # 创建树形控件
  558. self.quality_tree_widget = QTreeWidget()
  559. self.quality_tree_widget.setHeaderLabels(["选择", "品质编码", "品质名称"])
  560. self.quality_tree_widget.setColumnCount(3)
  561. self.quality_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  562. self.quality_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  563. self.quality_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  564. self.quality_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  565. # 启用复选框
  566. self.quality_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  567. self.quality_tree_widget.setColumnWidth(1, 150) # 设置品质编码列的宽度
  568. self.quality_tree_widget.setColumnWidth(2, 300) # 设置品质名称列的宽度
  569. self.quality_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "品质编码", "品质名称"])) # 设置表头
  570. self.quality_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  571. # 添加默认的品质信息
  572. conn = sqlite3.connect('buff.db')
  573. c = conn.cursor()
  574. c.execute("SELECT name,code,selected FROM qualities ")
  575. rows = c.fetchall()
  576. for row in rows:
  577. item = QTreeWidgetItem(self.quality_tree_widget)
  578. item.setText(1, row[1])
  579. item.setText(2, row[0])
  580. checkbox = QCheckBox()
  581. #row[2]为1 设置成True ,为0 设置成False
  582. checkbox.setChecked(True if row[2] == 1 else False)
  583. self.quality_tree_widget.setItemWidget(item, 0, checkbox)
  584. conn.close()
  585. layout.addWidget(self.quality_tree_widget)
  586. # 创建按钮布局
  587. button_layout = QHBoxLayout()
  588. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  589. # 创建添加按钮
  590. add_button = QPushButton("添加")
  591. add_button.clicked.connect(self.add_quality)
  592. button_layout.addWidget(add_button)
  593. # 创建删除按钮
  594. delete_button = QPushButton("删除")
  595. delete_button.clicked.connect(self.delete_quality)
  596. button_layout.addWidget(delete_button)
  597. # 创建编辑按钮
  598. edit_button = QPushButton("编辑")
  599. edit_button.clicked.connect(self.edit_quality)
  600. button_layout.addWidget(edit_button)
  601. # 创建保存按钮
  602. save_button = QPushButton("保存")
  603. save_button.clicked.connect(self.save_qualities)
  604. button_layout.addWidget(save_button)
  605. layout.addLayout(button_layout)
  606. return layout
  607. def add_quality(self):
  608. QualityDialog.add_quality(self)
  609. def delete_quality(self):
  610. QualityDialog.delete_quality(self)
  611. def edit_quality(self):
  612. QualityDialog.edit_quality(self)
  613. def save_qualities(self):
  614. QualityDialog.save_qualities(self)
  615. def create_type_info_form(self):
  616. layout = QVBoxLayout()
  617. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  618. # 创建树形控件
  619. self.type_tree_widget = QTreeWidget()
  620. self.type_tree_widget.setHeaderLabels(["选择", "type编码", "type名称"])
  621. self.type_tree_widget.setColumnCount(3)
  622. self.type_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  623. self.type_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  624. self.type_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  625. self.type_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  626. # 启用复选框
  627. self.type_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  628. self.type_tree_widget.setColumnWidth(1, 150) # 设置type编码列的宽度
  629. self.type_tree_widget.setColumnWidth(2, 300) # 设置type名称列的宽度
  630. self.type_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "type编码", "type名称"])) # 设置表头
  631. self.type_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  632. # 添加默认的type信息
  633. conn = sqlite3.connect('buff.db')
  634. c = conn.cursor()
  635. c.execute("SELECT name,code,selected FROM types ")
  636. rows = c.fetchall()
  637. for row in rows:
  638. item = QTreeWidgetItem(self.type_tree_widget)
  639. item.setText(1, row[1])
  640. item.setText(2, row[0])
  641. checkbox = QCheckBox()
  642. #row[2]为1 设置成True ,为0 设置成False
  643. checkbox.setChecked(True if row[2] == 1 else False)
  644. self.type_tree_widget.setItemWidget(item, 0, checkbox)
  645. conn.close()
  646. layout.addWidget(self.type_tree_widget)
  647. # 创建按钮布局
  648. button_layout = QHBoxLayout()
  649. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  650. # 创建添加按钮
  651. add_button = QPushButton("添加")
  652. add_button.clicked.connect(self.add_type)
  653. button_layout.addWidget(add_button)
  654. # 创建删除按钮
  655. delete_button = QPushButton("删除")
  656. delete_button.clicked.connect(self.delete_type)
  657. button_layout.addWidget(delete_button)
  658. # 创建编辑按钮
  659. edit_button = QPushButton("编辑")
  660. edit_button.clicked.connect(self.edit_type)
  661. button_layout.addWidget(edit_button)
  662. # 创建保存按钮
  663. save_button = QPushButton("保存")
  664. save_button.clicked.connect(self.save_types)
  665. button_layout.addWidget(save_button)
  666. layout.addLayout(button_layout)
  667. return layout
  668. def add_type(self):
  669. TypeDialog.add_type(self)
  670. def delete_type(self):
  671. TypeDialog.delete_type(self)
  672. def edit_type(self):
  673. TypeDialog.edit_type(self)
  674. def save_types(self):
  675. TypeDialog.save_types(self)
  676. def create_appearance_info_form(self):
  677. layout = QVBoxLayout()
  678. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  679. # 创建树形控件
  680. self.appearance_tree_widget = QTreeWidget()
  681. self.appearance_tree_widget.setHeaderLabels(["选择", "外观编码", "外观名称"])
  682. self.appearance_tree_widget.setColumnCount(3)
  683. self.appearance_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  684. self.appearance_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  685. self.appearance_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  686. self.appearance_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  687. # 启用复选框
  688. self.appearance_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  689. self.appearance_tree_widget.setColumnWidth(1, 150) # 设置外观编码列的宽度
  690. self.appearance_tree_widget.setColumnWidth(2, 300) # 设置外观名称列的宽度
  691. self.appearance_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "外观编码", "外观名称"])) # 设置表头
  692. self.appearance_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  693. # 添加默认的外观信息
  694. conn = sqlite3.connect('buff.db')
  695. c = conn.cursor()
  696. c.execute("SELECT name,code,selected FROM appearances ")
  697. rows = c.fetchall()
  698. for row in rows:
  699. item = QTreeWidgetItem(self.appearance_tree_widget)
  700. item.setText(1, row[1])
  701. item.setText(2, row[0])
  702. checkbox = QCheckBox()
  703. #row[2]为1 设置成True ,为0 设置成False
  704. checkbox.setChecked(True if row[2] == 1 else False)
  705. self.appearance_tree_widget.setItemWidget(item, 0, checkbox)
  706. conn.close()
  707. layout.addWidget(self.appearance_tree_widget)
  708. # 创建按钮布局
  709. button_layout = QHBoxLayout()
  710. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  711. # 创建添加按钮
  712. add_button = QPushButton("添加")
  713. add_button.clicked.connect(self.add_appearance)
  714. button_layout.addWidget(add_button)
  715. # 创建删除按钮
  716. delete_button = QPushButton("删除")
  717. delete_button.clicked.connect(self.delete_appearance)
  718. button_layout.addWidget(delete_button)
  719. # 创建编辑按钮
  720. edit_button = QPushButton("编辑")
  721. edit_button.clicked.connect(self.edit_appearance)
  722. button_layout.addWidget(edit_button)
  723. # 创建保存按钮
  724. save_button = QPushButton("保存")
  725. save_button.clicked.connect(self.save_appearances)
  726. button_layout.addWidget(save_button)
  727. layout.addLayout(button_layout)
  728. return layout
  729. def add_appearance(self):
  730. AppearanceDialog.add_appearance(self)
  731. def delete_appearance(self):
  732. AppearanceDialog.delete_appearance(self)
  733. def edit_appearance(self):
  734. AppearanceDialog.edit_appearance(self)
  735. def save_appearances(self):
  736. AppearanceDialog.save_appearances(self)
  737. def create_collectible_info_form(self):
  738. layout = QVBoxLayout()
  739. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  740. # 创建树形控件
  741. self.collectible_tree_widget = QTreeWidget()
  742. self.collectible_tree_widget.setHeaderLabels(["选择", "收藏品编码", "收藏品名称"])
  743. self.collectible_tree_widget.setColumnCount(3)
  744. self.collectible_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  745. self.collectible_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  746. self.collectible_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  747. self.collectible_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  748. # 启用复选框
  749. self.collectible_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  750. self.collectible_tree_widget.setColumnWidth(1, 150) # 设置收藏品编码列的宽度
  751. self.collectible_tree_widget.setColumnWidth(2, 300) # 设置收藏品名称列的宽度
  752. self.collectible_tree_widget.setHeaderItem(QTreeWidgetItem(["选择", "收藏品编码", "收藏品名称"])) # 设置表头
  753. self.collectible_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  754. # 添加默认的收藏品信息
  755. conn = sqlite3.connect('buff.db')
  756. c = conn.cursor()
  757. c.execute("SELECT name,code,selected FROM collectibles ")
  758. rows = c.fetchall()
  759. for row in rows:
  760. item = QTreeWidgetItem(self.collectible_tree_widget)
  761. item.setText(1, row[1])
  762. item.setText(2, row[0])
  763. checkbox = QCheckBox()
  764. #row[2]为1 设置成True ,为0 设置成False
  765. checkbox.setChecked(True if row[2] == 1 else False)
  766. self.collectible_tree_widget.setItemWidget(item, 0, checkbox)
  767. conn.close()
  768. layout.addWidget(self.collectible_tree_widget)
  769. # 创建按钮布局
  770. button_layout = QHBoxLayout()
  771. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  772. # 创建添加按钮
  773. add_button = QPushButton("添加")
  774. add_button.clicked.connect(self.add_collectible)
  775. button_layout.addWidget(add_button)
  776. # 创建删除按钮
  777. delete_button = QPushButton("删除")
  778. delete_button.clicked.connect(self.delete_collectible)
  779. button_layout.addWidget(delete_button)
  780. # 创建编辑按钮
  781. edit_button = QPushButton("编辑")
  782. edit_button.clicked.connect(self.edit_collectible)
  783. button_layout.addWidget(edit_button)
  784. # 创建保存按钮
  785. save_button = QPushButton("保存")
  786. save_button.clicked.connect(self.save_collectibles)
  787. button_layout.addWidget(save_button)
  788. layout.addLayout(button_layout)
  789. return layout
  790. # 新增收藏品
  791. def add_collectible(self):
  792. CollectibleDialog.add_collectible(self)
  793. # 删除收藏品
  794. def delete_collectible(self):
  795. CollectibleDialog.delete_collectible(self)
  796. # 编辑收藏品
  797. def edit_collectible(self):
  798. CollectibleDialog.edit_collectible(self)
  799. # 保存收藏品
  800. def save_collectibles(self):
  801. CollectibleDialog.save_collectibles(self)
  802. def create_config_info_form(self, prefix):
  803. form_layout = QFormLayout()
  804. form_layout.setAlignment(Qt.AlignmentFlag.AlignVCenter) # 确保表单布局内容靠左对齐
  805. # 从数据库中获取默认值
  806. conn = sqlite3.connect('buff.db')
  807. c = conn.cursor()
  808. c.execute(
  809. "SELECT min_price, max_price, sort_mode, stop_condition, success_count, scan_count, page_size, pause_time, max_pages, ref_price_adjust, sweep_price_adjust FROM config LIMIT 1")
  810. default_values = c.fetchone()
  811. conn.close()
  812. # 创建选品最低价输入框及其标签
  813. min_price_label = QLabel(f"{prefix}最低价")
  814. self.min_price_edit = QLineEdit()
  815. self.min_price_edit.setFixedWidth(500) # 设置固定宽度为500像素
  816. # default_values 为None
  817. if default_values is not None:
  818. self.min_price_edit.setText(str(default_values[0]))
  819. form_layout.addRow(min_price_label, self.min_price_edit)
  820. # 创建选品最高价输入框及其标签
  821. max_price_label = QLabel(f"{prefix}最高价")
  822. self.max_price_edit = QLineEdit()
  823. self.max_price_edit.setFixedWidth(500) # 设置固定宽度为500像素
  824. if default_values is not None:
  825. self.max_price_edit.setText(str(default_values[1]))
  826. form_layout.addRow(max_price_label, self.max_price_edit)
  827. # 创建选品排序模式下拉选择框及其标签
  828. sort_mode_label = QLabel(f"{prefix}排序模式")
  829. self.sort_mode_combo = QComboBox()
  830. self.sort_mode_combo.addItems(["默认", "价格升序", "价格降序", "在售数量升序"])
  831. self.sort_mode_combo.setFixedWidth(500) # 设置固定宽度为500像素
  832. if default_values is not None:
  833. self.sort_mode_combo.setCurrentText(default_values[2])
  834. form_layout.addRow(sort_mode_label, self.sort_mode_combo)
  835. # 创建选品停止条件下拉选择框及其标签
  836. stop_condition_label = QLabel(f"{prefix}停止条件")
  837. self.stop_condition_combo = QComboBox()
  838. self.stop_condition_combo.addItems(["按照成功数量", "按照扫描数量"])
  839. self.stop_condition_combo.setFixedWidth(500) # 设置固定宽度为500像素
  840. if default_values is not None:
  841. self.stop_condition_combo.setCurrentText(default_values[3])
  842. form_layout.addRow(stop_condition_label, self.stop_condition_combo)
  843. # 创建成功数量配置输入框及其标签
  844. success_count_label = QLabel(f"{prefix}成功数量配置")
  845. self.success_count_edit = QLineEdit()
  846. self.success_count_edit.setFixedWidth(500) # 设置固定宽度为500像素
  847. if default_values is not None:
  848. self.success_count_edit.setText(str(default_values[4]))
  849. form_layout.addRow(success_count_label, self.success_count_edit)
  850. # 创建扫描商品数量配置输入框及其标签
  851. scan_count_label = QLabel(f"{prefix}扫描商品数量")
  852. self.scan_count_edit = QLineEdit()
  853. self.scan_count_edit.setFixedWidth(500) # 设置固定宽度为500像素
  854. if default_values is not None:
  855. self.scan_count_edit.setText(str(default_values[5]))
  856. form_layout.addRow(scan_count_label, self.scan_count_edit)
  857. # 创建选品接口每页请求数量配置输入框及其标签
  858. page_size_label = QLabel(f"{prefix}接口每页请求数量")
  859. self.page_size_edit = QLineEdit()
  860. self.page_size_edit.setFixedWidth(500) # 设置固定宽度为500像素
  861. if default_values is not None:
  862. self.page_size_edit.setText(str(default_values[6]))
  863. form_layout.addRow(page_size_label, self.page_size_edit)
  864. # 创建每次调用BUFF接口暂停时间配置输入框及其标签
  865. pause_time_label = QLabel(f"{prefix}接口暂停时间(秒)")
  866. self.pause_time_edit = QLineEdit()
  867. self.pause_time_edit.setFixedWidth(500) # 设置固定宽度为500像素
  868. # self.pause_time_edit.setText("10") # 设置默认值为10
  869. if default_values is not None:
  870. self.pause_time_edit.setText(str(default_values[7]))
  871. form_layout.addRow(pause_time_label, self.pause_time_edit)
  872. # 创建选品接口最大请求多少页配置输入框及其标签
  873. max_pages_label = QLabel(f"{prefix}接口最大请求多少页")
  874. self.max_pages_edit = QLineEdit()
  875. self.max_pages_edit.setFixedWidth(500) # 设置固定宽度为500像素
  876. if default_values is not None:
  877. self.max_pages_edit.setText(str(default_values[8]))
  878. form_layout.addRow(max_pages_label, self.max_pages_edit)
  879. # 创建商品参考价调整系数输入框及其标签
  880. ref_price_adjust_label = QLabel(f"{prefix}商品参考价调整系数%")
  881. self.ref_price_adjust_edit = QLineEdit()
  882. self.ref_price_adjust_edit.setFixedWidth(500) # 设置固定宽度为500像素
  883. if default_values is not None:
  884. self.ref_price_adjust_edit.setText(str(default_values[9]))
  885. form_layout.addRow(ref_price_adjust_label, self.ref_price_adjust_edit)
  886. # 创建商品扫货价调整系数输入框及其标签
  887. sweep_price_adjust_label = QLabel(f"{prefix}商品扫货价调整系数%")
  888. self.sweep_price_adjust_edit = QLineEdit()
  889. self.sweep_price_adjust_edit.setFixedWidth(500) # 设置固定宽度为500像素
  890. if default_values is not None:
  891. self.sweep_price_adjust_edit.setText(str(default_values[10]))
  892. form_layout.addRow(sweep_price_adjust_label, self.sweep_price_adjust_edit)
  893. # 创建保存按钮
  894. save_button = QPushButton("保存")
  895. save_button.clicked.connect(self.save_config)
  896. save_button.setFixedSize(100, 50) # 设置固定宽度为500像素
  897. # 创建一个水平布局来放置保存按钮
  898. button_layout = QHBoxLayout()
  899. button_layout.setContentsMargins(300, 0, 0, 0)
  900. button_layout.addWidget(save_button, alignment=Qt.AlignmentFlag.AlignLeft)
  901. # 将垂直布局添加到表单布局中
  902. form_layout.addRow(button_layout)
  903. form_layout.setContentsMargins(300, 0, 0, 0)
  904. return form_layout
  905. def save_config(self):
  906. # 连接到SQLite数据库
  907. conn = sqlite3.connect('buff.db')
  908. cursor = conn.cursor()
  909. # 清空表中的数据
  910. cursor.execute('DELETE FROM config')
  911. # 获取配置信息
  912. min_price = self.min_price_edit.text()
  913. max_price = self.max_price_edit.text()
  914. sort_mode = self.sort_mode_combo.currentText()
  915. stop_condition = self.stop_condition_combo.currentText()
  916. success_count = self.success_count_edit.text()
  917. scan_count = self.scan_count_edit.text()
  918. page_size = self.page_size_edit.text()
  919. pause_time = self.pause_time_edit.text()
  920. max_pages = self.max_pages_edit.text()
  921. ref_price_adjust = self.ref_price_adjust_edit.text()
  922. sweep_price_adjust = self.sweep_price_adjust_edit.text()
  923. # 插入数据到表中
  924. cursor.execute('''
  925. INSERT INTO config (min_price, max_price, sort_mode, stop_condition, success_count, scan_count, page_size, pause_time, max_pages, ref_price_adjust, sweep_price_adjust)
  926. VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  927. ''', (
  928. min_price, max_price, sort_mode, stop_condition, success_count, scan_count, page_size, pause_time,
  929. max_pages,
  930. ref_price_adjust, sweep_price_adjust))
  931. # 提交更改并关闭连接
  932. conn.commit()
  933. conn.close()
  934. QMessageBox.information(self, "保存选品配置", "选品配置已成功保存")
  935. # 选品日志的tab框
  936. def create_select_log_info_form(self):
  937. layout = QVBoxLayout()
  938. layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保布局内容靠左对齐
  939. # 创建树形控件
  940. self.select_log_tree_widget = QTreeWidget()
  941. self.select_log_tree_widget.setHeaderLabels(
  942. ["选择", "商品ID", "商品名称", "磨损最低值", "磨损最高值", "全磨损区间最低价", "扫货价", "判断价", "时间"])
  943. self.select_log_tree_widget.setColumnCount(9)
  944. self.select_log_tree_widget.setSelectionMode(QTreeWidget.SelectionMode.ExtendedSelection)
  945. self.select_log_tree_widget.setRootIsDecorated(True) # 启用根节点的装饰
  946. self.select_log_tree_widget.setAlternatingRowColors(True) # 设置交替行颜色
  947. self.select_log_tree_widget.setStyleSheet("QTreeWidget::item { padding: 5px; }") # 设置项的内边距
  948. # 启用复选框
  949. self.select_log_tree_widget.setColumnWidth(0, 50) # 设置选择列的宽度
  950. self.select_log_tree_widget.setColumnWidth(1, 100) # 设置商品ID列的宽度
  951. self.select_log_tree_widget.setColumnWidth(2, 200) # 设置商品名称列的宽度
  952. self.select_log_tree_widget.setColumnWidth(3, 100) # 设置磨损最低值列的宽度
  953. self.select_log_tree_widget.setColumnWidth(4, 100) # 设置磨损最高值列的宽度
  954. self.select_log_tree_widget.setColumnWidth(5, 150) # 设置全磨损区间最低价列的宽度
  955. self.select_log_tree_widget.setColumnWidth(6, 100) # 设置扫货价列的宽度
  956. self.select_log_tree_widget.setColumnWidth(7, 100) # 设置判断价列的宽度
  957. self.select_log_tree_widget.setColumnWidth(8, 150) # 设置时间列的宽度
  958. self.select_log_tree_widget.setHeaderItem(QTreeWidgetItem(
  959. ["选择", "商品ID", "商品名称", "磨损最低值", "磨损最高值", "全磨损区间最低价", "扫货价", "判断价",
  960. "时间"])) # 设置表头
  961. self.select_log_tree_widget.header().setDefaultAlignment(Qt.AlignmentFlag.AlignLeft) # 设置表头对齐方式
  962. conn = sqlite3.connect('buff.db')
  963. c = conn.cursor()
  964. c.execute(
  965. "SELECT item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price, timestamp FROM select_logs ")
  966. rows = c.fetchall()
  967. for row in rows:
  968. item = QTreeWidgetItem(self.select_log_tree_widget)
  969. item.setText(1, str(row[0]))
  970. item.setText(2, str(row[1]))
  971. item.setText(3, str(row[2]))
  972. item.setText(4, str(row[3]))
  973. item.setText(5, str(row[4]))
  974. item.setText(6, str(row[5]))
  975. item.setText(7, str(row[6]))
  976. item.setText(8, str(row[7]))
  977. checkbox = QCheckBox()
  978. checkbox.setChecked(False)
  979. self.select_log_tree_widget.setItemWidget(item, 0, checkbox)
  980. conn.close()
  981. layout.addWidget(self.select_log_tree_widget)
  982. # 创建按钮布局
  983. button_layout = QHBoxLayout()
  984. button_layout.setAlignment(Qt.AlignmentFlag.AlignLeft) # 确保按钮布局内容靠左对齐
  985. # 创建添加按钮
  986. add_button = QPushButton("添加")
  987. add_button.clicked.connect(self.show_add_select_log_dialog)
  988. button_layout.addWidget(add_button)
  989. # 创建删除按钮
  990. delete_button = QPushButton("删除")
  991. delete_button.clicked.connect(self.delete_select_log)
  992. button_layout.addWidget(delete_button)
  993. # 创建编辑按钮
  994. edit_button = QPushButton("编辑")
  995. edit_button.clicked.connect(self.edit_select_log)
  996. button_layout.addWidget(edit_button)
  997. # 创建导出按钮
  998. export_button = QPushButton("导出")
  999. export_button.clicked.connect(self.export_selected_logs)
  1000. button_layout.addWidget(export_button)
  1001. # 创建保存按钮
  1002. save_button = QPushButton("保存")
  1003. save_button.clicked.connect(self.save_select_logs)
  1004. button_layout.addWidget(save_button)
  1005. layout.addLayout(button_layout)
  1006. return layout
  1007. # 导出日志
  1008. def export_selected_logs(self):
  1009. SelectLogDialog.export_selected_logs(self)
  1010. # 保存日志
  1011. def save_select_logs(self):
  1012. SelectLogDialog.save_select_logs(self)
  1013. # 编辑日志
  1014. def edit_select_log(self):
  1015. SelectLogDialog.edit_select_log(self)
  1016. # 删除日志
  1017. def delete_select_log(self):
  1018. SelectLogDialog.delete_select_log(self)
  1019. # 新增日志
  1020. def show_add_select_log_dialog(self):
  1021. SelectLogDialog.show_add_select_log_dialog(self)
  1022. def show_selected_phone_number(self):
  1023. # 设置选品停止标志为False
  1024. self.stop_selecting_flag = False
  1025. # 查询检索选品入参
  1026. if not BUFFXP.checkBuffXPParams(self):
  1027. return
  1028. try:
  1029. thread_searchGoods = threading.Thread(target=self.firstSelectGoods)
  1030. thread_searchGoods.start()
  1031. except Exception as e:
  1032. print(f"Error: {e}")
  1033. def firstSelectGoods(self):
  1034. print('开始选品')
  1035. # 已经选品的数量
  1036. self.searchedGoodsNum = 0
  1037. # 已经选品成功的数量
  1038. self.search_success_count = 0
  1039. # 组装商品选取API的入参list
  1040. self.search_goods_param_list = []
  1041. # 获取商品选取API的入参list
  1042. BUFFXP.get_goods_param_list(self)
  1043. self.last_goodsinfo_request_time = 0
  1044. self.last_paintwear_request_time = 0
  1045. self.last_minprice_request_time = 0
  1046. # 更新选品cookie
  1047. self.xp_my_headers.update({
  1048. 'Cookie': self.cookie_text
  1049. })
  1050. try:
  1051. print('选品接口请求参数列表 search_goods_param_list 长度:', len(self.search_goods_param_list))
  1052. # 遍历search_goods_param_list
  1053. while True:
  1054. #判断退出条件
  1055. if self.stop_selecting_flag:
  1056. print('停止选品')
  1057. return
  1058. # 判断选品停止条件来判断是否需要终止
  1059. if self.stop_condition == '按照成功数量':
  1060. print(f'按照成功数量,设定的成功数量为:{self.success_count},当前检索已成功的数量为:{self.search_success_count}')
  1061. if int(self.success_count) < int(self.search_success_count):
  1062. return
  1063. else:
  1064. # 按照选品数量来判断是否要停止
  1065. print(f'按照选品数量,设定的选品数量为:{self.scan_count},当前检索的选品数量为:{self.searchedGoodsNum}')
  1066. if int(self.scan_count) < int(self.searchedGoodsNum):
  1067. return
  1068. for i in range(len(self.search_goods_param_list)):
  1069. try:
  1070. if self.stop_selecting_flag:
  1071. print('停止选品')
  1072. return
  1073. # 判断选品停止条件来判断是否需要终止
  1074. if self.stop_condition == '按照成功数量':
  1075. print(f'按照成功数量,设定的成功数量为:{self.success_count},当前检索已成功的数量为:{self.search_success_count}')
  1076. if int(self.success_count) < int(self.search_success_count):
  1077. return
  1078. else:
  1079. # 按照选品数量来判断是否要停止
  1080. print(f'按照选品数量,设定的选品数量为:{self.scan_count},当前检索的选品数量为:{self.searchedGoodsNum}')
  1081. if int(self.scan_count) < int(self.searchedGoodsNum):
  1082. return
  1083. pagenum = 1
  1084. j = pagenum
  1085. first_flag = True
  1086. while int(j) <= int(pagenum):
  1087. datalist = []
  1088. if self.stop_selecting_flag:
  1089. print('停止选品')
  1090. return
  1091. # 判断选品停止条件来判断是否需要终止
  1092. if self.stop_condition == '按照成功数量':
  1093. print(f'按照成功数量,设定的成功数量为:{self.success_count},当前检索已成功的数量为:{self.search_success_count}')
  1094. if int(self.success_count) < int(self.search_success_count):
  1095. return
  1096. else:
  1097. # 按照选品数量来判断是否要停止
  1098. print(f'按照选品数量,设定的选品数量为:{self.scan_count},当前检索的选品数量为:{self.searchedGoodsNum}')
  1099. if int(self.scan_count) < int(self.searchedGoodsNum):
  1100. return
  1101. if not first_flag:
  1102. self.search_goods_param_list[i]['page_num'] = j
  1103. print(f"第{j}/{pagenum}页,API请求参数为:{self.search_goods_param_list[i]}")
  1104. else:
  1105. self.search_goods_param_list[i]['page_num'] = 1
  1106. print(f"新查询条件第一次预请求,API请求参数为:{self.search_goods_param_list[i]}")
  1107. try:
  1108. # 开始时间为当前时间
  1109. current_time = time.time()
  1110. time_since_last_request = current_time - self.last_goodsinfo_request_time
  1111. if time_since_last_request < float(self.pause_time):
  1112. wait_time = float(self.pause_time) - time_since_last_request
  1113. print(f"暂停 {wait_time:.2f} seconds before making the next request.")
  1114. time.sleep(wait_time)
  1115. api1_res = req.get(url=self.xp_goodsurl, headers=self.xp_my_headers,
  1116. params=self.search_goods_param_list[i])
  1117. print('遍历商品接口请求返回报文:', api1_res.text.strip()[:50])
  1118. data = api1_res.json()['data']
  1119. print('遍历商品接口请求返回报文中的CODE:', api1_res.json()['code'])
  1120. # 如果data中的code不等于OK,则跳出循环
  1121. if api1_res.json()['code'] != 'OK':
  1122. print('选品接口请求返回报文:', api1_res.text.strip()[:50])
  1123. print('选品接口请求返回报文code不等于OK,跳出循环')
  1124. continue
  1125. datalist.extend(data['items'])
  1126. # 遍历datalist
  1127. for k in range(len(datalist)):
  1128. # 做终止判断是否点击了停止选品按钮
  1129. if self.stop_selecting_flag:
  1130. print('停止选品')
  1131. return
  1132. # 判断选品停止条件来判断是否需要终止
  1133. if self.stop_condition == '按照成功数量':
  1134. print(f'按照成功数量,设定的成功数量为:{self.success_count},当前检索已成功的数量为:{self.search_success_count}')
  1135. if int(self.success_count) < int(self.search_success_count):
  1136. return
  1137. else:
  1138. # 按照选品数量来判断是否要停止
  1139. print(f'按照选品数量,设定的选品数量为:{self.scan_count},当前检索的选品数量为:{self.searchedGoodsNum}')
  1140. if int(self.scan_count) < int(self.searchedGoodsNum):
  1141. return
  1142. print(f'商品id:{str(datalist[k]["id"])}开始进行价格分析')
  1143. # 选品的数量+1
  1144. self.searchedGoodsNum += 1
  1145. # 1、获取磨损信息
  1146. BUFFAPI.getPaintwearChoices(self, datalist[k]["id"])
  1147. if len(self.paintwear_choices) <= 0:
  1148. print(f'获取商品id:{datalist[k]["id"]}磨损信息失败,筛选不满足条件,继续下次循环')
  1149. continue
  1150. # 1、先获取全磨损的最低价 170
  1151. min_price = float(BUFFAPI.getPaintwearChoicesMinPrice(self, datalist[k]["id"], '', ''))
  1152. # min_price为0 则continue
  1153. if min_price == 0:
  1154. print(f'获取商品id:{datalist[k]["id"]}全磨损的最低价为0,筛选不满足条件,继续下次循环')
  1155. continue
  1156. # 每个磨损区间的最低价
  1157. min_price_list = []
  1158. # 2、获取每个磨损区间的最低价 270 260 230 240 170
  1159. break_flag = False
  1160. for i3 in range(len(self.paintwear_choices)):
  1161. # 做终止判断是否点击了停止选品按钮
  1162. if self.stop_selecting_flag:
  1163. print('停止选品')
  1164. return
  1165. min_price_list.append(
  1166. {
  1167. 'min_wear': self.paintwear_choices[i3][0],
  1168. 'max_wear': self.paintwear_choices[i3][1],
  1169. 'min_price': float(
  1170. BUFFAPI.getPaintwearChoicesMinPrice(self, datalist[k]["id"],
  1171. self.paintwear_choices[
  1172. i3][0],
  1173. self.paintwear_choices[
  1174. i3][1]))
  1175. }
  1176. )
  1177. print(f'获取商品id:{datalist[k]["id"]}磨损区间及最低价信息:', min_price_list)
  1178. # todo 区间内容有价格为0,则跳过该商品,跳到下一个商品
  1179. for i2 in range(len(min_price_list)):
  1180. if min_price_list[i2]['min_price'] == 0:
  1181. print(f'获取商品id:{datalist[k]["id"]}磨损区间及最低价信息:', min_price_list)
  1182. print(
  1183. f'获取商品id:{datalist[k]["id"]}磨损区间及最低价信息中,有价格是0,跳过该商品')
  1184. break_flag = True
  1185. if break_flag:
  1186. print(f'商品id:{datalist[k]["id"]} 筛选不满足条件,继续下次循环')
  1187. continue
  1188. # 3、全区间的最低价 170 * (1+10%),10%是设定的 = 187元
  1189. pd_price = round(min_price * (100 + self.ref_price_adjust) / 100, 4)
  1190. # 4、将5个磨损区间的最低价跟187比对,只留高于这个187价格的区间
  1191. # 遍历 min_price_list
  1192. for i1 in range(len(min_price_list)):
  1193. if min_price_list[i1]['min_price'] < pd_price:
  1194. # min_price_list 删除i1及以后的元素
  1195. min_price_list = min_price_list[:i1]
  1196. break
  1197. # 5、根据阶梯来确定磨损区间
  1198. # 遍历 min_price_list,判断元素中的min_price是否小于上一个元素的min_price,
  1199. for i2 in range(len(min_price_list) - 1):
  1200. if min_price_list[i2]['min_price'] < min_price_list[i2 + 1]['min_price']:
  1201. # min_price_list 删除i2及以后的元素
  1202. min_price_list = min_price_list[:i2 + 1]
  1203. break
  1204. # 6、170*(1+0.02)= 173.4 购买溢价
  1205. gm_price = round(min_price * (100 + self.sweep_price_adjust) / 100, 4)
  1206. # min_price_list 为空则继续下次循环
  1207. if len(min_price_list) <= 0:
  1208. print(f'商品id:{datalist[k]["id"]} 筛选不满足条件,继续下次循环')
  1209. continue
  1210. # 向BUFF选品日志标签页中添加一条数据
  1211. timestamp = time.time()
  1212. local_time = time.localtime(timestamp)
  1213. formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', local_time)
  1214. print(f'商品id:{datalist[k]["id"]} 筛选成功, 磨损及价格区间min_price_list:',
  1215. min_price_list)
  1216. # 向BUFF选品日志标签页中增加记录 发出信号而不是直接调用 add_select_log
  1217. self.log_added.emit(str(datalist[k]["id"]), str(datalist[k]["name"]),
  1218. str(min_price_list[0]['min_wear']),
  1219. str(min_price_list[-1]['max_wear']), str(min_price), str(gm_price),
  1220. str(pd_price), str(formatted_time))
  1221. conn = sqlite3.connect('buff.db')
  1222. cursor = conn.cursor()
  1223. cursor.execute('''
  1224. INSERT INTO select_logs (item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price, timestamp)
  1225. VALUES (?, ?, ?, ?, ?, ?, ?, ?)
  1226. ''', (datalist[k]["id"], datalist[k]["name"], min_price_list[0]['min_wear'], min_price_list[-1]['max_wear'], min_price, gm_price, pd_price, formatted_time))
  1227. # 提交更改并关闭连接
  1228. conn.commit()
  1229. conn.close()
  1230. # 检索成功数量+1
  1231. self.search_success_count += 1
  1232. if not first_flag:
  1233. j += 1
  1234. if first_flag:
  1235. if int(data['total_page']) < int(self.max_page):
  1236. pagenum = data['total_page']
  1237. else:
  1238. pagenum = self.max_page
  1239. j = 1
  1240. first_flag = False
  1241. except Exception as e:
  1242. print('选品接口1请求--失败', e)
  1243. j = 1
  1244. pagenum = 0
  1245. finally:
  1246. self.last_goodsinfo_request_time = time.time() # 更新上次请求时间为当前时间
  1247. pass
  1248. except Exception as e:
  1249. print('选品接口2请求--失败', e)
  1250. except Exception as e:
  1251. print('选品接口3请求--失败', e)
  1252. finally:
  1253. print('停止选品')
  1254. def stop_selecting(self):
  1255. # 设置选品停止标志为True
  1256. self.stop_selecting_flag = True
  1257. QMessageBox.information(self, "停止选品", "选品操作已终止")
  1258. def setup_phone_edit_map(self):
  1259. self.phone_edit_map = {}
  1260. self.email_edit_map = {}
  1261. self.email_alias_edit_map = {}
  1262. # 向BUFF选品日志标签页的列表中写数据的槽函数
  1263. @pyqtSlot(str, str, str, str, str, str, str, str)
  1264. def _add_select_log(self, item_id, item_name, min_wear, max_wear, min_full_wear_price, sweep_price, judge_price,
  1265. timestamp):
  1266. # 创建一个字典来存储记录的详细信息
  1267. record = {
  1268. '商品ID': item_id,
  1269. '商品名称': item_name,
  1270. '磨损最低值': min_wear,
  1271. '磨损最高值': max_wear,
  1272. '全磨损区间最低价': min_full_wear_price,
  1273. '扫货价': sweep_price,
  1274. '判断价': judge_price,
  1275. '时间': timestamp
  1276. }
  1277. # 将新记录添加到树形控件中
  1278. item = QTreeWidgetItem(self.select_log_tree_widget)
  1279. item.setText(0, "") # 选择列为空
  1280. item.setText(1, record['商品ID'])
  1281. item.setText(2, record['商品名称'])
  1282. item.setText(3, str(record['磨损最低值']))
  1283. item.setText(4, str(record['磨损最高值']))
  1284. item.setText(5, str(record['全磨损区间最低价']))
  1285. item.setText(6, str(record['扫货价']))
  1286. item.setText(7, str(record['判断价']))
  1287. item.setText(8, record['时间'])
  1288. # 创建复选框
  1289. checkbox = QCheckBox()
  1290. checkbox.setChecked(False)
  1291. self.select_log_tree_widget.setItemWidget(item, 0, checkbox)
  1292. if __name__ == "__main__":
  1293. app = QApplication(sys.argv)
  1294. window = MainWindow()
  1295. window.show()
  1296. sys.exit(app.exec())
  1297. #代码备份 发送商家报价的代码
  1298. #res = req.post(self.buyGoodsUrl, headers=api_header, data=api_data)
  1299. #print(f'post 请求 {self.buyGoodsUrl} 返回报文: {res.text.strip()}')
  1300. #if res.json()['code'] == 'OK':
  1301. # print(f'购买成功')
  1302. # time.sleep(float(self.pause_time_edit.text()))
  1303. # print(f'post 请求 {self.buyGoodsUrl} 返回报文code等于OK,商品id:{goods_id}的磨损区间{goods_min_wear}-{goods_max_wear}的商品信息:{goods_item}')
  1304. # try:
  1305. # bill_order_id = res.json()['data']['id']
  1306. # print(f'开始发报价 bill_order_id:{bill_order_id}')
  1307. # # fbj_api_data=json.dumps({
  1308. # # "bill_orders": [
  1309. # # bill_order_id
  1310. # # ],
  1311. # # "game": "csgo"
  1312. # # })
  1313. # # print(f'fbj_api_data: { fbj_api_data }')
  1314. # # fbj_api_header = {
  1315. # # "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36",
  1316. # # "Host": "buff.163.com", "X-Requested-With": "XMLHttpRequest",
  1317. # # 'Referer': f"https://buff.163.com/market/buy_order/history?game=csgo",
  1318. # # 'Cookie': self.cookie_text,
  1319. # # "Content-Type":"application/json",
  1320. # # 'x-csrftoken': "ImM2NTBjYmZhNjk2MGRjOWVkMTQxYjM5MTBjY2RhZjJjODRkNTBlMjUi.Z7WAmQ.yZ6n3Hcjv6eXHEElO1ZA95aqSEA"
  1321. # # }
  1322. # # todo 使用现有的工具,后续再开发
  1323. # #fbj_res = req.post(self.fbjUrl, headers=fbj_api_header, data=fbj_api_data)
  1324. # #print(f'post 请求 发报价 返回报文: {fbj_res.text.strip()}')
  1325. # #if fbj_res.json()['code'] == 'OK':
  1326. # # print(f'报价成功')
  1327. # #else:
  1328. # # print(f'报价失败')
  1329. # except Exception as e:
  1330. # print(f'商品发报价信息接口请求--失败', e)