我司零碎报错或者重要监控数据会发邮件到集体邮箱,这就导致邮箱一段时间就好几百页了。小姐姐说,辣条君和某昊然谁先帮她删完邮件,就和谁去看电影。于是乎,打算写个小脚本,先拿本人的账号试验一下吧~

Tip:本文仅供学习与交换,切勿用于非法用处!!!

1.需要剖析

这次,咱们须要删除的QQ邮箱内的局部邮件。

只须要将我司日志那些邮件,全副勾选,而后点击最下面的彻底删除就好了嘛。so easy。首先咱们能够抓包,找接口。因为波及登录,我打算用笨办法(还不是菜),让页面本人跑。用到了selenium。用这个库,你首先须要将你浏览器对应的驱动放到环境变量中。而后模仿认为操作,一步一步写代码就好了。

2.撸起袖子写代码

首先,咱们须要登录,咱们应用账号和明码登录(这样就晓得小姐姐qq明码了)。关上qq邮箱,qq举荐的是快捷登录,咱们须要模仿点击转换按钮,抉择账号密码登录形式。

from selenium import webdriverdriver = 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 = 1def 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 webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport timedriver = 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 + 1if __name__ == '__main__':    login('your qq','your password')    for page in range(1, 126):        delete('我司日志')

完结了,好了,当初要去帮小姐姐删邮件去了。右手拍座椅,转180度,“I want you”。咦,他们人呢???

4.代码优化

既然他们走了,那我还是默默留下优化下代码吧。

'''QQ 邮箱删除垃圾邮件'''from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport timedriver = 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('我司日志')