采用pyautogui
和pyperclip
获取163邮箱邮件内容
前言
23年暑假找了个公司赚点生活费。其中我的任务是copy163邮箱的邮件,然后将邮件的内容复制到公司的销售系统(53快服)。下图为客服系统里面我需要录入的信息,这些信息是根据邮件内容来填写的。
任务可以分以下几步:
- 1,复制邮件内容
- 2,根据邮件内容,分割并提取信息
- 3,将信息填到客服系统
如果不使用脚本,原始人纯手戳,每天一两来条邮件,个人感觉还是可以接受的,那么一天两千多条,就是不吃饭也干不完。
下面这个图是每天要录入系统的邮件数据量,可以看到一天邮件数量峰值达到2600条左右,可以说这个量以及不再是纯手戳能够承受得了的了
当我接到这个任务的时候离数据爆发增长还有不到一周时间。为此,在前两天干完活的闲余时间琢磨如何使用python帮我完成这个任务。
解决办法
经过我大量查找网上的相关资料,总结为以下几个方法
-
方法一、通过Urllib实现
这种方法主要是应用requests请求的方法,获取邮件需要找到对应的url链接。步骤如下:- 1. 模拟登录163邮箱,并获取收件箱邮件的url; - 2. 获取cookie信息 - 3. 提取邮件对应的sid数据 - 4. 利用sid和cookie重新请求,获得响应 - 5. 提取收件箱列表信息
-
方法二、使用第三方的邮件协议
这种方法需要邮箱打开第三方的邮件协议。有对应的第三方库专门处理邮件。由于我当时的邮箱没有权限开打开第三方邮件协议,因此就没考虑这种方法。 -
方法三、使用selenium模拟登录邮箱,获取网页信息,然后提取
selenium的用法很接近于人的操作习惯,实现的过程主要分为两步:
- 1.使用selenium模拟登录邮箱; - 2.使用beautifulsoup处理网页,提取未读邮件的信息。
-
方法四、模拟点击,模拟复制邮件,然后提取信息
这个是类似selenium的思路想到的。大量的邮件信息提取,我们可以人为打开浏览器,进入163收件箱邮件列表页,然后使用pyautogui
和pyperclip
模拟键鼠操作,循环复制、粘贴、保存每一封邮件。
传送门
方法一的实现可以参考我的这篇文章:使用selenium和requests的方法获取163邮箱的所有邮件
方法三的实现可以参考我的这篇文章:采用selenium和beautifulsoup获取163邮箱邮件内容
刚开始接触这个任务时,没有考虑太多,脑子直接想到的是方法四,该方法难度低,好实现,不用处理登录邮箱的问题。缺点一方面是该方法需要一个较快的网络环境,因为获取邮件的本质还是等待浏览器加载全部信息。另一方面,该方法获取邮件的速度并不快,太快会导致邮件在浏览器加载卡顿。
方法四的实现:
方法四是很容易想到的,程序执行过程和人的操作过程一模一样,我们人为登录163邮箱,设置邮箱界面
一页显示15个邮件差不多是电脑屏幕最大容纳的了,更大的需要滚轮滑动。使用程序复制每一封邮件的发件人,点击进入邮件内部,复制邮件内容,提取邮件信息,然后重复这个过程。
要使用到的两个第三方库是pyperclip
和
pyautogui
-
pyautogui
:-
pyautogui
是一个用于自动化图形界面操作的库。 -
它可以模拟鼠标移动、点击、键盘输入等操作。
-
pyautogui
适用于Windows、macOS和Linux等多个平台。 -
示例用法:
import pyautogui # 获取屏幕尺寸 screen_width, screen_height = pyautogui.size() # 移动鼠标到指定位置 pyautogui.moveTo(100, 100, duration=1) # 模拟鼠标点击 pyautogui.click(100, 100) # 模拟键盘输入 pyautogui.typewrite("Hello, world!") # 执行 Ctrl+A 操作 pyautogui.hotkey( 'ctrl' , 'a' )
-
-
pyperclip
:-
pyperclip
是一个用于访问剪贴板的库。 -
它提供了简单的方法来复制和粘贴文本。
-
pyperclip
支持Windows、macOS和Linux等多个平台。 -
示例用法:
import pyperclip # 复制文本到剪贴板 pyperclip.copy("Hello, world!") # 从剪贴板粘贴文本 text = pyperclip.paste() print(text)
-
提取邮件的代码如下:
import pyautogui
import pyperclip
m=0
numble=4#numble为邮件数量
def getStr():
for i in range(numble):
#获取发件人信息
pyautogui.moveTo(247,330+(i+m)*44.2,duration=0.2)#移动鼠标到发件人的坐标1,停顿0.2s
pyautogui.dragTo(438,330+(i+m)*44.2,duration=0.25,button='left')#鼠标左键长按拖动
pyautogui.hotkey( 'ctrl' , 'c' )#复制发件人信息
taxt_flag=pyperclip.paste()#发件人的信息保存在taxt_flag
#点击进入邮件,复制邮件内容
pyautogui.click(560,330+(i+m)*44.2,button='left') #鼠标移动到坐标2,鼠标左键点击
pyautogui.moveTo(1650,430,duration=0.35)
pyautogui.click()
#鼠标左键点击空白区域
pyautogui.hotkey( 'ctrl' , 'a' )
pyautogui.hotkey( 'ctrl' , 'c' )
taxt_str=pyperclip.paste()
#先全选,再复制并将复制的内容保存到taxt_str
#处理邮件内容
'''
your_code
'''
这个方法的实现简单粗暴,最终我设置了从第几封邮件开始复制,复制多少封邮件。并且使用同样的方法可以直接将信息填到客服系统,这里就不多说了。
保存邮件信息的方式可以用列表类型保存,也可以保存在本地的txt文档。下面的代码将之前得到的发件人信息和邮件内容保存在列表in_list,in_list[i]对应一封邮件,可以用in_list[i][0]和in_list[i][1]去获取每封邮件的发件人信息和邮件内容。并且将这些信息保存在rb.txt本地文档中。
in_list=[]#声明一个列表
in_list.append([taxt_flag,taxt_str])#数据提取列表:发件人标签,备注全部信息
def dowload_print():
for i in range(len(in_list)):#存储在txt文本
with open('rb.txt', mode='a+', encoding='utf8') as f:
data = f.read()
f.write(in_list[i][0]+' '+in_list[i][1]+'\r\n')
print(in_list[i])#窗口显示信息
print("数量:",len(in_list))#显示邮件数量
后来采用selenium模拟登录163邮箱,并自动提取所有未读邮件的内容,详细过程在下一篇文章:采用selenium和beautifulsoup获取163邮箱邮件内容