小言_互联网的博客

听说某宝抢购脚本大家都会了?那就在来个某东茅台抢购脚本吧。

583人阅读  评论(0)

前言

      某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于11-17还是可用的,大家拿去白嫖吧!

需要用到的一些工具


  
  1. Python版本:3.7.8
  2. 相关模块:
  3. DecryptLogin模块;
  4. argparse模块;
  5. requests模块;
  6. pyttsx3模块;
  7. beautifulsoup4模块;
  8. prettytable模块;
  9. 以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

 

具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。

因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:

pip install DecryptLogin

具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。

因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:

pip install DecryptLogin

然后简单几行代码就能实现京东商城的模拟登录操作啦:


  
  1. from DecryptLogin import login
  2. '''模拟登录'''
  3. def login( self):
  4. lg = login.Login()
  5. infos_return, session = lg.jingdong()
  6. return infos_return, session

另外,为了避免经常需要重复扫码登录的问题,我加了个导入历史cookies的代码段(淘宝抢购那个脚本也有):


  
  1. if os. path.isfile(cookie_cache_name):
  2. self.session = requests.Session()
  3. loadSessionCookies( self.session, cookie_cache_name)
  4. else:
  5. self.infos_return, self.session = self.login()
  6. saveSessionCookies( self.session, cookie_cache_name)

但是没有加验证cookies是否还在有效期内的代码,感兴趣的同学可以自己添加一下,不感兴趣的同学每次过段时间代码报错就自己手动删下:

cookie_cache.pkl

这个文件吧,作为懒惰的惩罚吧,就在你运行代码的那个文件夹里。

接着,我们来获取一下当前购物车里的商品信息,和之前一样,简单抓包的结果如下:

 

代码实现如下:


  
  1. cart_url = 'https: //api.m.jd.com/api?'
  2. headers = {
  3. 'User-Agent': 'Mozilla/ 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/ 98.0. 4758.82 Safari/ 537.36',
  4. 'origin': 'https: //cart.jd.com',
  5. 'Referer': 'https: //cart.jd.com',
  6. }
  7. data = {
  8. 'functionId': 'pcCart_jc_getCurrentCart',
  9. 'appid': 'JDC_mall_cart',
  10. 'loginType': '3',
  11. }
  12. response = self.session. post(cart_url, headers=headers, data=data)
  13. print(response.text)

 ​​​​​​​

 

 看起来没什么问题,把我们需要的数据提取出来:


  
  1. response_json, cart_infos = response.json(), {}
  2. for idx, item in enumerate(response_json[ 'resultData'][ 'cartInfo'][ 'vendors']):
  3. cart_info = {
  4. 'title': self.rematch( r"'Name': '(.*?)',", str(item)),
  5. 'Id': item[ 'sorted'][ 0][ 'item'][ 'Id'],
  6. 'skuUuid': self.rematch( r"'skuUuid': '(.*?)',", str(item)),
  7. 'IdForOldVersion': self.rematch( r"'IdForOldVersion': (.*?),", str(item)),
  8. 'SType': '11',
  9. }
  10. cart_infos[ str(idx)] = cart_info

