共计 6901 个字符,预计需要花费 18 分钟才能阅读完成。
我司零碎报错或者重要监控数据会发邮件到集体邮箱,这就导致邮箱一段时间就好几百页了。小姐姐说,辣条君和某昊然谁先帮她删完邮件,就和谁去看电影。于是乎,打算写个小脚本,先拿本人的账号试验一下吧~
Tip: 本文仅供学习与交换,切勿用于非法用处!!!
1. 需要剖析
这次,咱们须要删除的 QQ 邮箱内的局部邮件。
只须要将 我司日志
那些邮件,全副勾选,而后点击最下面的 彻底删除
就好了嘛。so easy。首先咱们能够抓包,找接口。因为波及登录,我打算用笨办法(还不是菜),让页面本人跑。用到了selenium
。用这个库,你首先须要将你浏览器对应的驱动放到环境变量中。而后模仿认为操作,一步一步写代码就好了。
2. 撸起袖子写代码
首先,咱们须要登录,咱们应用账号和明码登录(这样就晓得小姐姐 qq 明码了)。关上 qq 邮箱,qq 举荐的是快捷登录,咱们须要模仿点击转换按钮,抉择账号密码登录形式。
from selenium import webdriver
driver = webdriver.Chrome()
# 获取页面
driver.get("https://mail.qq.com/")
def login(qq, password):
driver.switch_to.frame("login_frame")
# 可能会呈现 QQ 快捷登录页面
if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
我应用的是谷歌浏览器,所以应用 Chrome()
办法,利用 xpath
选取控件,xpath
门路能够间接从浏览器处 copy。
登录之后,点击右边 收件箱
就能够进入到邮件列表页面。这里须要留神一下,因为这个页面外部蕴含 frame
,所以须要进入到某标签的frame
才能够顺利获取某页面。一页有 25 个邮件,咱们 for 循环留神判断如果是 我司日志
,就能够在多选框把它勾上了。而后点击最下面的 彻底删除
,点击确定,之后会弹出来一个 删除胜利
的 Dialog,再点击勾销就能够了。
# 回到主页面
driver.switch_to.default_content()
# 点击右边 收件箱 按钮
driver.find_element_by_xpath('//*[@id="folder_1"]').click()
# 进入列表的 mainFrame
driver.switch_to.frame("mainFrame")
# for 循环每一页的 25 个列表,判断打勾
for i in range(1,26):
try:
span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
if driver.find_element_by_xpath(span).text == del_text:
driver.find_element_by_xpath(input).click()
except Exception as e:
print(e.args)
driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
# 切换到弹出框
driver.switch_to.parent_frame()
# 点击确定删除
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
# 显示期待,期待勾销按钮呈现
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
del_text
就是 我司日志
四个字。首先利用 switch_to.default_content()
进入主页面,而后点击 收件箱
按钮,在跳转到邮件列表所在 framemainFrame
。接着 for 循环,看看那个适宜打上勾。接着点击确定和删除胜利提醒按钮即可,这一过程须要切换 frame。如果一切顺利的话,页面会主动刷新,而后咱们进行第二次筛选、删除即可。
这里有个问题,如果当前页 (或者说第一页),没有我司日志,你不停的 彻底删除
,当前页的数据始终不变,那岂不是前面的数据始终得不到删除啊。所以咱们须要记录下以后须要跳转的页数,而后逐页跳转到可能领有 我司日志
的页码上就好了。
# 须要跳转的页
need_turn_page = 1
def delete(del_text):
global need_turn_page
# 从第一页开始
current_page = 1
# 记录一下,本页须要删除的有邮件
count = 0
# 好像有一些代码
# 跳转到当前页
if need_turn_page > current_page:
for page in range(1, need_turn_page):
print("我跳转了")
current_page = current_page + 1
driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
# for 循环每一页的 25 个列表,判断打勾
for i in range(1,26):
try:
# 好像有一些代码
if driver.find_element_by_xpath(span).text == del_text:
count = count+1
driver.find_element_by_xpath(input).click()
except Exception as e:
print(e.args)
if count > 0:
# 好像有一些代码
# 否则翻页
else:
need_turn_page = need_turn_page + 1
3. 残缺代码
'''QQ 邮箱删除垃圾邮件'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
# 须要跳转的页
need_turn_page = 1
# 获取页面
driver.get("https://mail.qq.com/")
# 登录
def login(qq, password):
driver.switch_to.frame("login_frame")
# 可能会呈现 QQ 快捷登录页面
if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
def delete(del_text):
global need_turn_page
# 从第一页开始
current_page = 1
# 避免太快,腾讯找我麻烦
time.sleep(1)
# 记录一下,本页须要删除的有邮件
count = 0
# 回到主页面
driver.switch_to.default_content()
# 点击右边 收件箱 按钮
driver.find_element_by_xpath('//*[@id="folder_1"]').click()
# 进入列表的 mainFrame
driver.switch_to.frame("mainFrame")
# 跳转到当前页
if need_turn_page > current_page:
for page in range(1, need_turn_page):
print("我跳转了")
current_page = current_page + 1
driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
# for 循环每一页的 25 个列表,判断打勾
for i in range(1,26):
try:
span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
if driver.find_element_by_xpath(span).text == del_text:
count = count+1
driver.find_element_by_xpath(input).click()
except Exception as e:
print(e.args)
if count > 0:
driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
# 切换到弹出框
driver.switch_to.parent_frame()
# 点击确定删除
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
# 显示期待,期待勾销按钮呈现
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
# 否则翻页
else:
need_turn_page = need_turn_page + 1
if __name__ == '__main__':
login('your qq','your password')
for page in range(1, 126):
delete('我司日志')
完结了,好了,当初要去帮小姐姐删邮件去了。右手拍座椅,转 180 度,“I want you”。咦,他们人呢???
4. 代码优化
既然他们走了,那我还是默默留下优化下代码吧。
'''QQ 邮箱删除垃圾邮件'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome()
# 获取页面
driver.get("https://mail.qq.com/")
# 登录
def login(qq, password):
driver.switch_to.frame("login_frame")
# 可能会呈现 QQ 快捷登录页面
if driver.find_element_by_xpath('//*[@id="switcher_plogin"]'):
driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq)
driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
def delete(del_text):
# 避免太快,腾讯找我麻烦
time.sleep(3)
# 记录一下,本页须要删除的有邮件
count = 0
# for 循环每一页的 25 个列表,判断打勾
for i in range(1,26):
try:
span = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[3]/table/tbody/tr/td[1]/nobr/span'
input = f'//*[@id="div_showbefore"]/table[{i}]/tbody/tr/td[1]/input'
if driver.find_element_by_xpath(span).text == del_text:
count = count+1
driver.find_element_by_xpath(input).click()
except Exception as e:
print(e.args)
print("count:"+str(count))
if count > 0:
driver.find_element_by_xpath('//*[@id="quick_completelydel"]').click()
# 切换到弹出框
driver.switch_to.parent_frame()
# 点击确定删除
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_confirm"]').click()
# 显示期待,期待勾销按钮呈现
try:
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'QMconfirm_QMDialog_cancel')))
driver.find_element_by_xpath('//*[@id="QMconfirm_QMDialog_cancel"]').click()
except Exception as e:
pass
# 否则翻页
else:
# 回到主页面
driver.switch_to.default_content()
# 进入列表的 mainFrame
driver.switch_to.frame("mainFrame")
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'nextpage1')))
driver.find_element_by_xpath('//*[@id="nextpage1"]').click()
if __name__ == '__main__':
login('your qq','your password')
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, 'folder_1')))
# 回到主页面
driver.switch_to.default_content()
# 点击右边 收件箱 按钮
driver.find_element_by_xpath('//*[@id="folder_1"]').click()
# 进入列表的 mainFrame
driver.switch_to.frame("mainFrame")
for page in range(1, 126):
delete('我司日志')