故事的背景以下圖,李笑來 老師於10月19日在 知乎Live 開設 一小時創建終生受用的閱讀操做系統 的講座,他老人家看到你們夥報名踊躍,便在微博上發起了一個 猜數量贏取iPhone7 的活動。javascript
由於該活動註明了「不限猜的次數」,我便用 JavaScript 寫一個自動轉發的腳本,用機器代替手工轉發,結果轉發不到200次就被 李笑來 老師拉黑了,實在掃興。與其獨自鬱悶,不如把技術細節分享給你們,祝你們能早日贏得 iPhone7。個人微博地址是:http://weibo.com/stone0090,歡迎你們來圍觀。java
本覺得花一兩個小時就能搞定這個微博自動轉發的腳本,結果中途不停的踩坑折騰了大半天。還好早早的被 李笑來 老師拉黑。否則用 .NET 重寫工具,再接入 打碼兔,還得再花我好幾個小時。好不容易國慶長假休息一下,還不是想給媳婦換個 iPhone7,我就能用她的 iPhone6s,要否則真心不想花太多時間搗鼓這個。廢話很少說了,進入正題:git
JavaScript:若是不會 JavaScript,建議先學完 JavaScript 闖關記,再繼續看本文。github
Chrome:開發調試 JavaScript 必備神器。瀏覽器
微博會員:據網上流言,普通用戶若是轉發過多會被封號,而會員則不會。安全
打開 Chrome 瀏覽器中,先登陸本身的微博,再進入李笑來老師的微博首頁 http://weibo.com/bylixiaolai 。微信
打開 Chrome 開發者工具(Mac 快捷鍵 option
+ comand
+ j
,Window 快捷鍵 ctrl
+ shift
+ i
),切換 tab 到 NetWork,並點擊 clear,清除初始化時所加載的數據。app
而後手動轉發一次微博,獲取到轉發時所產生的請求。less
利用上圖紅框中的關鍵數據,使用 JavaScript 模擬發送轉發請求,具體代碼以下。dom
// 轉發微博,並評論 function forwardWeibo(content, retcode) { var formData = new FormData(); formData.append('pic_src', ''); formData.append('pic_id', ''); formData.append('appkey', ''); formData.append('mid', '4024988475919525'); formData.append('style_type', '1'); formData.append('mark', ''); formData.append('reason', content); formData.append('location', 'page_100505_home'); formData.append('pdetail', '1005051576218000'); formData.append('module', ''); formData.append('page_module_id', ''); formData.append('refer_sort', ''); formData.append('is_comment_base', '1'); formData.append('rank', '0'); formData.append('rankid', ''); formData.append('_t', '0'); formData.append('retcode', retcode || ''); var xhr = new XMLHttpRequest(); xhr.timeout = 3000; xhr.responseType = "text"; xhr.open('POST', 'http://weibo.com/aj/v6/mblog/forward?ajwvr=6&domain=100505&__rnd=' + new Date().getTime(), true); xhr.onload = function(e) { if (this.status == 200 || this.status == 304) { var data = JSON.parse(this.responseText); if (data.code == "100000") { // 轉發微博成功 console.log(content); } else if (data.code == "100027") { // 轉發微博失敗,須要回答圖片驗證碼的問題 console.log(data); } else { // 轉發微博失敗,其餘緣由 console.log(data); } } }; xhr.send(formData); } //forwardWeibo('轉發內容'); //forwardWeibo('轉發內容',verified('答案')); // 每5秒轉發一次 var count = 35000; setInterval(function(){ forwardWeibo(count++); }, 5000);
打開 Chrome 開發者工具,切換 tab 到 Console,拷貝上面代碼到 Console 中,按回車鍵便可以「5秒1次」的頻率對李笑來老師的這條微博進行轉發評論,如需中止請關閉該頁面再從新打開。
然而僅過了2分鐘,成功轉發50屢次以後,後面的轉發所有失敗。經檢查發現,因爲我轉發頻率過快,被微博官方暫時封號。回答一些簡單的問題把帳號解封,我把轉發頻率由「5秒1次」改成「10秒1次」,由於除我以外還有其餘幾個號也在用腳本刷,他們大概用「10秒1次」的頻率,穩定的轉發沒有間斷過,因此「10秒1次」應該是相對安全的。
我調整頻率以後從新開始轉發,但仍是轉發失敗,手動操做後發現轉發須要輸入驗證碼,之前並無這個環節,看來剛纔的封號是有一些後遺症的。驗證碼我纔不怕,專業的打碼服務 打碼兔 連12306的驗證碼都能輕鬆應付,識別這裏的驗證碼就是小兒科。但接入 打碼兔 的工做量有點大,我仍是先找找看,有沒有更簡單的方法。
果真還真被我找到了,雖然轉發的時候須要輸入驗證碼,但評論的時候並不用,手動操做一把,評論並轉發也能成功,便立刻新增了一個評論的方法,具體代碼以下。
// 評論微博,並轉發 function commentWeibo(content) { var formData = new FormData(); formData.append('act', 'post'); formData.append('mid', '4024988475919525'); formData.append('uid', '1760390531'); formData.append('forward', '1'); formData.append('isroot', '0'); formData.append('content', content); formData.append('location', 'page_100505_home'); formData.append('module', 'scommlist'); formData.append('group_source', ''); formData.append('tranandcomm', '1'); formData.append('pdetail', '1005051576218000'); formData.append('_t', '0'); var xhr = new XMLHttpRequest(); xhr.timeout = 3000; xhr.responseType = "text"; xhr.open('POST', 'http://weibo.com/aj/v6/comment/add?ajwvr=6&__rnd=' + new Date().getTime(), true); xhr.onload = function(e) { if (this.status == 200 || this.status == 304) { if (this.responseText.code == "100000") { console.log(content); } else { console.log(this.responseText) } } }; xhr.send(formData); } //commentWeibo('評論內容'); // 每10秒評論一次 var count = 35000; setInterval(function(){ forwardWeibo(count++); }, 10000);
沒高興幾分鐘,又發現新的問題,評論成功10條,只有1條轉發成功了,這徹底是坑爹啊。看來只有接入 打碼兔 才能完全解決問題了,估計要花二、3個小時才能搞定,算了,先吃飯、洗澡再弄。
磨蹭了一、2個小時以後回來,發現微博轉發輸入驗證碼的限制已經被取消,但我仍心有餘悸,把腳本的頻率改成「30秒1次」讓它慢慢的跑。而後,埋頭研究 打碼兔 的 API,註冊相關開發者帳號,充值測試費用。就在我剛準備寫代碼之際,腳本又失敗了,並且,此次的報錯跟之前都不同,原來是我已經被 李笑來老師拉黑了,不再能轉發評論他老人家任何微博了。
本覺得會刷幾萬條微博出來,沒想到只刷了200條不到,這些微博就留做記念不刪了。下面是提早準備好的批量刪微博的腳本。
//刪除微博 function deleteWeibo() { var items = document.querySelectorAll(".WB_feed_type"); for(var i in items){ if(items[i].getAttribute){ var formData = new FormData(); formData.append('mid', items[i].getAttribute("mid")); var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://weibo.com/aj/mblog/del?ajwvr=6', false); xhr.send(formData); console.log(xhr.responseText); } } } deleteWeibo();
信念瞬間崩塌,思想獲得解放,果斷去抱着媳婦追 權利的遊戲,啪啪啪,真是一個美好夜晚。
最後,祝你們國慶節快樂。若是還想聽我聊技術(che dan),請關注微信公衆號「劼哥舍」,老斯基帶你飆車。