距離上一篇年終總結的文章已經過了3個多月了,在年終總結中寫到了利用指令碼自動薅羊毛的話題,評論裡有不少小夥伴比較感興趣。so,今天就來給大家詳細介紹一下如何讓技術創造價值(得給薅羊毛上升一個層次)。本文沒有什麼技術難點,即使技術小白也能輕鬆上手。
手機裡的各種APP為了留住使用者,增加日活月活量,基本上都會推出簽到換禮品之類的活動。接下來我就拿我之前經常用的叮咚買菜APP來舉例,教大家一步一步走向薅羊毛的光明大路。
前期準備工作
- 抓包工具(比如charles)
- node環境
- 騰訊雲賬號
抓包
如何實現對手機端請求的抓包,我在這篇文章charles抓包中有介紹,不瞭解的小夥伴可以先看看這篇文章,本文就不做過多介紹。配置好代理之後,接下來就到了重點環節。
分析請求url及引數
首先我們需要找到某個動作對應的實際請求url
。拿叮咚買菜的簽到功能舉例,點選去簽到,會抓到很多請求,從名字中一眼就能看到我們要的url
是哪個。
從上圖中可以看到請求的url
、header
以及返回的響應。有了這些東西,我們就可以著手寫程式了。
具體程式碼編寫
node
端傳送ajax
請求的庫有許多,在這裡我們選用熟悉的axios
。
首先來構造一下header
:
const SIGN_IN_HEADER = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-cn",
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
"ddmc-api-version": "9.7.3",
"ddmc-build-version": "9.48.1",
"ddmc-app-client-id": "13",
"ddmc-station-id": "5f1378ce93e0310001d3609e",
"origin": "https://activity.m.ddxq.mobi",
"Referer": "https://activity.m.ddxq.mobi/",
"Cookie": 'xxxxxxxxxxxxxx',
"User-Agent": 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 xzone/9.48.1 station_id/5f1378ce93e0310001d3609e'
}
接下來是表單提交的data
資訊:
const POST_DATA = {
"api_version": 9.1,
"station_id": "5f1378ce93e0310001d3609e",
"latitude": "40.050802",
"longitude": "116.413449"
}
有了header
和data
,就可以傳送請求了。
const SIGN_IN_URL = 'https://sunquan.api.ddxq.mobi/api/v2/user/signin/';
axios.post(SIGN_IN_URL, {
data: POST_DATA
}, {
headers: SIGN_IN_HEADER
}).then(res => {
console.log(res.data, 'success');
}).catch(err => {
console.log(err, 'error');
});
執行上述程式碼,在控制檯列印出以下資訊:
可以看到,和我們上面抓包截圖中的返回資訊是一致的,大功告成。
經過上述的步驟,已經可以做到用程式來解決簽到的問題了。叮咚買菜裡還有一些其他的任務,比如說養魚的小遊戲,每天做任務餵食可以換草魚,到目前為止已經白嫖了好幾條。具體的任務實現步驟都是一樣的,在這裡就不做過多的介紹了。
上面的程式需要每天手動執行一下才行,需要人為參與。有追求的我們怎麼能滿足於此呢,程式已經長大了,得學會自己跑起來。接下來有請騰訊雲函式閃亮登場。
騰訊雲函式自動執行
騰訊雲函式官方地址在這裡。
新建函式
進入後選擇函式服務 -> 可以手動選擇一個離你近的地區 -> 新建。
然後選擇從頭開始,可以起一個有標識的名字,比如我這裡就叫的dingdong
,然後執行環境選擇node12.16
,高版本的node
不知道是不是有什麼bug,非同步請求好像沒有傳送,在日誌中看不到列印的資訊(害我折騰了好久,明明本地就可以,部署上去就是不行)。
函式程式碼提交方式選擇本地上傳資料夾,執行方法不用修改,執行方法表明了呼叫雲函式時需要從哪個檔案中的哪個函式開始執行。這裡index.main_handler
中的 index
表示執行的入口檔案為 index.js
,main_handler
表示執行的入口函式為 main_handler
。因此需要在本地根目錄建立一個index.js
檔案。
入口index.js
檔案:
'use strict';
exports.main_handler = async (event, context) => {
//需要加上這個,解決熱啟動問題
delete require.cache[require.resolve('./src/sign.js')];
require('./src/sign.js');
};
然後將整個資料夾上傳即可。
接下來的高階配置和觸發器配置都先不用管,直接點選建立就可以生成雲函式。
部署
然後進入函式管理 -> 函式程式碼,就可以看到我們剛才上傳的資料夾全部內容(新版雲函式10M以上的內容只展示入口檔案)。點選部署,我們的程式碼就部署到雲伺服器上了。
點選測試,可以線上進行測試並除錯,在日誌查詢中可以看到列印出來的資訊。
定時器配置
記下來就是對定時器的配置。
入口在在函式管理的觸發管理。
進入後選擇建立觸發器,其中觸發週期有幾個設定好的值,如果不喜歡的話可以選擇自定義觸發週期。有關Cron
表示式的設定可以參考這裡。一共有 7 個欄位,分別代表了秒、分、小時、日、月、星期、年。圖中代表的意思就是每天的 8 點 13 分 14 秒會自動觸發一次。
如果急著測試的話,可以再新建一個觸發器,選擇每分鐘執行一次,這樣就可以不用怎麼等待就能看到效果。但是測試完千萬記得要把這個定時器關了,我的一塊錢就是這麼浪費掉的。
接下來就基本不用再操心,雲函式會在設定好的時間自動執行。需要我們做的就是偶爾回來看一眼,如果今天的任務沒有執行成功,大概率是cookie
過期了,再抓包獲取一下cookie
替換就可以了。
好了,有關薅羊毛的教程到這裡就結束了。大家可以看看自己常用的APP及網站,沒事的時候搗鼓搗鼓。
建議
薅羊毛不易,大家且薅且珍惜,說不定哪天平臺就改了規則或者把你關到了小黑屋,可不賴我。