手把手教你給偶像刷票。偶像來了?程序員來了!Charles實戰

有人說程序員不懂浪漫,還有一些梗說即便是女神/男神,換行不一樣也不相爲謀。 更別說,有的 女生/男生 有本身喜歡的 小哥哥/小姐姐,黑咱們做爲程序員不懂他們的追星樂趣。javascript

OK,咱們可能不懂追星的那份樂趣,可是若是可以讓大家開心。那咱們也願意。java

接下來,就實戰演示一下,如何討好你的追星另外一半。node

(雖然我只在安卓手機上測試過,iphone應該同理)程序員

  1. 首先,你須要一部手機,裝一個你想要投票的APP/網頁/小程序。
  2. 電腦上安裝一個抓包軟件,這裏我使用的是Charles
  3. Postman等,能模擬網絡請求的工具。

在手機上抓包數據

打開Charles,用手機鏈接它。chrome

  1. 菜單裏面找到 Proxy => ProxySetting =>查看本身的端口(通常都是8888)
  2. 而後查看本身的IP地址,window在CMD中輸入ipconfig, Mac/Linux 在terminal中輸入 ifconfig 並在手機中配置

填入本身的IP地址便可。圖上是個人本機IP地址。

這個時候就能夠看到這樣的畫面了 json

能夠看到左邊請求的地址來自於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進行了多個設備的更換,標記爲可疑,等等。

可是是否值得,就是另外一個討論的範疇了。

總結

看到了這裏,你能夠爲所欲爲的給你的女神/男神去刷票啦! 既沒有浪費時間去一直等待投票的時間,又獲得了內心的知足。 若是你看完了這篇文章,那恭喜你,還學到了新知識。

/爲了免去沒必要要的麻煩,我隱去了我使用的投票軟件。/

相關文章
相關標籤/搜索