接着打印并让用户选择想要抢购的商品信息:


  
  1. # 打印并选择想要抢购的商品信息
  2. title, items = [ 'id', 'title'], []
  3. for key, value in cart_infos.items():
  4. items.append([key, value[ 'title']])
  5. self.printTable(title, items)
  6. good_id = input( '请选择想要抢购的商品编号(例如"0"): ')
  7. assert good_id in cart_infos, '输入的商品编号有误'

 效果大概是这样子的:

 最后根据用户的选择结果进行下单就ok啦,下单相关的代码实现如下:


  
  1. '''购买商品'''
  2. def buygood( self, good_info):
  3. # 取消勾选购物车中的所有商品
  4. url = 'https://cart.jd.com/cancelAllItem.action'
  5. data = {
  6. 't': 0,
  7. 'outSkus': '',
  8. 'random': random.random(),
  9. }
  10. response = self.session.post(url, data=data)
  11. # 勾选指定商品商品
  12. url = 'https://api.m.jd.com/api'
  13. body = '{"operations":[{"ThePacks":[{"num":1,"sType":%s,"Id":%s,"TheSkus":[{"num":1,"Id":"%s","skuUuid":"%s","useUuid":false}]}]}]}' % \
  14. (good_info[ 'SType'], good_info[ 'Id'], good_info[ 'IdForOldVersion'], good_info[ 'skuUuid'])
  15. data = {
  16. 'functionId': 'pcCart_jc_cartCheckSingle',
  17. 'appid': 'JDC_mall_cart',
  18. 'body': body,
  19. 'loginType': '3',
  20. }
  21. headers = {
  22. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
  23. 'origin': 'https://cart.jd.com',
  24. 'Referer': 'https://cart.jd.com',
  25. }
  26. response = self.session.post(url, data=data, headers=headers)
  27. # 获取订单结算页面信息
  28. url = 'http://trade.jd.com/shopping/order/getOrderInfo.action'
  29. params = {
  30. 'rid': str( int(time.time() * 1000)),
  31. }
  32. headers = {
  33. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
  34. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
  35. 'Referer': 'https://cart.jd.com/cart.action',
  36. 'Connection': 'keep-alive',
  37. 'Host': 'trade.jd.com'
  38. }
  39. response = self.session.get(url=url, params=params, headers=headers)
  40. if '刷新太频繁了' in response.text:
  41. print( f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 刷新太频繁了')
  42. raise RuntimeError( '刷新太频繁了')
  43. if response.status_code != requests.codes.OK:
  44. print( f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 当前请求存在错误')
  45. raise RuntimeError( '当前请求存在错误')
  46. soup = BeautifulSoup(response.text, 'html.parser')
  47. risk_control = soup.select( 'input#riskControl')[ 0].get( 'value').strip( ' \t\r\n')
  48. order_detail = {
  49. 'address': soup.find( 'span', id= 'sendAddr').text[ 5:],
  50. 'receiver': soup.find( 'span', id= 'sendMobile').text[ 4:],
  51. 'total_price': soup.find( 'span', id= 'sumPayPriceId').text[ 1:],
  52. 'items': []
  53. }
  54. # 提交订单
  55. url = 'https://trade.jd.com/shopping/order/submitOrder.action'
  56. data = {
  57. 'overseaPurchaseCookies': '',
  58. 'vendorRemarks': '[]',
  59. 'submitOrderParam.sopNotPutInvoice': 'false',
  60. 'submitOrderParam.trackID': 'TestTrackId',
  61. 'submitOrderParam.ignorePriceChange': '0',
  62. 'submitOrderParam.btSupport': '0',
  63. 'riskControl': order_detail,
  64. 'submitOrderParam.isBestCoupon': '1',
  65. 'submitOrderParam.jxj': '1',
  66. 'submitOrderParam.trackId': '9643cbd55bbbe103eef18a213e069eb0',
  67. 'submitOrderParam.needCheck': '1',
  68. }
  69. if self.paywd is not None:
  70. data[ 'submitOrderParam.payPassword'] = ''.join([ 'u3' + x for x in self.paywd])
  71. headers = {
  72. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
  73. 'Host': 'trade.jd.com',
  74. 'Referer': 'http://trade.jd.com/shopping/order/getOrderInfo.action',
  75. }
  76. response = self.session.post(url=url, data=data, headers=headers)
  77. response_json = response.json()
  78. if response_json.get( 'success'): return True
  79. return False

最终京东里的效果如下:

 

 当然这样提示的效果可能不明显,毕竟你不会一直盯着这个终端看,你可以加个语音提示,代码如下:


  
  1. # 电脑语音提示
  2. for _ in range( 5):
  3. pyttsx3. speak( '已经为您抢购到你所需的商品, 请尽快前往京东完成付款.')

当然,也许你也不一定一直在电脑边上,所以你还可以加个server酱提示,可以在商品抢购成功之后将该消息发送到你的微信上,代码如下:


  
  1. '''发送Server酱提示'''
  2. def pushwechat( self, desp='已经为您抢购到你所需的商品, 请尽快前往京东完成付款.'):
  3. server_url = f'https://sc.ftqq.com/{self.server_key}.send'
  4. params = {
  5. 'text': '商品抢购成功提示',
  6. 'desp': desp,
  7. }
  8. response = requests.get(server_url, params=params)
  9. return response

 

server酱配置地址如下:

http://sc.ftqq.com/3.version

ok,大功告成啦,完整源代码关注文末公众号即可

使用方式:​​​​​​​


  
  1. usage: jingdongsnap.py [-h] [--interval INTERVAL] [--paywd PAYWD] [-- key KEY]
  2. 京东抢购脚本
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. --interval INTERVAL 抢购商品时查询商品是否可以购买的时间间隔(单位秒)
  6. --paywd PAYWD 支付密码, 部分商品需要支付密码才能提交订单, 输入密码不会导致你直接购买商品, 请放心使用
  7. -- key KEY Server酱的 Key

 效果展示:

 快拿去用吧,需要完整代码的可关注下方公众号哦!


转载:https://blog.csdn.net/weixin_43881394/article/details/127898362
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场