学信网改绑手机号码,但是忘记了老号码怎么办?利用node.js + puppeteer 跑脚本实现改绑手机号
<p><span style="font-size: 16px">最近登录学信网发现自己学信网上绑定的手机号码不是目前自己使用的手机号码,于是想改绑手机号,但是发现不记得之前的手机号码了:</span><br><span style="font-size: 16px"><img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111112517506-594716467.jpg"></span></p><p><br><span style="font-size: 16px">于是百度各种方法都无济于事;也不想重新注册账号,最后看见一篇文章通过Python写脚本模拟提交这个号段的所有号码做验证,</span><br><span style="font-size: 16px">感觉挺靠谱,但是本人不会Python,也不想现学,不过我会node.js,我想通过 node.js + puppeteer 实现相同的功能,于是开干:</span></p>
<p><span style="font-size: 16px">第一步:登录“查号吧”查找出匹配老号码的所有号段:传送门</span></p>
<p><span style="font-size: 16px"><br><img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111113821895-1154385063.png"></span></p>
<p> </p>
<p> </p>
<p id="1636601901537"><span style="font-size: 16px"> 输入学信网提示的老号码的前三位与后两位,地区和城市我这里也不太记得了,但自己能肯定不是绵阳就是成都,因为自己只办过这两个城市的手机号;最后点击查询;</span></p>
<p> </p>
<p><span style="font-size: 16px"> <img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111114427453-1909592247.png"></span></p>
<p> </p>
<p> </p>
<p><span style="font-size: 16px"> 按F12后点查询,可以看到接口返回的数据,我这里看到我的老号码159开头01结尾的号码成都地区为16000条数据;然后点击Respone 复制所有数据(这里因为数据量比较大,我在谷歌浏览器中复制控制台会被强制关闭,最后在360浏览器中成功复制);复制出来后先在记事本中保存:<br><img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111114958720-1619334785.png"></span></p>
<p id="1636602598354"> </p>
<p id="1636602267153"><span style="font-size: 16px"> </span></p>
<p><span style="font-size: 16px">第二步: 开始搭建项目写脚本<br>我这里直接用的node的egg.js框架,然后安装puppeteer插件,直接贴代码:</span></p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> "use strict"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> const Controller = require("egg"<span style="color: rgba(0, 0, 0, 1)">).Controller;
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span> const puppeteer = require("puppeteer"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)"> 5</span> const numberList = require("../../const/index"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这里面是上面复制的所有电话号码</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">class HomeController extends Controller {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span> <span style="color: rgba(0, 0, 0, 1)"> async index() {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> const browser =<span style="color: rgba(0, 0, 0, 1)"> await puppeteer.launch({
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用无头模式,默认为有头(true为无界面模式)</span>
<span style="color: rgba(0, 128, 128, 1)">10</span> headless: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置打开页面在浏览器中的宽高</span>
<span style="color: rgba(0, 128, 128, 1)">12</span> <span style="color: rgba(0, 0, 0, 1)"> defaultViewport: {
</span><span style="color: rgba(0, 128, 128, 1)">13</span> width: 1200<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">14</span> height: 800<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置每个步骤放慢/毫秒</span>
<span style="color: rgba(0, 128, 128, 1)">17</span> slowMo: 0<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">18</span> }); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回浏览器实例</span>
<span style="color: rgba(0, 128, 128, 1)">19</span> const page = await browser.newPage(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 创建新页面,并返回页面对象</span>
<span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置客户端</span>
<span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)"> await page.setUserAgent(
</span><span style="color: rgba(0, 128, 128, 1)">22</span> "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"
<span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 进入指定页面(学信网)</span>
<span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)"> await page.goto(
</span><span style="color: rgba(0, 128, 128, 1)">26</span> "https://account.chsi.com.cn/passport/login?service=https%3A%2F%2Faccount.chsi.com.cn%2Faccount%2Fj_spring_cas_security_check"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">27</span> <span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">28</span> waitUntil: ["domcontentloaded"<span style="color: rgba(0, 0, 0, 1)">],
</span><span style="color: rgba(0, 128, 128, 1)">29</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">30</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">31</span> await page.type("#username", "你的学信网账号"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟输入账号(替换成你的学信网账号)</span>
<span style="color: rgba(0, 128, 128, 1)">32</span> await page.type("#password", "你的学信网密码"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟输入密码(替换成你的学信网密码)</span>
<span style="color: rgba(0, 128, 128, 1)">33</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟点击登录</span>
<span style="color: rgba(0, 128, 128, 1)">34</span> <span style="color: rgba(0, 0, 0, 1)"> await Promise.all([
</span><span style="color: rgba(0, 128, 128, 1)">35</span> page.click("input"<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)"> page.waitForNavigation(),
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)"> ]);
</span><span style="color: rgba(0, 128, 128, 1)">38</span> let count = 0; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 计数,从电话号码列表中的第一个开始</span>
<span style="color: rgba(0, 128, 128, 1)">39</span> await page.click("#setPhone .setinfodivshow"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟点击修改手机号按钮</span>
<span style="color: rgba(0, 128, 128, 1)">40</span> await page.type("#mphone", "你的现手机号"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟输入现手机号 (替换成你的现手机号)</span>
<span style="color: rgba(0, 128, 128, 1)">41</span> await page.type("#pincode", "验证码"); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 模拟输入验证码(第一次自己手动在网站中修改时获取的验证码,验证码24小时有效)</span>
<span style="color: rgba(0, 128, 128, 1)">42</span> const newNumberList = numberList.results; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 电话号码列表</span>
<span style="color: rgba(0, 128, 128, 1)">43</span> const { ctx } = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">44</span> const phoneLength = newNumberList.length; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 电话号码列表总数</span>
<span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 255, 1)">while</span> (phoneLength ><span style="color: rgba(0, 0, 0, 1)"> count) {
</span><span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 0, 1)"> console.log(
</span><span style="color: rgba(0, 128, 128, 1)">47</span> "电话总数:"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">48</span> <span style="color: rgba(0, 0, 0, 1)"> phoneLength,
</span><span style="color: rgba(0, 128, 128, 1)">49</span> "当前数:"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 0, 1)"> count,
</span><span style="color: rgba(0, 128, 128, 1)">51</span> "当前号:"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 0, 1)"> newNumberList.phone11
</span><span style="color: rgba(0, 128, 128, 1)">53</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 0, 0, 1)"> await page.evaluate(
</span><span style="color: rgba(0, 128, 128, 1)">55</span> () => (document.getElementById("oldMobilePhone").value = "") <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 清空原来的老号码输入框</span>
<span style="color: rgba(0, 128, 128, 1)">56</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">57</span> await page.type("#oldMobilePhone", newNumberList.phone11); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 重新输入原手机号</span>
<span style="color: rgba(0, 128, 128, 1)">58</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 提交</span>
<span style="color: rgba(0, 128, 128, 1)">59</span> <span style="color: rgba(0, 0, 0, 1)"> await Promise.all([
</span><span style="color: rgba(0, 128, 128, 1)">60</span> page.click("#newbuttonmp"<span style="color: rgba(0, 0, 0, 1)">),
</span><span style="color: rgba(0, 128, 128, 1)">61</span> <span style="color: rgba(0, 0, 0, 1)"> page.waitForNavigation(),
</span><span style="color: rgba(0, 128, 128, 1)">62</span> <span style="color: rgba(0, 0, 0, 1)"> ]);
</span><span style="color: rgba(0, 128, 128, 1)">63</span> <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">64</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获取提示信息</span>
<span style="color: rgba(0, 128, 128, 1)">65</span> const tipesText =<span style="color: rgba(0, 0, 0, 1)"> await page.$eval(
</span><span style="color: rgba(0, 128, 128, 1)">66</span> ".validate-tipsspan"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">67</span> (el) =><span style="color: rgba(0, 0, 0, 1)"> el.innerText
</span><span style="color: rgba(0, 128, 128, 1)">68</span> <span style="color: rgba(0, 0, 0, 1)"> );
</span><span style="color: rgba(0, 128, 128, 1)">69</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 提交过后如果获取到'手机号码有误'的提示信息,则计数器加一,继续循环操作</span>
<span style="color: rgba(0, 128, 128, 1)">70</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (tipesText === "原手机号码有误,请填写正确的手机号"<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 128, 128, 1)">71</span> count += 1<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">72</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">73</span> } <span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (error) {
</span><span style="color: rgba(0, 128, 128, 1)">74</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 若获取'原手机号码有误'的提示信息失败,则捕获到异常,说明匹配手机号成功</span>
<span style="color: rgba(0, 128, 128, 1)">75</span> console.log("号码匹配成功"<span style="color: rgba(0, 0, 0, 1)">, newNumberList.phone11);
</span><span style="color: rgba(0, 128, 128, 1)">76</span> ctx.body =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">77</span> msg: "号码匹配成功"<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">78</span> <span style="color: rgba(0, 0, 0, 1)"> data: {
</span><span style="color: rgba(0, 128, 128, 1)">79</span> <span style="color: rgba(0, 0, 0, 1)"> phone: newNumberList.phone11,
</span><span style="color: rgba(0, 128, 128, 1)">80</span> <span style="color: rgba(0, 0, 0, 1)"> count: count,
</span><span style="color: rgba(0, 128, 128, 1)">81</span> <span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 128, 1)">82</span> <span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">83</span> <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 128, 1)">84</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">85</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">86</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 走到这里说明循环完了整个手机号列表,未匹配到对应的手机号</span>
<span style="color: rgba(0, 128, 128, 1)">87</span> console.log("未匹配到手机号"<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">88</span> ctx.body =<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)">89</span> msg: '"未匹配到手机号"'<span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(0, 128, 128, 1)">90</span> <span style="color: rgba(0, 0, 0, 1)"> data: {
</span><span style="color: rgba(0, 128, 128, 1)">91</span> <span style="color: rgba(0, 0, 0, 1)"> length: newNumberList.length,
</span><span style="color: rgba(0, 128, 128, 1)">92</span> <span style="color: rgba(0, 0, 0, 1)"> count: count,
</span><span style="color: rgba(0, 128, 128, 1)">93</span> <span style="color: rgba(0, 0, 0, 1)"> },
</span><span style="color: rgba(0, 128, 128, 1)">94</span> <span style="color: rgba(0, 0, 0, 1)"> };
</span><span style="color: rgba(0, 128, 128, 1)">95</span> <span style="color: rgba(0, 0, 0, 1)"> }
</span><span style="color: rgba(0, 128, 128, 1)">96</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">97</span>
<span style="color: rgba(0, 128, 128, 1)">98</span> module.exports = HomeController;</pre>
</div>
<p> </p>
<p> </p>
<p><span style="font-size: 16px"> npm run dev运行项目启动服务, 最后通过浏览器直接访问http://127.0.0.1:7001(浏览器直接访问时注意访问过后看到后端有输出就关闭掉,避免刷新页面重复调用接口)</span></p>
<p><span style="font-size: 16px">或者 用postman调用该接口,后端控制台可以看到在循环的提交测试:<br><img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111133733430-86529828.png"></span></p>
<p> </p>
<p> </p>
<p> 最后跑了几千条过后总算匹配对了我的老号码,改绑成功了,哈哈:</p>
<p><span style="font-size: 16px"> <img src="https://img2020.cnblogs.com/blog/1350339/202111/1350339-20211111134204377-1100128041.png"></span></p>
<p id="1636609324039"> 对你有用或者感兴趣的同学可以去看看,源码仓库地址:node.js改绑学信网手机号 ;如果对你有用的话记得给个star喔 ! </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/maxiansheng/p/15539726.html
頁:
[1]