0
点赞
收藏
分享

微信扫一扫

Python实现每日自动打卡并能够发送邮件超详细

_鱼与渔_ 2022-04-04 阅读 7
python

本文使用python的selenium模块实现一个自动打卡程序

文章目录

1、Selenium模块简介

这个模块允许我们使用py程序来操作Chrome、Firefox等主流浏览器,实现自动化测试。

我们要让电脑帮我们用浏览器做一件事情,就要告诉它先点哪里,输入什么内容,然后再点哪里。这个“点哪里”就是通过selenium模块的定位来实现的:

它提供了八种定位方法,感兴趣的朋友可以看一下。这里主要介绍程序中用到的三种:(具体使用方法在代码部分讲)

方法作用
find_element_by_id()通过元素的id定位
find_element_by_name()通过元素的name定位
find_element_by_xpath()通过元素的xpath定位

这个idnamexpath是什么呢?其实就是网页中某个内容的属性。

我们知道一个网页是由许多元素组成的,比如你正在浏览的这个博客,其中有博主我的头像、你正在看的文字、左下角的点赞按钮等等等等。程序员在写网页的时候,为了方便使用辨别这些元素,会给元素加上不同的idname,就像我们的名字一样。

nameid的区别在于,name就像我们的名字,而id像我们的身份证号。可能有重名的人,但没有同样的身份证号。(这么说并不严谨,但是姑且这么理解吧 其它的区别对于这个程序也不是很重要 )值得注意的是,并不是每一个元素都要有name或者id属性。所以我们还需要第三种方法xpath定位

比如你正在浏览的这个博客,使用Google或者其他浏览器按下F12,点击element查看源代码,有的标签是这样的:我们说的
在这里插入图片描述
可以看到上图的input标签既有id这个属性,又有name这个属性。

2、安装selenium以及浏览器驱动

2.1、安装selenium

由于国外的镜像源安装Python速度较慢,选择国内的镜像速度较快,
常用镜像源:

清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

安装的时候执行以下命令(以阿里云镜像为例)

pip install Selenium -i http://mirrors.aliyun.com/pypi/simple/

2.2、安装浏览器驱动

selenium本身不具有打开浏览器的能力,需要各个浏览器的驱动配合。接下来我们安装一个浏览器驱动:下载之前查清楚自己浏览器的版本!

这里以Mac端为例:
打开谷歌浏览器后,在屏幕的左上角处
在这里插入图片描述
点击此处打卡下拉框
在这里插入图片描述
打开后就可以看到浏览器的具体版本了
查看谷歌浏览器版本
Chrome浏览器版本对应
Chrome各种版本驱动下载
其他浏览器可以自行百度下载地址

下载完浏览器驱动,还需要配置一下环境变量让你的程序能找得到这个驱动:(环境变量里存的路径就是告诉电脑,在需要运行某个程序的时候可能可以去哪里找。系统在收到一个程序运行命令以后,会到这个环境变量表里一个个路径查看有没有你要的程序)

我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将你的驱动存放路径如“E:\ChromeDriver”目录添加到Path的值中。比如:Path字段;E:\ChromeDriver

配置完环境变量,在一会所使用的代码中就可以获取到浏览器驱动driver了:

 driver = webdriver.Chrome()

若没有配置环境变量,可以使用绝对路径的方式获取浏览器驱动driver:

driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")

3、模拟鼠标点击、填写信息

以下面这个网页为例,我需要填写学号、密码然后点击“登陆”按钮。那么首先,如何在使用程序来定位这几个需要填写/点击的位置?用上面介绍的方法!
在这里插入图片描述

模拟信息的填写,以填写学号为例
在这里插入图片描述
在此处鼠标右击,点击检查
在这里插入图片描述
在弹出的控制台中就可以找到该元素所拥有的属性
在这里插入图片描述
我们可以看到这个input输入框中有一个name属性,有一个id属性,那么我们就可以使用代码来进行填写信息:
1、使用name属性

driver.find_element_by_name('username').send_keys('你的学号')

2、使用id属性

driver.find_element_by_id('dl').send_keys('你的学号')

模拟按钮的点击,以登录按钮为例:
首先对要进行操作的按钮进行检查,定位到我们要操作的标签位置
在这里插入图片描述
在控制台中显示出以下信息
在这里插入图片描述
可以看到这个按钮有一个id属性,那么我们可以根据driver的相应方法来进行操作

driver.find_element_by_id('dl').click()

那么这时候问题来了,如果我们的标签元素中既没有id属性,也没有name属性呢,此时可以使用xpath来定位

