有人說程式設計師不懂浪漫,還有一些梗說即使是女神/男神,換行不同也不相為謀。 更別說,有的 女生/男生 有自己喜歡的 小哥哥/小姐姐,黑我們作為程式設計師不懂他們的追星樂趣。
OK,我們可能不懂追星的那份樂趣,但是如果能夠讓你們開心。那我們也願意。
接下來,就實戰演示一下,如何討好你的追星另一半。
(雖然我只在安卓手機上測試過,iphone應該同理)
在手機上抓包資料
開啟Charles,用手機連線它。
- 在選單裡面找到 Proxy => ProxySetting =>檢視自己的埠(一般都是8888)
- 然後檢視自己的IP地址,window在CMD中輸入ipconfig, Mac/Linux 在terminal中輸入 ifconfig 並在手機中配置
這個時候就可以看到這樣的畫面了
可以看到左邊請求的地址來自於https,進行了加密,我們的請求API也變成了unknown。如果我們想要獲取SSL的內容,需要給手機安裝證照,獲取許可權。
在選單選擇Help => SSL Proxying => Install Charles Root….,根據自己的裝置進行選擇。如果是手機,就選擇第四項。如圖。
然後會彈出這個畫面
在手機上用chrome瀏覽器(系統預設瀏覽器可能導致識別證照,就無法安裝)訪問 chls.pro/ssl 即可下載證照,按照提示安裝之後。就會發現,之前unknown的API變的可見啦!
之後你在手機上的每一步操作,都會在這裡得到提示。
模擬請求
得到了我們想要的資料之後,我們該怎麼做呢? 就拿我使用的這款小程式來說,它的設限是每隔兩分鐘可以偷一次花,一次可以偷5個人。 但是我每天都要上班,時時刻刻的掏手機給偶像進行投票?可能不太好吧?
這個時候,我們需要的是在手機上先進行一次投票操作,就可以在charles的左邊選單欄獲取到對應的請求。 這個時候,我們需要對想要模擬的請求點選右鍵,選擇repeat。就可以進行重複投票了。
點選右邊contents可以看到兩個引數,一個叫 openid,是你自己在這個小程式的唯一編碼,相當於你在這個小程式的身份證。另一個是mid,是偷取的明星的編號。
你偷取5個明星,記錄5次API,每隔2分鐘,請求這幾個API,就能保證自己不會錯過任何一朵花。
難道需要一直開著Charles?
答案當然是否定的啦! 這個時候需要另一個工具,叫做Postman。是一個可以模擬HTTP請求的一個工具。 你在裡面只要輸入,請求的API地址,再填入一大堆配置引數,以及header等等,就可以傳送成功了。
有沒有簡單的方法呢? 有! 在Charles裡面對請求點右鍵,選擇Copy cURL Request
然後在Postman裡面,點選最上欄的Import。
選擇Paste Raw Text 將剛剛複製的地址,貼上進去。然後在右側視窗就會生成一個模擬好的請求,點選Send!
偷取成功!再進一步,讓一切都自動化起來。
這個時候,你在想,我為什麼一定要隔2分鐘點一次? 我就不能讓程式自動化起來嗎?
在這裡用nodejs做例子。 執行cURL命令去呼叫API。
var exec = require('child_process').exec;
var sys = require('sys');
const hasFlowers = [];
//通過上面教的方法,將想要偷取的明星mid放入陣列。
const idolsIds = [];
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
async function createCurlRequestLink() {
const startTime = new Date();
//填入你的OpenId
const openid = 'XXXX';
await asyncForEach(idolsIds, async (number) => {
// for(let number = 1150; number<=3000; number++){
const a = `curl XXXXXXX '{\"openid\":\"${openid}\",\"mid\":${number}}' --compressed`;
await sleep(280);
exec(a, (error, stdout, stderr) => {
try {
console.log(stdout);
const json = JSON.parse(stdout);
if (json.status > 0) {
hasFlowers.push(number);
console.log(`鮮花總數: ${hasFlowers.length * 8}`);
}
} catch (err) {
console.log(err);
}
});
});
const endTime = new Date();
console.log(`花費時間: ${(endTime - startTime) / 1000}`);
}
createCurlRequestLink();
// 每2分鐘去偷取一次
setInterval(createCurlRequestLink, 120000);
複製程式碼
然後用 node 檔名 就可以執行它了。
把它丟在伺服器上,用screen放在background程式裡跑起來。
不知不覺中,幾十萬的花已經到手啦!
原理是什麼?開發者就不能進行防護嗎?
不論是小程式還是APP,都是在你的手機上。它需要和遠端的伺服器進行資料互動,也就是API請求。 本質上,我們只是進行了一次模擬請求,相當於你手機進行了點選。 而講到剛剛的部分,我們也依舊是在合理的操作範圍許可內。並沒有任何的作弊行為,只不過讓偷花的行為變得自動化了起來。能夠在凌晨也讓電腦替我們偷花。
至於開發者能不能防護呢? 這個答案是肯定的。 比如,對每一個openid進行來源監測,訪問裝置的監控,請求的時候攜帶額外引數判斷來源。 如果短期內Openid進行了多個裝置的更換,標記為可疑,等等。
但是是否值得,就是另一個討論的範疇了。
總結
看到了這裡,你可以隨心所欲的給你的女神/男神去刷票啦! 既沒有浪費時間去一直等待投票的時間,又得到了心裡的滿足。 如果你看完了這篇文章,那恭喜你,還學到了新知識。
/為了免去不必要的麻煩,我隱去了我使用的投票軟體。/