手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

極度狂熱發表於2018-11-08

有人說程式設計師不懂浪漫,還有一些梗說即使是女神/男神,換行不同也不相為謀。 更別說,有的 女生/男生 有自己喜歡的 小哥哥/小姐姐,黑我們作為程式設計師不懂他們的追星樂趣。

OK,我們可能不懂追星的那份樂趣,但是如果能夠讓你們開心。那我們也願意。

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

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

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

在手機上抓包資料

開啟Charles,用手機連線它。

  1. 選單裡面找到 Proxy => ProxySetting =>檢視自己的埠(一般都是8888)
  2. 然後檢視自己的IP地址,window在CMD中輸入ipconfig, Mac/Linux 在terminal中輸入 ifconfig 並在手機中配置
    手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰
填入自己的IP地址即可。圖上是我的本機IP地址。

這個時候就可以看到這樣的畫面了

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

可以看到左邊請求的地址來自於https,進行了加密,我們的請求API也變成了unknown。如果我們想要獲取SSL的內容,需要給手機安裝證照,獲取許可權。

在選單選擇Help => SSL Proxying => Install Charles Root….,根據自己的裝置進行選擇。如果是手機,就選擇第四項。如圖。

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

然後會彈出這個畫面

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

在手機上用chrome瀏覽器(系統預設瀏覽器可能導致識別證照,就無法安裝)訪問 chls.pro/ssl 即可下載證照,按照提示安裝之後。就會發現,之前unknown的API變的可見啦!

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

之後你在手機上的每一步操作,都會在這裡得到提示。

模擬請求

得到了我們想要的資料之後,我們該怎麼做呢? 就拿我使用的這款小程式來說,它的設限是每隔兩分鐘可以偷一次花,一次可以偷5個人。 但是我每天都要上班,時時刻刻的掏手機給偶像進行投票?可能不太好吧?

這個時候,我們需要的是在手機上先進行一次投票操作,就可以在charles的左邊選單欄獲取到對應的請求。 這個時候,我們需要對想要模擬的請求點選右鍵,選擇repeat。就可以進行重複投票了。

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

點選右邊contents可以看到兩個引數,一個叫 openid,是你自己在這個小程式的唯一編碼,相當於你在這個小程式的身份證。另一個是mid,是偷取的明星的編號。

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

你偷取5個明星,記錄5次API,每隔2分鐘,請求這幾個API,就能保證自己不會錯過任何一朵花。

難道需要一直開著Charles?

答案當然是否定的啦! 這個時候需要另一個工具,叫做Postman。是一個可以模擬HTTP請求的一個工具。 你在裡面只要輸入,請求的API地址,再填入一大堆配置引數,以及header等等,就可以傳送成功了。

有沒有簡單的方法呢? 有! 在Charles裡面對請求點右鍵,選擇Copy cURL Request

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰

然後在Postman裡面,點選最上欄的Import。

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰
選擇Paste Raw Text 將剛剛複製的地址,貼上進去。

然後在右側視窗就會生成一個模擬好的請求,點選Send!

手把手教你給偶像刷票。偶像來了?程式設計師來了!Charles實戰
偷取成功!

再進一步,讓一切都自動化起來。

這個時候,你在想,我為什麼一定要隔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進行了多個裝置的更換,標記為可疑,等等。

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

總結

看到了這裡,你可以隨心所欲的給你的女神/男神去刷票啦! 既沒有浪費時間去一直等待投票的時間,又得到了心裡的滿足。 如果你看完了這篇文章,那恭喜你,還學到了新知識。

/為了免去不必要的麻煩,我隱去了我使用的投票軟體。/

相關文章