4、XPath定位

在使用XPath之前,我们需要在浏览器中安装这个插件
XPath Helper
提取码:nhjk

下载完成后解压文件,可以看到里面有两个文件
在这里插入图片描述
我们打开Chrome浏览器,找到扩展程序
在这里插入图片描述
在右上角打开开发者模式
在这里插入图片描述
然后将crx文件直接拖入即可
在这里插入图片描述

安装完成后,在某个元素标签处右击打开扩展栏,找到复制完整XPath,Windows电脑为Copy Full XPath
在这里插入图片描述
找到登录按钮的xpath以后,我们将其存在一个变量中(因为直接使用会很长,当然你直接粘贴到相应位置也没啥问题),然后就可以使用代码模拟点击了

login = "/html/body/form/div/div/div[2]/a"
driver.find_element_by_xpath(submit).click()

一处细节,可能有的同学的网站是点击登录按钮后,等一会才能进入打卡页面,可以先让程序睡一会再继续执行

driver.find_element_by_xpath(submit).click()
time.sleep(2)

5、配置邮箱

如果不需要发送邮件的话就可以省略这个步骤,下面以QQ邮箱为例:
打开邮箱首页后点击左上角的设置按钮
在这里插入图片描述
点击账户模块
在这里插入图片描述
往下滑动找到此处
在这里插入图片描述
生成后大家记得先保存在一处!!!!一会代码中用得到

6、完整代码

# -*- coding: utf-8 -*-
import time
from selenium import webdriver
import smtplib
from email.mime.text import MIMEText

# 只需修改下面三项即可 学号 密码 打卡网址
username = "你的学号"
password = "你的密码"
url = "打卡网址"

# 下面是每次填报的时候几个需要填写的地方,F12找到这些位置的 full XPath
position = "/html/body/form/div/div/div[1]/div[8]/div[2]/div[1]/p/a"  # 获取位置按钮
submit = "/html/body/form/div/div/div[2]/a"  # 提交按钮
passwordXpath = "/html/body/div/div[3]/div[2]/div/div[2]/div/div[1]/form/div[3]/div/input[1]"

# 模拟登陆打卡
def do_login(driver):
    try:
        # 将窗口最大化
        driver.maximize_window()
        # 找到登录框 输入账号密码
        driver.find_element_by_name('username').send_keys(username)
        driver.find_element_by_xpath(passwordXpath).send_keys(password)
        driver.find_element_by_id('dl').click()  # 点击登录
        # 延时一秒
        time.sleep(1)

        # 获取位置
        driver.find_element_by_xpath(position).click()

        # 点击最后的提交按钮
        driver.find_element_by_xpath(submit).click()
        
    except Exception as e:
        print("出现错误了",e)

def send_email():
    # 设置服务器所需信息
    # qq邮箱服务器地址
    mail_host = 'smtp.qq.com'
    # qq用户名
    mail_user = '你的邮箱'
    # 密码(部分邮箱为授权码)
    mail_pass = '申请的授权码'
    # 邮件发送方邮箱地址
    sender = '发送者邮箱'
    # 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
    receivers = ['接受者邮箱']

    # 设置email信息
    # 邮件内容设置
    message = MIMEText('今日份打卡成功!!!', 'plain', 'utf-8')
    # 邮件主题
    message['Subject'] = '自动化打卡成功'
    # 发送方信息
    message['From'] = sender
    # 接受方信息
    message['To'] = receivers[0]

    # 登录并发送邮件
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host)
        # 连接到服务器
        smtpObj.connect(mail_host, 465)
        # 登录到服务器
        smtpObj.login(mail_user, mail_pass)
        # 发送
        smtpObj.sendmail(sender, receivers, message.as_string())
        # 退出
        smtpObj.quit()
        print('发送邮件成功')
    except smtplib.SMTPException as e:
        print('发送邮件失败', e)

if __name__ == '__main__':
    # 模拟浏览器打开网站
    driver = webdriver.Chrome()
    driver.get(url)
    # 登录并打卡
    do_login(driver)
    # 给邮箱发送邮件
    send_email()
    print("打卡结束")
    time.sleep(1)  # 终端给你时间确认已经打卡成功
    driver.quit()

写完程序就可以打成exe了,添加一下开机启动,或者不添加放桌面手动启动也很方便。

声明:本博客仅供学习交流使用,请勿将本博客所写内容用于违法行动。所造成的一切后果本博主并不承担

举报

相关推荐

0 条评论