矛與盾 - 記一次刷票經歷

背景

事情是這麼開始的。國慶回家和親戚歡聚一堂,開心嘛,天然要打麻將。php

打了幾圈下來,一不當心贏了八大姑10塊錢。躺在牀上,正在美滋滋地數錢。html

忽然八大姑一個微信找過來,說他的同事的媳婦的妹妹,要參加一個XXX比賽。要刷票!前端

親情,倫理,普世價值觀一瞬間在心頭涌現,手裏的錢它忽然就不香了。git

在這一時刻,我作出了一名黨員應有的判斷。github

拿人錢財,替人消災。golang

刷票的通常步驟

就像江湖,只要有投票存在的地方,有會有刷票的人。ajax

《馬克思主義基本原理》中應該對這個現象應該有過詳細的解釋,只是馬原的課上我大機率在睡覺,也沒怎麼聽。反正人類社會就沒有馬原不能解釋的🐶。docker

人們習慣把刷票的人,稱爲刷子。就好比說我。有時候遇到對手,比拼刷票速度,排行榜上會出現兩個票數奇高的選手,你方唱罷我登場,瘋狂漲票。json

人們驚呼,有兩把刷子。瀏覽器

刷票實際上是有一些樂趣的,就像遊戲同樣,升級打怪,步步爲營。

1. 繞過微信UA

直接在PC端打開頁面,發現有一層微信瀏覽器的驗證。

種狀況,一般多是ua的驗證,或者是須要受權openId的驗證。先繞過UA試試。把UA修改成:

Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; GT-S5660 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.255

一發入魂,進入投票界面。投一票試試:

POST: https://op.bookan.com.cn/index.php
-------------------------------
FormData:
    op: ReadScreen.operateSoundLimit
    instanceId: 0
    weChatId: 
    id: 1377928
    level: 2
    uniCode: fbHCGPyaraaRg64oo4tt1570604768281
    type: 2
    key: SXPg6VhOYYeCsiTrDvZZensypfwhbi
    token: 3b18fb13165cc5c86683fcb5ce221b29
複製代碼

其它參數都很好理解,uniCode / key / token 這三個參數在這種時候就顯得很是靈性了。顯然,這個頁面是作了加密參數的校驗。

2. 繞過前端加密

全文搜索 operateSoundLimit,找到這個ajax的請求源,打上斷點,點擊。找到了這個請求的發出地址。

不斷反覆debug,找到這幾個參數的生成函數。因爲js是通過壓縮混淆,看不懂,不要緊,粘出來。

TokenJs := `function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<<t|n>>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<<r%32,n[14+(r+64>>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e<n.length;e+=16)i=l,a=g,d=v,h=m,g=f(g=f(g=f(g=f(g=c(g=c(g=c(g=c(g=u(g=u(g=u(g=u(g=o(g=o(g=o(g=o(g,v=o(v,m=o(m,l=o(l,g,v,m,n[e],7,-680876936),g,v,n[e+1],12,-389564586),l,g,n[e+2],17,606105819),m,l,n[e+3],22,-1044525330),v=o(v,m=o(m,l=o(l,g,v,m,n[e+4],7,-176418897),g,v,n[e+5],12,1200080426),l,g,n[e+6]...`
TokenExecJs := `var zzzaaa = A('BO0KanIsGoOd%s')`

複製代碼

隨便找個js執行引擎:otto

func GetToken(key string) string {
   vm := otto.New()
   _, err := vm.Run(TokenJs)
   if err != nil {
      panic(err)
   }
   vm.Run(fmt.Sprintf(TokenExecJs, key))
   value, _ := vm.Get("zzzaaa")
   return value.String()
}
複製代碼

3. 驗證碼識別

用PostMan導入腳本測試了幾下以後,發現返回竟然變了,裏面帶上了一個驗證碼圖片的Base64。須要二次請求驗證。

基於規則的驗證碼識別能夠識別絕大多數的弱驗證碼。 再複雜的,就得上機器學習堆各類層,各類網絡了,這個就超出了個人知識範疇了。

至於這個驗證碼,太簡單了,直接接個OCR,就搞定: gosseract

// 抽取返回中的 key 和 驗證碼base64
func GetCaptureUrl(str string) (key string, pngBase64 string) {
   defer func() {
      if err := recover(); err != nil {
      }
   }()
   
   bytes := []byte(str)
   data := map[string]interface{}{}
   _ = json.Unmarshal(bytes, &data)
   key = strconv.FormatFloat(data["data"].(map[string]interface{})["key"].(float64), 'f', -1, 64)
   pngBase64 = strings.TrimSpace(strings.ReplaceAll(data["data"].(map[string]interface{})["image"].(string), "data:image/png;base64,", ""))
   return
}
// 識別結果
func ReadPng(data string) (id, valus string) {
   key, pngBase64 := "", ""
   for key == "" {
      key, pngBase64 = GetCaptureUrl(data)
   }
   b, _ := base64.StdEncoding.DecodeString(pngBase64)
   client := gosseract.NewClient()
   defer client.Close()
   client.SetImageFromBytes(b)
   text, _ := client.Text()
   re, _ := regexp.Compile("[^0-9]") // 因爲驗證碼只有數字,去掉非數字字符
   text = re.ReplaceAllString(text, "") 
   return key, text
}
複製代碼

4. 代理IP池

刷了一段時間以後,發現單IP到達100票左右的時候,繼續投也沒法成功了。

上代理IP池! github.com/awolfly9/IP… 最怕的就是搭環境,直接找個熱心人士編譯的docker run起來。 registry.hub.docker.com/u/yeclimeri…

寫一段獲取代理IP的方法:

func GetProxy() []string {
   var s []string
   resp, _ := http.Get(ProxyPoolUrl)
   reader, _ := simplejson.NewFromReader(resp.Body)
   array, _ := reader.Array()
   for _, a := range array {
      s = append(s, a.(string))
   }
   fmt.Println("proxy:", s)
   return s
}
複製代碼

刷票的車輪就飛快地運轉起來了~

5. 尾聲

做者此時正在回家的途中,沒有辦法操做,因而10分鐘以後:

刷票一時爽啊 T.T。逃...

天下沒有刷不了的票

有一些投票特別嚴格,須要人臉驗證。或者是須要銀行卡實名認證。基本就沒辦法經過程序自動化完成了。這種嚴格的投票,票數一般也不會特別多。

這時候,你能夠充分享受中國的廉價勞動力以及人口紅利帶來的優點。手動狗頭。

祭出法寶:豬八戒大法。


歡迎風控,反做弊的同窗提問~

附錄

代碼: code.byted.org/niejunhao/t…

收費代理池: 收費代理池推薦

收費在線打碼: 雲打碼 打碼兔(推薦)

短信驗證碼: 接碼平臺推薦

相關文章
相關標籤/搜索