天天看點

剖析一下"搶茅台"腳本底層邏輯

本文作者:梁冬冬

前言: 今天你撸茅台了麼👇? 撸茅台已經成為社會現象🙌,茶餘飯後讨論的最佳實踐😇

2022年雙十一大促已經完美收官,兄弟姐妹克服種種困難與挑戰.. 備戰的會議室忙碌中帶着緊張,當峰值過後的喜悅不言而喻,今年備戰室裡聽着對面的兄弟講述了他搶茅台的經過,以及對馬上來臨的整點茅台活動期待,我也立馬參與進去,但是....沒搶到😭, 帶着種種的疑問,百度了下網上搶茅台的種種手段與方法,發現裡面的存在某種問題或陰謀還真不少,同時作為風險人也想不斷的通過各種技術手段識别發現風險,讓羊毛黨無處躲藏;也許,競争對手比你想象中要更加的強大, 今天就帶你走近搶茅台的腳本,領略下TA們有趣的靈魂;

下面的清單是我總結網絡上普遍存在的一些搶購的方式,這些方式的共性是:模拟單人或多人的操作行為,在最短的時間内完成搶購流程;

類型 方式 熱度 先進性
後端接口腳本 http協定 👍👍 👍
webUI腳本 webdriver 👍👍👍👍👍 👍👍👍
appUI腳本 webdriver and 無障礙模式 👍👍👍 👍👍👍👍👍
adb指令腳本 adb協定 👍👍 👍👍👍👍👍👍

一、webUI腳本解析:

下面是一段網絡上比較常見的某寶的一種搶茅台的腳本,底層邏輯是: 模拟人點選操作路徑,通過腳本重放,循環實作定時、自動化、多并發等操作,最終實作代碼替代人工操作搶走商品;

•像人一樣控制浏覽器:腳本裡是基于webdriver的一種浏覽器驅動方式,可以通過驅動來控制浏覽器實施控制頁面操作,例如裡面使用頻繁的find_elemnt_by_id是通過頁面ID識别的(ID可以通過控制台元素定位擷取到),find_element_by_link_text通過精準比對頁面上的文案,是辨識元素的一種方式;click()是識别元素後的滑鼠點選動作;

•像人一樣進入登入:腳本裡面的run_driver方法,裡面調用了login_in方法,裡面的邏輯大概是模拟使用者輸入使用者名+密碼,點選登入按鈕後,實作登入;

•像人一樣的循環搶購商品:搶購茅台會有對應的搶購時間,這裡的times就是作者設定的搶購時間,循環體裡面會判斷目前時間是否大于等于times時間,如果出現大于等于後,會進入到第二個循環體,尋找下單的按鈕然後進行點選操作;在點選成功後繼續進入到送出訂單頁面,通過link_text識别文案,進行點選操作,最終成功搶購商品成功,進入到待付款頁面;else,如果搶購後無法結算,腳本會通過驅動重新打開商品頁面,然後選擇商品,重新走判斷時間的邏輯,以上;



剖析一下"搶茅台"腳本底層邏輯



二、後端接口腳本解析

下面的代碼是之前GitHub很火的搶購京東飛天茅台jd_seckill腳本,一度被很多人使用(現項目已經停止),底層邏輯:繞過前端UI,整體流程通過協定接口層串聯,可以通過自定義控制搶購的速度,最終實作代碼替代人工操作搶走商品;

•後端接口串聯整體流程實作登入:通過登入通路二維碼頁面、擷取Token票據、校驗票據,擷取cookies

•串聯接口實作搶購流程:點選“搶購”按鈕後,會有兩次跳轉302,最後達到訂單結算頁面,這裡傳回第一次跳轉後的URL,作為商品的搶購連結;



剖析一下"搶茅台"腳本底層邏輯



三、APPUI腳本 以及 adb指令方式 解析

APPUI腳本方式 底層邏輯是:通過手機端(安卓、IOS或模拟器等)通過UI自動化工具或adb指令的方式控制app以及webview來模拟人操作,實施搶購的過程;

•直接進入商品搶購頁面,通過adb指令操作搶購:os.system是py調用shell的一種方式,adb的全稱為Android Debug Bridge,就是起到調試橋的作用; 通過adb shell input tap指令,可以控制手機操作點選手機區域(注:區域為傳遞的X,Y軸的坐标),通過這種方式可以連續操作手機進行搶購活動



剖析一下"搶茅台"腳本底層邏輯





appUI腳本攻擊方式,是通過工具化的手段,例如Uiauto.js、uiautomator、appium等等,實作的手機控制app(内置的webviewH5需要結合webdriver)實作模拟人為操作,實施搶購;

•setup方法:封裝了驅動的一些必要參數,系統的類型、裝置名稱、app包名、首頁面活動頁、使用的浏覽器驅動的位址(H5)等等關鍵核心驅動說明

•appium:此案例裡面使用了appium工具操作,是以remote方式連結appium-server

•核心模拟路徑:所有的操作路徑,業務邏輯封裝在test_search裡,通過坐标點選 以及 H5頁面的操作,在while True裡面無限循環進行搶購商品



剖析一下"搶茅台"腳本底層邏輯