xpjb-02.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. # BUFF选品02脚本
  2. import re
  3. from traceback import print_tb
  4. import requests as req
  5. import time,random,numpy as np
  6. from datetime import datetime
  7. from exceptiongroup import catch
  8. import argparse
  9. import mysql.connector
  10. from numpy.ma.core import argsort
  11. from selenium.webdriver.common.devtools.v85.system_info import ProcessInfo
  12. import json
  13. class xpjb():
  14. def __init__(self):
  15. # 数据库配置
  16. self.host = "121.40.50.77"
  17. self.user = "root"
  18. self.password = "Root@123456"
  19. self.database = "ry-vue"
  20. # 程序执行次数
  21. self.total_run_count = 0
  22. # 入参
  23. self.args = None
  24. # 选品账号的email
  25. self.xpzh_email = None
  26. # 选品账号的email_dh
  27. self.xpzh_email_dh = None
  28. # 选品账号的cookie
  29. self.xpzh_cookie = None
  30. # BUFF验证通过的商品数量
  31. self.dealedGoodsNum = 0
  32. #BUFF搜寻商品入参
  33. self.search_good_param_init = {
  34. 'game': 'csgo'
  35. }
  36. #待处理的buff商品信息list
  37. self.undeal_goods_list=[]
  38. # buff选品接口配置
  39. self.goodsurl = 'https://buff.163.com/api/market/goods'
  40. self.goodinfourl='https://buff.163.com/api/market/goods/info?goods_id='
  41. self.my_headers = {
  42. "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",
  43. "Host": "buff.163.com",
  44. "Referer": "https://buff.163.com/market/?game=csgo",
  45. "X-Requested-With": "XMLHttpRequest"
  46. }
  47. # 判断嵌套属性是否存在
  48. @staticmethod
  49. def has_nested_attribute(obj, attr_path):
  50. attrs = attr_path.split('.')
  51. try:
  52. for attr in attrs:
  53. obj = obj[attr] if isinstance(obj, dict) else getattr(obj, attr)
  54. return True
  55. except (KeyError, AttributeError):
  56. return False
  57. # 处理命令行参数
  58. def dealArgc(self):
  59. try:
  60. print('处理命令行参数--开始')
  61. # 创建解析器
  62. parser = argparse.ArgumentParser(description='BUFF选品脚本')
  63. # 添加一个位置参数,表示运行多久重新再运行 默认10秒
  64. parser.add_argument('--runtime', type=str,default=10, help='单次运行时间 默认10秒')
  65. # 添加一个位置参数,表示自动运行多少次程序,默认为10次
  66. parser.add_argument('--runcount', type=int,default=10, help='程序运行总次数,默认为10次')
  67. # 添加一个位置参数,表示每次调用BUFF接口程序运行间隔多少秒,默认为10秒
  68. parser.add_argument('--timeinterval', type=int,default=5, help='每次调用BUFF接口程序运行间隔多少秒,默认为10秒')
  69. # 添加一个位置参数,表示选品账号的手机号码
  70. parser.add_argument('--xp_phone', type=str ,default=17756576757, help='选品账号的手机号码,17756576757')
  71. # 添加一个位置参数,表示选品脚本停止条件标志的成功数量, 默认 200
  72. parser.add_argument('--xptz_success_num', type=int ,default=200, help='选品脚本停止条件标志的成功数量, 默认 200')
  73. # 解析命令行参数
  74. self.args = parser.parse_args()
  75. # 使用参数
  76. print(f'单次运行时间,默认10秒: {self.args.runtime}')
  77. print(f'自动运行多少次程序 默认10次: {self.args.runcount}')
  78. print(f'每次调用BUFF接口程序运行间隔多少秒 默认5秒: {self.args.timeinterval}')
  79. print(f'选品账号的手机号码: {self.args.xp_phone}')
  80. print(f'选品脚本停止条件标志的成功数量 默认 200: {self.args.xptz_success_num}')
  81. print('处理命令行参数--成功')
  82. except Exception as e:
  83. print('处理命令行参数--失败',e)
  84. exit()
  85. # 获取选品账号信息
  86. def getXpzh(self):
  87. print('获取选品账号信息')
  88. try:
  89. # 创建mysql连接
  90. conn = mysql.connector.connect(
  91. host=self.host,
  92. user=self.user,
  93. password=self.password,
  94. database=self.database
  95. )
  96. # 创建游标对象
  97. cursor = conn.cursor()
  98. # 执行SQL查询
  99. cursor.execute(f"SELECT id,phone,email,email_dh,cookie FROM sc_xpzh where phone = '{self.args.xp_phone}' and is_del='0' ")
  100. # 获取所有记录列表
  101. results = cursor.fetchall()
  102. if len(results) == 0:
  103. print('选品账号信息不存在,请检查手机号码是否正确')
  104. exit()
  105. for row in results:
  106. self.xpzh_email = row[2]
  107. self.xpzh_email_dh = row[3]
  108. self.xpzh_cookie = row[4]
  109. # 关闭游标和连接
  110. cursor.close()
  111. conn.close()
  112. print(f"选品账号手机号码: {self.args.xp_phone}")
  113. print(f"选品账号email:{self.xpzh_email}")
  114. print(f"选品账号cookie:{self.xpzh_cookie}")
  115. print(f"选品账号email:{self.xpzh_email}")
  116. except Exception as e:
  117. print('获取选品账号信息--失败',e)
  118. exit()
  119. # 处理选品
  120. def dealGoods(self):
  121. print('开始处理选品')
  122. for i in range(self.args.runcount):
  123. self.simpledealGoods()
  124. time.sleep(self.args.runtime)
  125. print('结束处理选品')
  126. # 单次选品处理
  127. def simpledealGoods(self):
  128. if self.dealedGoodsNum >= self.args.xptz_success_num:
  129. print('搜寻的BUFF商品已完成,停止脚本')
  130. exit()
  131. # 请求数据库获取待处理的BUFF商品
  132. self.getUndealBuffGoods()
  133. for i in range(len(self.undeal_goods_list)):
  134. self.dealsingleGoods(self.undeal_goods_list[i])
  135. # 处理单个BUFF商品,做判断是否可以抢购
  136. def dealsingleGoods(self,item):
  137. goodItem = json.loads(item)
  138. print('开始处理选品id',goodItem['id'])
  139. mslist=[]
  140. mslist=self.getGoodsMSinfo(goodItem['id'])
  141. goodsinfo={
  142. }
  143. time.sleep(self.args.timeinterval)
  144. #获取buff商品的磨损信息
  145. def getGoodsMSinfo(self,goods_id):
  146. try:
  147. mslist=[]
  148. res = req.get(url=self.goodinfourl+str(goods_id), headers=self.my_headers)
  149. # if res.json()['code'] != 'OK' :
  150. # print('BUFF商品信息请求返回报文:', res.text.strip())
  151. # continue
  152. data = res.json()['data']
  153. mslist.extend(data['paintwear_choices'])
  154. print('BUFF商品的磨损信息:', mslist)
  155. except Exception as e:
  156. print('BUFF商品信息请求--失败',e)
  157. finally:
  158. return mslist
  159. # 从数据库获取待处理的BUFF商品
  160. def getUndealBuffGoods(self):
  161. print('从数据库获取待处理的BUFF商品')
  162. try:
  163. # 创建mysql连接
  164. conn = mysql.connector.connect(
  165. host = self.host,
  166. user = self.user,
  167. password = self.password,
  168. database = self.database
  169. )
  170. goods_id_list=[]
  171. self.undeal_goods_list=[]
  172. # 创建游标对象
  173. cursor = conn.cursor()
  174. # 执行SQL查询
  175. cursor.execute("SELECT goods_id,goods_info from sys_buff_goods where deal_flag ='0' limit 0 , 10 for update")
  176. # 获取所有记录列表
  177. results = cursor.fetchall()
  178. if len(results) == 0:
  179. print('数据库中信息不存在')
  180. exit()
  181. for row in results:
  182. goods_id_list.append(row[0])
  183. self.undeal_goods_list.append(row[1])
  184. # 使用join()将列表转换为逗号分隔的字符串
  185. placeholders = ', '.join(['%s'] * len(goods_id_list))
  186. # 编写UPDATE语句
  187. update_query = f"UPDATE sys_buff_goods SET deal_flag ='1' WHERE goods_id in ({placeholders})"
  188. # 执行UPDATE语句
  189. cursor.execute(update_query, goods_id_list)
  190. conn.commit()
  191. # 关闭游标和连接
  192. cursor.close()
  193. conn.close()
  194. except Exception as e:
  195. print('获取待处理的BUFF商品信息--失败',e)
  196. exit()
  197. if __name__ == '__main__':
  198. print('开启选品脚本')
  199. xp = xpjb()
  200. # 处理命令行参数
  201. xp.dealArgc()
  202. # 获取选品账号信息,根据脚本的入参xp_phone检索
  203. xp.getXpzh()
  204. # 选品
  205. xp.dealGoods()