buff.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import re
  2. import requests as req
  3. # import time,random,winsound,sendmessage,numpy as np
  4. import time,random,numpy as np
  5. from datetime import datetime
  6. class CS():
  7. def __init__(self):
  8. self.nowtime = datetime.now()
  9. self.goodsurl = 'https://buff.163.com/api/market/goods'
  10. self.pricehistoryurl = 'https://buff.163.com/api/market/goods/price_history/buff'
  11. self.my_headers = {
  12. "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",
  13. "Cookie": "_ntes_nnid=db955d39ec6952987ea31591e7a7f51e,1735042169953; _ntes_nuid=db955d39ec6952987ea31591e7a7f51e; timing_user_id=time_dPeVya6k5c; _ga=GA1.1.1303944876.1735384064; _ga_EPDQHDTJH5=GS1.1.1735384063.1.1.1735384225.0.0.0; Device-Id=qX7ZJINOsL1UQiaTIf95; P_INFO=18505515510|1737427893|1|netease_buff|00&99|CN&1737426178&netease_buff#CN&null#10#0#0|&0|null|18505515510; remember_me=U1084863581|sm9KUY0tjXZMgm0Vq13zmUzDYlPClIym; session=1-sb6kP-_c8kkrLJXbr9rLFXTGPxHDRE3pMgZBLjwFylla2020027141; Locale-Supported=zh-Hans; game=csgo; csrf_token=ImM1NTUzMDA3MjZjZTk4OWFhZDdjZjI4ZGYwMGFkNDg0MDdjNjE0MDki.Z49c_Q.lopzgJuqeS1EURnwRW3X_3T6xtY",#你自己的cookie
  14. "Host": "buff.163.com",
  15. "Referer": "https://buff.163.com/market/?game=csgo",
  16. "X-Requested-With": "XMLHttpRequest"
  17. }
  18. def SearchGoods(self, weaponame): # 搜索符合价格标准的weaponlist商品,返回商品id等数据
  19. nowtime = self.nowtime.timestamp()
  20. ##############参数调整################
  21. param = {
  22. 'game': 'csgo',
  23. 'page_size': 80,
  24. 'page_num': 100,
  25. 'quality':'normal',
  26. 'min_price': 20, # 最小价格
  27. 'max_price': 221.93, # 最大价格
  28. 'category': weaponame,
  29. }
  30. datalist = []
  31. res = req.get(url=self.goodsurl, headers=self.my_headers, params=param)
  32. print(res.text)
  33. data = res.json()['data']
  34. datalist.extend(data['items'])
  35. #print(data)
  36. print('商品页数'+str(data['total_page']))
  37. #buff页码显示有问题
  38. if int(data['total_page']) > 1:
  39. for i in range(1, int(data['total_page'])):
  40. time.sleep(random.randint(10, 20))
  41. param.update({
  42. 'page_num': i
  43. })
  44. res = req.get(url=self.goodsurl, headers=self.my_headers, params=param)
  45. data = res.json()['data']
  46. datalist.extend(data['items'])
  47. print(weaponame + '数据获取成功') # 打印数据列表
  48. return datalist
  49. def GethistoryPrice(self,goodsdata):
  50. param = {
  51. 'game': 'csgo',
  52. 'goods_id':'',
  53. 'currency': 'CNY',
  54. 'days':'30',
  55. 'buff_price_type': '1',
  56. 'with_sell_num': 'false',
  57. '_':''
  58. }
  59. nowtime = self.nowtime.timestamp()
  60. param.update({'goods_id':goodsdata['id'],
  61. '_':nowtime}) # 参数加入id和时间戳
  62. res = req.get(url=self.pricehistoryurl, headers=self.my_headers, params=param)
  63. #print(res.content)
  64. price_history = res.json()['data']['price_history']
  65. print('历史价格获取成功')
  66. return price_history
  67. def OperaData(self,pricelist,nowprice):
  68. data=[]
  69. for item in pricelist:
  70. data.append(item[1])
  71. # 计算四分位数
  72. #print(data)
  73. Q1 = np.percentile(data, 25)
  74. Q3 = np.percentile(data, 75)
  75. IQR = Q3 - Q1
  76. # 剔除超出Q1-1.5*IQR和Q3+1.5*IQR的值
  77. filtered_data = [x for x in data if Q1 - 1.5 * IQR <= x <= Q3 + 1.5 * IQR]
  78. #print(filtered_data)
  79. npdata = np.array(filtered_data)
  80. # 价格线设置——————————————————————历史价格的8%
  81. priceline = np.percentile(npdata, 8)
  82. print('价格线:' + str(priceline))
  83. print('当前价位:' + str(nowprice))
  84. weight=1/(float(nowprice)-float(priceline))
  85. print('权重',str(weight))
  86. if weight <= 0:
  87. return 1, float(priceline),100
  88. else:
  89. return 2, float(priceline),weight
  90. def judgepirce(self,item):
  91. print('★★★★★★★★★★')
  92. print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
  93. print(str(item['name']))
  94. try:
  95. historypirce = self.GethistoryPrice(item)
  96. if len(historypirce) > 55:
  97. buyok, Q1, weight = self.OperaData(historypirce, item['sell_min_price'])
  98. if buyok==1:
  99. print('———————————价格较低,可以入手————————————')
  100. print('https://buff.163.com/goods/'+str(item['id']))
  101. winsound.PlaySound("output.wav", winsound.SND_FILENAME)
  102. item.update({
  103. 'buyok':buyok,
  104. 'priceline':Q1,
  105. 'weight':weight
  106. })
  107. return item
  108. else:
  109. print('交易量过少')
  110. item.update({
  111. 'buyok': 3,
  112. 'weight': 0.01
  113. })
  114. return item
  115. except Exception as e:
  116. print('获取历史价格失败', str(e))
  117. item.update({
  118. 'buyok': 4,
  119. 'weight': 10
  120. })
  121. return item
  122. if __name__ == '__main__':
  123. # weaponlist = [ 'weapon_awp','weapon_usp_silencer', 'weapon_ak47', 'weapon_glock','weapon_deagle','weapon_m4a1', 'weapon_m4a1_silencer', ]
  124. weaponlist = ['weapon_revolver','weapon_bayonet', 'weapon_bizon', 'weapon_sg556', 'weapon_scar20', 'weapon_p250',
  125. 'weapon_m4a1', 'weapon_cz75a', 'weapon_aug','weapon_usp_silencer',
  126. 'weapon_xm1014', 'weapon_elite','weapon_sawedoff','weapon_nova','weapon_famas', 'weapon_fiveseven', 'weapon_g3sg1', 'weapon_galilar',
  127. 'weapon_glock', 'weapon_hkp2000', 'weapon_m249', 'weapon_mac10', 'weapon_mag7',
  128. 'weapon_mp5sd', 'weapon_mp7', 'weapon_mp9', 'weapon_negev', 'weapon_ssg08', 'weapon_zeus',
  129. 'weapon_tec9', 'weapon_ump45', 'weapon_ak47', 'weapon_m4a1_silencer', 'weapon_awp', 'weapon_deagle','weapon_p90']
  130. test = CS()
  131. list=[]
  132. for i in weaponlist:#获取商品信息
  133. data=test.SearchGoods(i)
  134. list.extend(data)
  135. time.sleep(random.randint(10, 60))
  136. while True:#判断商品价格
  137. for i in list:
  138. test.judgepirce(i)
  139. time.sleep(random.randint(10, 60))