| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- # BUFF选品02脚本
- import re
- from traceback import print_tb
- import requests as req
- import time,random,numpy as np
- from datetime import datetime
- from exceptiongroup import catch
- import argparse
- import mysql.connector
- from numpy.ma.core import argsort
- from selenium.webdriver.common.devtools.v85.system_info import ProcessInfo
- import json
- class xpjb():
- def __init__(self):
- # 数据库配置
- self.host = "121.40.50.77"
- self.user = "root"
- self.password = "Root@123456"
- self.database = "ry-vue"
- # 程序执行次数
- self.total_run_count = 0
- # 入参
- self.args = None
- # 选品账号的email
- self.xpzh_email = None
- # 选品账号的email_dh
- self.xpzh_email_dh = None
- # 选品账号的cookie
- self.xpzh_cookie = None
- # BUFF验证通过的商品数量
- self.dealedGoodsNum = 0
- #BUFF搜寻商品入参
- self.search_good_param_init = {
- 'game': 'csgo'
- }
- #待处理的buff商品信息list
- self.undeal_goods_list=[]
- # buff选品接口配置
- self.goodsurl = 'https://buff.163.com/api/market/goods'
- self.goodinfourl='https://buff.163.com/api/market/goods/info?goods_id='
- self.my_headers = {
- "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",
- "Host": "buff.163.com",
- "Referer": "https://buff.163.com/market/?game=csgo",
- "X-Requested-With": "XMLHttpRequest"
- }
- # 判断嵌套属性是否存在
- @staticmethod
- def has_nested_attribute(obj, attr_path):
- attrs = attr_path.split('.')
- try:
- for attr in attrs:
- obj = obj[attr] if isinstance(obj, dict) else getattr(obj, attr)
- return True
- except (KeyError, AttributeError):
- return False
- # 处理命令行参数
- def dealArgc(self):
- try:
- print('处理命令行参数--开始')
- # 创建解析器
- parser = argparse.ArgumentParser(description='BUFF选品脚本')
- # 添加一个位置参数,表示运行多久重新再运行 默认10秒
- parser.add_argument('--runtime', type=str,default=10, help='单次运行时间 默认10秒')
- # 添加一个位置参数,表示自动运行多少次程序,默认为10次
- parser.add_argument('--runcount', type=int,default=10, help='程序运行总次数,默认为10次')
- # 添加一个位置参数,表示每次调用BUFF接口程序运行间隔多少秒,默认为10秒
- parser.add_argument('--timeinterval', type=int,default=5, help='每次调用BUFF接口程序运行间隔多少秒,默认为10秒')
- # 添加一个位置参数,表示选品账号的手机号码
- parser.add_argument('--xp_phone', type=str ,default=17756576757, help='选品账号的手机号码,17756576757')
- # 添加一个位置参数,表示选品脚本停止条件标志的成功数量, 默认 200
- parser.add_argument('--xptz_success_num', type=int ,default=200, help='选品脚本停止条件标志的成功数量, 默认 200')
- # 解析命令行参数
- self.args = parser.parse_args()
- # 使用参数
- print(f'单次运行时间,默认10秒: {self.args.runtime}')
- print(f'自动运行多少次程序 默认10次: {self.args.runcount}')
- print(f'每次调用BUFF接口程序运行间隔多少秒 默认5秒: {self.args.timeinterval}')
- print(f'选品账号的手机号码: {self.args.xp_phone}')
- print(f'选品脚本停止条件标志的成功数量 默认 200: {self.args.xptz_success_num}')
- print('处理命令行参数--成功')
- except Exception as e:
- print('处理命令行参数--失败',e)
- exit()
- # 获取选品账号信息
- def getXpzh(self):
- print('获取选品账号信息')
- try:
- # 创建mysql连接
- conn = mysql.connector.connect(
- host=self.host,
- user=self.user,
- password=self.password,
- database=self.database
- )
- # 创建游标对象
- cursor = conn.cursor()
- # 执行SQL查询
- cursor.execute(f"SELECT id,phone,email,email_dh,cookie FROM sc_xpzh where phone = '{self.args.xp_phone}' and is_del='0' ")
- # 获取所有记录列表
- results = cursor.fetchall()
- if len(results) == 0:
- print('选品账号信息不存在,请检查手机号码是否正确')
- exit()
- for row in results:
- self.xpzh_email = row[2]
- self.xpzh_email_dh = row[3]
- self.xpzh_cookie = row[4]
- # 关闭游标和连接
- cursor.close()
- conn.close()
- print(f"选品账号手机号码: {self.args.xp_phone}")
- print(f"选品账号email:{self.xpzh_email}")
- print(f"选品账号cookie:{self.xpzh_cookie}")
- print(f"选品账号email:{self.xpzh_email}")
- except Exception as e:
- print('获取选品账号信息--失败',e)
- exit()
- # 处理选品
- def dealGoods(self):
- print('开始处理选品')
- for i in range(self.args.runcount):
- self.simpledealGoods()
- time.sleep(self.args.runtime)
- print('结束处理选品')
- # 单次选品处理
- def simpledealGoods(self):
- if self.dealedGoodsNum >= self.args.xptz_success_num:
- print('搜寻的BUFF商品已完成,停止脚本')
- exit()
- # 请求数据库获取待处理的BUFF商品
- self.getUndealBuffGoods()
- for i in range(len(self.undeal_goods_list)):
- self.dealsingleGoods(self.undeal_goods_list[i])
- # 处理单个BUFF商品,做判断是否可以抢购
- def dealsingleGoods(self,item):
- goodItem = json.loads(item)
- print('开始处理选品id',goodItem['id'])
- mslist=[]
- mslist=self.getGoodsMSinfo(goodItem['id'])
- goodsinfo={
-
- }
- time.sleep(self.args.timeinterval)
- #获取buff商品的磨损信息
- def getGoodsMSinfo(self,goods_id):
- try:
- mslist=[]
- res = req.get(url=self.goodinfourl+str(goods_id), headers=self.my_headers)
- # if res.json()['code'] != 'OK' :
- # print('BUFF商品信息请求返回报文:', res.text.strip())
- # continue
- data = res.json()['data']
- mslist.extend(data['paintwear_choices'])
- print('BUFF商品的磨损信息:', mslist)
- except Exception as e:
- print('BUFF商品信息请求--失败',e)
- finally:
- return mslist
- # 从数据库获取待处理的BUFF商品
- def getUndealBuffGoods(self):
- print('从数据库获取待处理的BUFF商品')
- try:
- # 创建mysql连接
- conn = mysql.connector.connect(
- host = self.host,
- user = self.user,
- password = self.password,
- database = self.database
- )
- goods_id_list=[]
- self.undeal_goods_list=[]
- # 创建游标对象
- cursor = conn.cursor()
- # 执行SQL查询
- cursor.execute("SELECT goods_id,goods_info from sys_buff_goods where deal_flag ='0' limit 0 , 10 for update")
- # 获取所有记录列表
- results = cursor.fetchall()
- if len(results) == 0:
- print('数据库中信息不存在')
- exit()
- for row in results:
- goods_id_list.append(row[0])
- self.undeal_goods_list.append(row[1])
- # 使用join()将列表转换为逗号分隔的字符串
- placeholders = ', '.join(['%s'] * len(goods_id_list))
- # 编写UPDATE语句
- update_query = f"UPDATE sys_buff_goods SET deal_flag ='1' WHERE goods_id in ({placeholders})"
- # 执行UPDATE语句
- cursor.execute(update_query, goods_id_list)
- conn.commit()
- # 关闭游标和连接
- cursor.close()
- conn.close()
- except Exception as e:
- print('获取待处理的BUFF商品信息--失败',e)
- exit()
- if __name__ == '__main__':
- print('开启选品脚本')
- xp = xpjb()
- # 处理命令行参数
- xp.dealArgc()
- # 获取选品账号信息,根据脚本的入参xp_phone检索
- xp.getXpzh()
- # 选品
- xp.dealGoods()
|