最近登錄學信網發現自己學信網上綁定的手機號碼不是目前自己使用的手機號碼,於是想改綁手機號,但是發現不記得之前的手機號碼了:
於是百度各種方法都無濟於事;也不想重新注冊賬號,最后看見一篇文章通過Python寫腳本模擬提交這個號段的所有號碼做驗證,
感覺挺靠譜,但是本人不會Python,也不想現學,不過我會node.js,我想通過 node.js + puppeteer 實現相同的功能,於是開干:
第一步:登錄“查號吧”查找出匹配老號碼的所有號段:傳送門
輸入學信網提示的老號碼的前三位與后兩位,地區和城市我這里也不太記得了,但自己能肯定不是綿陽就是成都,因為自己只辦過這兩個城市的手機號;最后點擊查詢;
按F12后點查詢,可以看到接口返回的數據,我這里看到我的老號碼159開頭01結尾的號碼成都地區為16000條數據;然后點擊Respone 復制所有數據(這里因為數據量比較大,我在谷歌瀏覽器中復制控制台會被強制關閉,最后在360瀏覽器中成功復制);復制出來后先在記事本中保存:
第二步: 開始搭建項目寫腳本
我這里直接用的node的egg.js框架,然后安裝puppeteer插件,直接貼代碼:
1 "use strict"; 2 3 const Controller = require("egg").Controller; 4 const puppeteer = require("puppeteer"); 5 const numberList = require("../../const/index"); // 這里面是上面復制的所有電話號碼 6 class HomeController extends Controller { 7 async index() { 8 const browser = await puppeteer.launch({ 9 // 使用無頭模式,默認為有頭(true為無界面模式) 10 headless: false, 11 // 設置打開頁面在瀏覽器中的寬高 12 defaultViewport: { 13 width: 1200, 14 height: 800, 15 }, 16 // 設置每個步驟放慢/毫秒 17 slowMo: 0, 18 }); // 返回瀏覽器實例 19 const page = await browser.newPage(); // 創建新頁面,並返回頁面對象 20 // 設置客戶端 21 await page.setUserAgent( 22 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36" 23 ); 24 // 進入指定頁面(學信網) 25 await page.goto( 26 "https://account.chsi.com.cn/passport/login?service=https%3A%2F%2Faccount.chsi.com.cn%2Faccount%2Fj_spring_cas_security_check", 27 { 28 waitUntil: ["domcontentloaded"], 29 } 30 ); 31 await page.type("#username", "你的學信網賬號"); // 模擬輸入賬號(替換成你的學信網賬號) 32 await page.type("#password", "你的學信網密碼"); // 模擬輸入密碼(替換成你的學信網密碼) 33 // 模擬點擊登錄 34 await Promise.all([ 35 page.click("input[name='submit']"), 36 page.waitForNavigation(), 37 ]); 38 let count = 0; // 計數,從電話號碼列表中的第一個開始 39 await page.click("#setPhone .setinfodivshow"); // 模擬點擊修改手機號按鈕 40 await page.type("#mphone", "你的現手機號"); // 模擬輸入現手機號 (替換成你的現手機號) 41 await page.type("#pincode", "驗證碼"); // 模擬輸入驗證碼(第一次自己手動在網站中修改時獲取的驗證碼,驗證碼24小時有效) 42 const newNumberList = numberList.results; // 電話號碼列表 43 const { ctx } = this; 44 const phoneLength = newNumberList.length; // 電話號碼列表總數 45 while (phoneLength > count) { 46 console.log( 47 "電話總數:", 48 phoneLength, 49 "當前數:", 50 count, 51 "當前號:", 52 newNumberList[count].phone11 53 ); 54 await page.evaluate( 55 () => (document.getElementById("oldMobilePhone").value = "") // 清空原來的老號碼輸入框 56 ); 57 await page.type("#oldMobilePhone", newNumberList[count].phone11); // 重新輸入原手機號 58 // 提交 59 await Promise.all([ 60 page.click("#newbuttonmp"), 61 page.waitForNavigation(), 62 ]); 63 try { 64 // 獲取提示信息 65 const tipesText = await page.$eval( 66 ".validate-tips span", 67 (el) => el.innerText 68 ); 69 // 提交過后如果獲取到'手機號碼有誤'的提示信息,則計數器加一,繼續循環操作 70 if (tipesText === "原手機號碼有誤,請填寫正確的手機號") { 71 count += 1; 72 } 73 } catch (error) { 74 // 若獲取'原手機號碼有誤'的提示信息失敗,則捕獲到異常,說明匹配手機號成功 75 console.log("號碼匹配成功", newNumberList[count].phone11); 76 ctx.body = { 77 msg: "號碼匹配成功", 78 data: { 79 phone: newNumberList[count].phone11, 80 count: count, 81 }, 82 }; 83 return; 84 } 85 } 86 // 走到這里說明循環完了整個手機號列表,未匹配到對應的手機號 87 console.log("未匹配到手機號"); 88 ctx.body = { 89 msg: '"未匹配到手機號"', 90 data: { 91 length: newNumberList.length, 92 count: count, 93 }, 94 }; 95 } 96 } 97 98 module.exports = HomeController;
npm run dev運行項目啟動服務, 最后通過瀏覽器直接訪問http://127.0.0.1:7001(瀏覽器直接訪問時注意訪問過后看到后端有輸出就關閉掉,避免刷新頁面重復調用接口)
或者 用postman調用該接口,后端控制台可以看到在循環的提交測試:
最后跑了幾千條過后總算匹配對了我的老號碼,改綁成功了,哈哈:
對你有用或者感興趣的同學可以去看看,源碼倉庫地址:node.js改綁學信網手機號 ;如果對你有用的話記得給個star喔 !