如何開發一個搶單chrome外掛
阿新 • • 發佈:2019-01-03
出於學寫chrome外掛&滿足買買買心態的目的,試了下從零開始寫一個chrome搶單外掛。實驗的網站是nike和adidas的美國官網。
大致歷程
- 買本chrome外掛教程通讀一下。 在陽臺上晒晒太陽喝著下午茶,看起來還巨簡單,很開心的2小時。
- 跟著教程學寫最簡單的chrome外掛。so easy,一晚上很愉快的度過,一點點成就感。
- 瞭解nike和adidas網站購買下單流程,分析使用者需求&網路請求。需要點耐心,國內網站會更快一點。
- 設計外掛功能和樣式。畫畫頁面設計圖(就是幾個表單),流程圖(狀態指來指去,一種天下我有的爽感)。
- 寫外掛。一言難盡吧~~~
外掛設計
需求
- 使用者生成待搶訂單,填寫商品url、規格、數量、地址、支付資訊等。
- 自動刷商品、下單。(可同時刷多單,檢視訂單列表、狀態、詳情)
功能概述
- 根據使用者給的網站賬號自動登入。
- 根據商品連結抓取商品資訊、規格等。
- 生成待搶訂單。
- 自動刷商品頁,加購物車。
- 自動填寫地址、支付資訊,下單。
頁面設計
- 配置頁(nike和adidas使用者賬戶、address、payment資訊,其他可配置項)
- 商品詳情頁
- 訂單詳情頁
- 訂單列表頁
訂單狀態圖
自己在稿紙上畫了一個圖,大致包括prepare、start、cart、ordering、succ、fail等幾個狀態。
- adidas為例,實際狀態比預想的多,用一個Pipeline控制流程:
private static final int CODE_FAIL = 0;
private static final int CODE_PREPARE_ORDER = 1;
private static final int CODE_ADD_TO_CART = 2;
private static final int CODE_CHECKOUT = 3;
private static final int CODE_ADD_ADDRESS = 4;
private static final int CODE_CHOOSE_SHIPPING = 5;
private static final int CODE_ADD_PAYMENT = 6;
private static final int CODE_ADD_PAYMENT_1 = 12;
private static final int CODE_REVIEW_ORDER_1 = 11;
private static final int CODE_REVIEW_ORDER = 7;
private static final int CODE_THANK_YOU_PAGE = 8;
private static final int CODE_SIGN_IN = 9;
private static final int CODE_UNKNOWN = 10;
資料表設計
- 訂單表 Order
- OrderStatus(enum 訂單狀態)
- 商品表 Goods
- 使用者資訊表
- User, 外掛使用者
- Account, 購物網站賬戶
- Address,購物網站收貨地址
- 購物網站表 Site
外掛開發
包括2部分,摘取一些程式碼片段以供參考。
- 外掛本身: 頁面、資料表
- 模擬下單:登入、規格庫存獲取、加購物車、下單,模擬使用者手動下單時傳送的網路請求
抓取商品頁 (以Adidas為例)
private ExecResult<Document> getOneSkuInfoPage(String url) {
try {
doc = AdidasUtils.getHttpGetResponseWithDocument(url, "", httpsClient);
return createResult(true, doc, null);
} catch (IOException e) {
LogUtils.info(AdidasConstants.ERROR_PREFIX + e.toString());
}
return createResult(false, doc, "Get goods page fail.");
}
public static Document getHttpGetResponseWithDocument(String url, String referrer,
DecompressingHttpClient httpClient) throws IOException {
AdidasUtils.printHtmlUrl(url);
response = getHttpGetResponse(url, referrer, httpClient);
Document doc = Jsoup.parse(EntityUtils.toString(response.getEntity(), "UTF-8"));
EntityUtils.consume(response.getEntity());
AdidasUtils.printHtmlTitle(doc);
return doc;
}
在商品詳情頁抓取商品資訊
登入
模擬登入的過程有點難,會遇到各種問題,比如token之類的。見 http://blog.csdn.net/maowenbei/article/details/72809063