聽說最近冰墩墩很火攘滩?那就帶大家用Python寫個搶購腳本吧

事情是這樣子的,昨天有粉絲私信問我能不能寫個腳本搶冰墩墩:
我尋思著這好像也不難吧纸泡,不就是寫一個淘寶搶購的腳本么漂问,于是加班加點寫了一個,結(jié)果寫完測試的時候發(fā)現(xiàn)官方的冰墩墩現(xiàn)在已經(jīng)下架了,只有一些非官方的店在售賣蚤假,也不知道貨是真的還是假的栏饮。不過腳本既然已經(jīng)寫完了,那還是上來分享一波吧磷仰。萬一重新上架了大家還是可以用這個腳本搶購的袍嬉,雖然我仔細看了一下,這吉祥物并不是我喜歡的風(fēng)格芒划,不然我肯定先自己搶到了再上來分享這個腳本冬竟。

廢話不多說,讓我們愉快地開始吧~

相關(guān)文件

需要源碼的可以關(guān)注小編的公眾號【Python日志】民逼,或者在后臺私信小編都可以的喲

開發(fā)工具

Python版本:3.7.8
相關(guān)模塊:
DecryptLogin模塊泵殴;
argparse模塊;
requests模塊拼苍;
pyttsx3模塊笑诅;
prettytable模塊;
以及一些python自帶的模塊疮鲫。

環(huán)境搭建

安裝Python并添加到環(huán)境變量吆你,pip安裝需要的相關(guān)模塊即可。

原理簡介

首先俊犯,要搶購淘寶商品妇多,肯定要先模擬登錄淘寶,這里我們還是借助公眾號之前開源的DecryptLogin包:

項目地址:https://github.com/CharlesPikachu/DecryptLogin
安裝:pip install DecryptLogin

具體而言燕侠,代碼實現(xiàn)如下:

from DecryptLogin import login

'''模擬登錄'''
def login(self):
    lg = login.Login()
    infos_return, session = lg.taobao()
    return infos_return, session

接著者祖,我們來考慮一下如何獲得想要搶購的商品的信息,是不是可以直接添加到購物車绢彤,然后通過查詢購物車信息來獲得我們想要搶購的商品信息呢七问?寫個代碼簡單測試一下:

'''獲得購物車信息'''
def buycartinfo(self):
    url = 'https://cart.taobao.com/cart.htm'
    headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1',
        'upgrade-insecure-requests': '1',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'cache-control': 'max-age=0'
    }
    response = self.session.get(url, headers=headers)
    print(response.text)

發(fā)現(xiàn)返回的數(shù)據(jù)里是有我們需要的信息的:


在這里插入圖片描述

因為請求這個接口的時候我的淘寶購物車是這樣子的:


22.png

剛好是對應(yīng)上的,說明我們抓到的接口沒毛病茫舶,只需要進一步把我們需要的信息提取出來即可:

# 解析購物車信息
if len(cart_infos['list']) == 0:
    raise RuntimeError('購物車是空的, 請在購物車中添加需要搶購的商品')
good_infos = {}
for idx, item in enumerate(cart_infos['list']):
    good_info = {
        'title': item['bundles'][0]['orders'][0]['title'],
        'cart_id': item['bundles'][0]['orders'][0]['cartId'],
        'cart_params': item['bundles'][0]['orders'][0]['cartActiveInfo']['cartBcParams'],
        'item_id': item['bundles'][0]['orders'][0]['itemId'],
        'sku_id': item['bundles'][0]['orders'][0]['skuId'],
        'seller_id': item['bundles'][0]['orders'][0]['sellerId'],
        'to_buy_info': item['bundles'][0]['orders'][0]['toBuyInfo'],
    }
    good_infos[str(idx)] = good_info
# 打印并選擇想要搶購的商品信息
title, items = ['id', 'title'], []
for key, value in good_infos.items():
    items.append([key, value['title']])
self.printTable(title, items)
good_id = input('請選擇想要搶購的商品編號(例如"0"): ')
assert good_id in good_infos, '輸入的商品編號有誤'

