我用 80 行核心 JS 程式碼每個月躺著掙一瓶肥宅快樂水
今年520活動和618活動開始的時候,京東的京豆簽到福利很大,動不動就是 10
個 20
個京豆,看的小編是激動不已。
就是每天都要簽到,有時候忙工作忘記簽到,一旦斷簽了心情很是低落 ,比京豆損失還要難過。小編突發奇想,可以不可以有辦法 每天定時自動簽到
呢?經過小編一番苦心研究,發現居然真的可以!!
小編先分享一點小小的戰果給各位,有圖有真相:
小編把相關指令碼,用免費的雲函式每天定時自動部署觸發簽到,現在開始每天躺著領10幾個京豆,每個月攢的京豆甚至可以免費喝一瓶 肥宅快樂水
!!!
接下來小編給大家分享一下自動領京豆的 JS
程式碼思路,核心程式碼只需要 80
行,就可以在 Node
端成功領取京豆啦!
重要宣告:本文只分享自動指令碼的思路和部分核心程式碼邏輯,旨在幫助大家更好的學習 Node端技術 和 雲函式 的相關知識。為了規避相關風險,文章內並不會直接提供原始碼,思路實現有困難的小夥伴可以諮詢小編幫助~
重要宣告:少量刷京豆可以怡情,掙幾個硬幣。 不要利用相關技術從事商業活動呦!
如果這篇文章能給您帶來一點點的幫助的話,麻煩移動下滑鼠點個:heart:贊:heart:吧!您的點贊會給筆者帶來更新的持續動力!
Step.1 身份驗證--獲取使用者cookie
顯然第一步我們先要獲取我們的使用者資訊才能每次用指令碼自動簽到。作為JS前端開發人員,大家都知道使用者資訊一般都會儲存在cookie中(京東的cookie有效時間為 30
天)。接下來我們只需要登入移動版 m.jd.com
[1]
,通過 使用者名稱和密碼登入
(切記),登入完成之後我們就可以在介面找到request請求攜帶的cookie,如下圖所示:
我們只要登入完成之後,取出 request
頭裡的必要 cookie
值即可,第一步已經完成了,是不是很簡單呢!:star:️
Step.2 服務端傳送自動簽到介面
拿到cookie之後,我們只需要找到簽到領取京豆的相關介面,把cookie按照正確的格式傳過去就好啦!程式碼也很簡單( 每一行都有註釋哦
):
const request = require('request');
//步驟一種的cookie值
const KEY = 'pt_pin=xxxxx;pt_key=xxxxx;';
// post通用函式
const postMethod = (options, callback) => {
// 補上通用的headers
options.headers['User-Agent'] = 'JD4iPhone/167169 (iPhone; iOS 13.4.1; Scale/3.00)'
if (options.body) {
options.headers['Content-Type'] = 'application/x-www-form-urlencoded'
}
request.post(options, (error, response, body) => {
callback(error, response, body)
})
}
//先去查詢使用者基本情況 預簽到介面
// key:活動關鍵字 用去區分多種活動 title: 活動標題 acData: 活動編碼 ask:加密活動祕鑰(非必須)
function JDUserSignPre(key, title, acData, ask) {
return new Promise((resolve, reject) => {
const JDUrl = {
url: 'http://api.m.jd.com/?client=wh5&functionId=qryH5BabelFloors',
headers: {
Cookie: KEY
},
//京東介面要求的業務欄位 需要去自行爬介面哦
opts: {
'filter': 'try{var od=JSON.parse(body);var params=(od.floatLayerList||[]).filter(o=>o.params&&o.params.match(/enActK/)).map(o=>o.params).pop()||(od.floorList||[]).filter(o=>o.template=="signIn"&&o.signInfos&&o.signInfos.params&&o.signInfos.params.match(/enActK/)).map(o=>o.signInfos&&o.signInfos.params).pop();var tId=(od.floorList||[]).filter(o=>o.boardParams&&o.boardParams.turnTableId).map(o=>o.boardParams.turnTableId).pop();var page=od.paginationFlrs;return JSON.stringify({qxAct:params||null,qxTid:tId||null,qxPage:page||null})}catch(e){return `=> 過濾器發生錯誤: ${e.message}`}'
},
//京東介面要求的業務欄位 需要去自行爬介面哦
body: `body=${encodeURIComponent(`{"activityId":"${acData}"${ask ? `,"paginationParam":"2","paginationFlrs":"${ask}"` : ``}}`)}`
};
postMethod(JDUrl, async function (error, response, data) {
try {
if (error) {
throw new Error(error)
} else {
const resultData = JSON.parse(data || '{}');
if (data.match(/enActK/)) { // 含有簽到資料
console.log(`${title}活動查詢成功,含有簽到資料, 此處可以集中儲存${key}用於統一統計活動情況`);
const params = resultData.qxAct || (resultData.floatLayerList || []).filter(o => o.params && o.params.match(/enActK/)).map(o => o.params).pop()
resolve({
params: params
}); // 執行簽到處理
}
}
} catch (eor) {
reject()
}
})
})
}
//簽到介面
function JDUserSign(title, body) {
const JDUrl = {
url: 'http://api.m.jd.com/client.action?functionId=userSign',
headers: {
Cookie: KEY
},
body: `body=${body}&client=wh5`
};
postMethod(JDUrl, function (error, response, data) {
try {
if (error) {
throw new Error(error)
} else {
// 簽到成功!
if (data.match(/簽到成功/)) {
console.log(`\n${title}簽到成功(1)`)
if (data.match(/\"text\":\"\d+京豆\"/)) {
const count = data.match(/\"text\":\"(\d+)京豆\"/)[1];
console.log('成功領取京豆數量為:' + count);
}
} else {
console.log('簽到失敗')
}
}
} catch (err) {
console.log(err);
}
})
}
// 正式開始執行簽到
const key = 'JDComputer';
const title = '京東電腦-數碼';
const acData = '31HbNBjr6YLyZfJtR5biFFc9ZYXN';
JDUserSignPre(key, title, acData).then(checkRes => {
JDUserSign(title, checkRes)
}).catch(err => {
console.log('預查詢活動是否可以簽到失敗', err);
})
這樣我們只需要 80
行程式碼就完成了第一個簽到領京豆介面。所有的活動acData都可以在活動H5頁面介面中找到。
其他活動可以自己去尋找哦~~
Step.3 雲函式自動觸發介面呼叫,躺著喝快樂水!
阿里雲函式提供了非常完備的底層介面,上層的使用比較簡單快捷。參考雲函式文件基礎上,配置好 入口函式main.js
和配置好 定時觸發器
,即可實現定時呼叫setp2步驟中的介面。從而達到躺著簽到攢京豆的目的!!
另外,還是要注意一下幾點即可完成一個雲函式搭建:
1、如果需要查詢簽到的活動介面很多,介面超時時間需要設定成最大900s。
2、Node環境版本號版本號要選擇14+。
3、定時觸發器的cron表示式為: CRON_TZ=Asia/Shanghai 0 30 1 * * *
貼上步驟圖:
Step.4 (附加) 將介面呼叫情況傳送到微信
雖然前面三個步驟,我們已經完成了 定時呼叫介面簽到領取京豆
,已經可以達到目的。但是隨著cookie過期或者其他不可抗力因素,難免會存在介面呼叫失敗的情況,那麼我們怎麼能知道介面呼叫成功了呢?答案就是:
通過特定公眾號開發的訊息介面,雲函式服務端對接特定公眾號的介面,從而達到傳送訊息的目的。
小編推薦使用 Server醬微信通知
,使用方法也比較簡單:
1、開啟 sc.ftqq.com/3.version [2] 按要求繫結微信推。
2、開啟 sc.ftqq.com/\?c=code
[3]
獲取含有使用者資訊的訊息祕鑰 scretKey
。
3、用get請求(可以在瀏覽器直接訪問)傳送 sc.ftqq.com/\$\{scretKey\}… [4] 即可完成訊息傳送!
Step.5 寫在最後
完成以上步驟 即可自由的實現京豆簽到嘍!各位讀者可以順著小編的思路進行程式碼開發,也可以去尋找網路上現成的原始碼資源哦~ 最後歡迎各位一起討論,一起愉快的躺著喝肥宅快樂水!!
如果這篇文章能給您帶來一點點的幫助的話,麻煩移動下滑鼠點個:heart:贊:heart:吧!您的點贊會給筆者帶來更新的持續動力!
參考資料
m.jd.com: http://link.juejin.cn?target=m.jd.com
http://sc.ftqq.com/3.version: http://link.juejin.cn?target=http%3A%2F%2Fsc.ftqq.com%2F3.version
http://sc.ftqq.com/?c=code: http://link.juejin.cn?target=http%3A%2F%2Fsc.ftqq.com%2F%3Fc%3Dcode
http://sc.ftqq.com/$%7BscretKey%7D.send?text=%E4%B8%BB%E4%BA%BA%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%88%E6%8C%82%E6%8E%89%E5%95%A6: http://link.juejin.cn?target=https%3A%2F%2Fsc.ftqq.com%2F%24%257BscretKey%257D.send%3Ftext%3D%25E4%25B8%25BB%25E4%25BA%25BA%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8%25E5%258F%2588%25E6%258C%2582%25E6%258E%2589%25E5%2595%25A6
關於本文
來自:掘金乾貨君
http://juejin.cn/post/7112391847133052936
The End
如果你覺得這篇內容對你挺有啟發,我想請你幫我三個小忙:
1、點個 「在看」 ,讓更多的人也能看到這篇內容
2、關注官網 http://muyiy.cn ,讓我們成為長期關係
3、關注公眾號「高階前端進階」,公眾號後臺回覆 「加群」 ,加入我們一起學習並送你精心整理的高階前端面試題。
》》面試官都在用的題庫,快來看看《《
最後不要忘了點贊呦!
祝 2022 年暴富!暴美!暴瘦!
- 我用 80 行核心 JS 程式碼每個月躺著掙一瓶肥宅快樂水
- 【爆肝面試系列】CSS 垂直居中的正確開啟方式
- 你還不會寫 vite 外掛嗎?沒關係,我教你啊!
- 從 3.1k star 的 arco-design collapse 元件分析如何吸收開源專案的知識
- 好傢伙,這是寫了一個“lerna”
- 在 Vue 中更優雅的封裝第三方元件
- 前端瀏覽器除錯小技巧
- 前端演算法入門:刷演算法題常用的 JS 基礎掃盲
- vue專案你一定會用到的效能優化!
- 使用 Three.js 實現跳一跳遊戲
- 我幫一朋友重構了點程式碼,他直呼牛批,但基操勿六
- 安利一個阮一峰週刊推薦的前端小程式容器技術
- 純 CSS 實現十個還不錯的 Loading 效果
- 基於 Vue 百度地圖的多車實時運動及軌跡追蹤實現
- 請問:怎麼實現大檔案快速上傳?
- 如何用油猴提升前端開發效率
- 在專案中用ts封裝axios,一次封裝整個團隊受益
- 野路子中高階前端進階之路
- 元件庫的文件是用什麼寫的?
- 「1.9W字總結」一份通俗易懂的 TS 教程,入門 實戰!