基于puppeteer的163邮箱自动登陆和邮件发送

Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,用来模拟 Chrome 浏览器的运行。既然是模拟Chrome浏览器(FireFox浏览器也可以)运行, 那么就为自动化操作浏览器提供了无限可能。本文就介绍基于puppeteer实现的163,126邮箱自动登陆,cookie获取及自动发送功能。 Puppeteer的详细介绍和用法可以参见puppeteer的github主页https://github.com/puppeteer/puppeteer。本文重点介绍项目设计和实现,项目的具体代码位于https://github.com/tiantianjinbu/bulkMail

目录

1) 163/126邮箱首次登陆,获取cookie

2)    cookie获取和利用cookie登陆

3) 自动发送和发送结果查询

4) puppeteer并发

5) 多核并发


1) 163/126邮箱首次登陆,获取cookie

  163,126邮箱利用网易盾来进行安全验证,登陆时的网易盾主要是点选汉字验证码,如下图所示:

由于自己搭建识别系统挑战较大,采用超级鹰识别系统进行识别。超级鹰

http://www.chaojiying.com/ 提供restfulAPI进行各种验证码的识别,客户上传验证图片和正确的验证码类型,系统就会返回识别之后的文字,符号及其坐标(据说超级鹰很多识别是人工来做的,所以体验是凌晨的时候系统反应会比较慢^_^)。 网易盾的这种点选汉字验证码对应的类型为2003, 系统识别后返回三个汉字的坐标。

起初以为拿到三个汉字的坐标后,利用puppeteer的mouse.move/mouse.click 进行点选就轻松搞定, 可试后发现易盾做了比较强的机器人检测,像这种点选验证码,单纯的点击返回的三个坐标,有99%的概率会被识别为机器人拒掉。 怎么来突破这个检测呢?原理就是尽量来模拟人点选的鼠标轨迹,每次鼠标运行几个像素,并且添加上下左右的随机偏移和随机延迟,然后在到达点选目标后再进行一定程度的回走。 具体代码参见WebMail.js文件的

simMouseMovePosition, simMouseMove等相关函数。

  simMouseMovePosition(startP, endP) {
    let disX = endP.X - startP.X;
    let disY = endP.Y - startP.Y;
    let xStep = disX/5.0;
    let yStep = disY/5.0;
    let posList = [];

    for (let ii = 0; ii < 5; ii++) {
      let obj = {}
      obj.X = startP.X + xStep * ii + this.randomInt(4, 1)
      obj.Y = startP.Y + yStep * ii + this.randomInt(4, 1)
      posList.push(obj)
    }
    return posList;
  }

  async simMouseMove(mouse, startP, endP) {
    let posList = this.simMouseMovePosition(startP, endP)
    for (let ii = 0; ii < posList.length; ii++) {
      await mouse.move(posList[ii].X, posList[ii].Y)
      await this.sleep(this.randomInt(200, 50))
    }
  }

2)  cookie获取和利用cookie登陆

在登陆成功后,可以通过await page.cookies()获取cookie了,并且如果登陆的时候点选了十天内免登陆,可以利用cookie连续登陆十天。 但是事情好像没有那么简单,用获取到的cookie,依次调用await page.setCookie,起初可以登录,但是过几个小时候再次登陆却提示cookie失效了。 通过比较真实网页十天免登陆的交互流程和用puppeteer的交互流程,发现用puppeteer最终是走到了临时Cookie的流程。这个没办法只能研究登陆的js脚本,后来发现脚本中有个判断cm_last_info地方, 这个cookie不设置就OK了, 具体代码如下所示。

       for (let ii = 0; ii < cookie.cookie.length; ii++) {
          // 163 and 126 uses cm_last_info to check whether to login with loginjustnow
          //  or verifycookie in order to do a 10 days no login
          // here just don't use this info
          if (cookie.cookie[ii].name == "cm_last_info") {
            continue;
          }          
            await page.setCookie(cookie.cookie[ii])
        }

3) 自动发送和发送结果查询

自动发送主要是点击对应的按钮,使页面导航到对应的发送界面,然后操作收件人,主题,和正文填写正确的内容。正文的操作需要用document.createElement document.body.appendChild构造html元素,这样也方便排版。具体的可以参见WebMail.js的mainSendMailFrom163UsingPage和mainSendMailFrom126UsingPage。

每次发送完毕,可以导航到已发送查看发送结果,参见 WebMail.js的checkMailFrom163SendResult和checkMailFrom126SendResult。

4)puppeteer并发

由于登陆和发送邮件大部分是网络IO操作,可以同时并发多个session来提高吞吐量, puppeteer-cluster是一个优秀的puppeteer并发库,支持不同上下文的网页并发访问。

可参考https://github.com/thomasdondorf/puppeteer-cluster。 项目相关的代码位于BulkLogin.js和BulkWebMailMana.js。

 

5) 多核并发

利用puppeteer-cluster并发只是单核下的并发,要发挥CPU的多核优势,还需要采用nodejs的并发方案cluster, cluster采用主线程管理线程和从线程工作者线程方式,来把工作分配到不同的工作者线程来处理。项目相关的代码位于BulkLoginCluster.js和BulkWebCluster.js

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

zhangtianhai12

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值