效果大概是這樣的:
在這里插入圖片描述

用戶根據(jù)抓取到的自己購物車中的已有的商品信息來選擇自己想要搶購的商品(即械巡,如果你想要搶購某件商品,你需要先把它加入自己的購物車中)饶氏。接下來讥耗,我們需要考慮的就是如何搶購選中的商品了。具體而言嚷往,購買商品的代碼實現(xiàn)如下:

'''購買商品'''
def buygood(self, info, user_id):
    # 發(fā)送結(jié)算請求
    url = 'https://buy.taobao.com/auction/order/confirm_order.htm?spm=a1z0d.6639537.0.0.undefined'
    headers = {
        'cache-control': 'max-age=0', 'upgrade-insecure-requests': '1',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        'origin': 'https://cart.taobao.com', 'content-type': 'application/x-www-form-urlencoded',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'sec-fetch-site': 'same-site', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1',
        'sec-fetch-dest': 'document', 'referer': 'https://cart.taobao.com/',
        'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8'
    }
    cart_id, item_id, sku_id, seller_id, cart_params, to_buy_info = info['cart_id'], info['item_id'], info['sku_id'], info['seller_id'], info['cart_params'], info['to_buy_info']
    data = {
        'item': f'{cart_id}_{item_id}_1_{sku_id}_{seller_id}_0_0_0_{cart_params}_{urllib.parse.quote(str(to_buy_info))}__0',
        'buyer_from': 'cart',
        'source_time': ''.join(str(int(time.time() * 1000)))
    }
    response = self.session.post(url = url, data = data, headers = headers, verify = False)
    order_info = re.search('orderData= (.*?);\n</script>', response.text).group(1)
    order_info = json.loads(order_info)
    # 發(fā)送提交訂單請求
    token = self.session.cookies['_tb_token_']
    endpoint = order_info['endpoint']
    data = order_info['data']
    structure = order_info['hierarchy']['structure']
    hierarchy = order_info['hierarchy']
    linkage = order_info['linkage']
    linkage.pop('url')
    submitref = order_info['data']['submitOrderPC_1']['hidden']['extensionMap']['secretValue']
    sparam1 = order_info['data']['submitOrderPC_1']['hidden']['extensionMap']['sparam1']
    input_charset = order_info['data']['submitOrderPC_1']['hidden']['extensionMap']['input_charset']
    event_submit_do_confirm = order_info['data']['submitOrderPC_1']['hidden']['extensionMap']['event_submit_do_confirm']
    url = f'https://buy.taobao.com/auction/confirm_order.htm?x-itemid={item_id}&x-uid={user_id}&submitref={submitref}&sparam1={sparam1}'
    data_submit = {}
    for key, value in data.items():
        if value.get('submit') == 'true' or value.get('submit'):
            data_submit[key] = value
    data = {
        'action': '/order/multiTerminalSubmitOrderAction', 
        '_tb_token_': token, 
        'event_submit_do_confirm': '1',
        'praper_alipay_cashier_domain': 'cashierrz54', 
        'input_charset': 'utf-8',
        'endpoint': urllib.parse.quote(json.dumps(endpoint)), 
        'data': urllib.parse.quote(json.dumps(data_submit)),
        'hierarchy': urllib.parse.quote(json.dumps({"structure": structure})), 
        'linkage': urllib.parse.quote(json.dumps(linkage))
    }
    headers = {
        'cache-control': 'max-age=0', 'upgrade-insecure-requests': '1', 'origin': 'https://buy.taobao.com',
        'content-type': 'application/x-www-form-urlencoded',
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'navigate', 'sec-fetch-user': '?1',
        'sec-fetch-dest': 'document',
        'referer': 'https://buy.taobao.com/auction/order/confirm_order.htm?spm=a1z0d.6639537.0.0.undefined',
        'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8'
    }
    response = self.session.post(url, data=data, headers=headers)
    if response.status_code == 200: return True
    return False

搶購的邏輯如下葛账,即每隔一段時間嘗試購買一次商品,直到成功為止:

# 根據(jù)選擇嘗試購買商品
print(f'[INFO]: 正在嘗試搶購商品{good_infos[good_id]["title"]}')
while True:
    try:
        is_success = self.buygood(good_infos[good_id], user_id)
    except:
        is_success = False
    if is_success: break
    time.sleep(self.trybuy_interval)
print(f'[INFO]: 搶購{good_infos[good_id]["title"]}成功, 已為您自動提交訂單, 請盡快前往淘寶完成付款')

最終淘寶里的效果如下:


44.png

運行的終端的效果類似這樣:

在這里插入圖片描述

當(dāng)然這樣提示的效果可能不明顯皮仁,畢竟你不會一直盯著這個終端看籍琳,你可以加個語音提示菲宴,代碼如下:

# 電腦語音提示
for _ in range(5):
    pyttsx3.speak('已經(jīng)為您搶購到你所需的商品, 請盡快前往淘寶完成付款.')

當(dāng)然,也許你也不一定一直在電腦邊上趋急,所以你還可以加個server醬提示喝峦,可以在商品搶購成功之后將該消息發(fā)送到你的微信上,代碼如下:

'''發(fā)送Server醬提示'''
def pushwechat(self, desp='已經(jīng)為您搶購到你所需的商品, 請盡快前往淘寶完成付款.'):
    server_url = f'https://sc.ftqq.com/{self.server_key}.send'
    params = {
        'text': '商品搶購成功提示',
        'desp': desp,
    }
    response = requests.get(server_url, params=params)
    return response

server醬配置地址如下:

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

ok呜达,大功告成啦谣蠢,完整源代碼詳見相關(guān)文件。

效果展示

使用方式:

usage: taobaosnap.py [-h] --interval INTERVAL [--key KEY]

淘寶搶購腳本

optional arguments:
  -h, --help           show this help message and exit
  --interval INTERVAL  搶購商品時查詢商品是否可以購買的時間間隔(單位秒)
  --key KEY            Server醬的Key

效果如下:

在這里插入圖片描述

在這里插入圖片描述

server醬的通知效果如下:
在這里插入圖片描述

OK查近,今天的代碼就到這里結(jié)束了眉踱,要是有小伙伴看不懂的話,或者需要源碼的都可以私信小編的哈霜威,或者關(guān)注小編的公眾號【Python日志】谈喳,可以了領(lǐng)取的哈

大家記得給小編點贊+關(guān)注喲

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市戈泼,隨后出現(xiàn)的幾起案子婿禽,更是在濱河造成了極大的恐慌,老刑警劉巖大猛,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭倾,死亡現(xiàn)場離奇詭異,居然都是意外死亡挽绩,警方通過查閱死者的電腦和手機膛壹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唉堪,“玉大人恢筝,你說我怎么就攤上這事【薹唬” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵此改,是天一觀的道長趾撵。 經(jīng)常有香客問我,道長共啃,這世上最難降的妖魔是什么占调? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮移剪,結(jié)果婚禮上究珊,老公的妹妹穿的比我還像新娘。我一直安慰自己纵苛,他們只是感情好剿涮,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布言津。 她就那樣靜靜地躺著,像睡著了一般取试。 火紅的嫁衣襯著肌膚如雪悬槽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天瞬浓,我揣著相機與錄音初婆,去河邊找鬼。 笑死猿棉,一個胖子當(dāng)著我的面吹牛磅叛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播萨赁,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弊琴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了位迂?” 一聲冷哼從身側(cè)響起访雪,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂林,沒想到半個月后臣缀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡泻帮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年精置,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锣杂。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脂倦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出元莫,到底是詐尸還是另有隱情赖阻,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布踱蠢,位于F島的核電站火欧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茎截。R本人自食惡果不足惜苇侵,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望企锌。 院中可真熱鬧榆浓,春花似錦、人聲如沸撕攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杉适,卻和暖如春谎倔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猿推。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工片习, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹬叭。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓藕咏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親秽五。 傳聞我的和親對象是個殘疾皇子孽查,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容