Ubuntu下利用python实现自动打卡系统全过程
系统版本:Debian or Ubuntu
Python版本:3.xx以上
实现功能:1.能自动打卡并定时启动;2.截图保存打卡信息;3.发送邮件通知。
因为学校规定要求每天打卡,博主人懒又经常忘记打卡导致辅导员经常在大群里@我,属实尴尬。故干脆把吃灰的香橙派H616(无桌面版Ubuntu sever镜像)拿来挂打卡脚本。欸,舒服了。
1.安装python环境和用到的包
先安装 pip3工具 和相应的库
sudo apt install -y python3-pip python3-dev python3-setuptools libxml2-dev libxslt1-dev
因为网页上有中文所以需要安装中文字库,否则截图里会有乱码
sudo apt-get -y install fontconfig xfonts-utils
再安装python包
pip3 install wheel selenium pillow yagmail
这里是selenium和chrom_driver安装教程链接
新建chrominum文件,把下载下来的.deb文件都复制进去
cd ./chromium/
sudo dpkg -i *.deb
我在安装时出现包依赖错误:dpkg: error processing package ***(–install): dependency problems - leaving unconfigured
解决方案:sudo apt install -f
在安装pillow时会出现很多错误比如:The headers or library files could not be found for jpeg
解决方案: sudo apt-get install libjpeg-dev zlib1g-dev
pillow库的依赖很多还会有其他错误,奇奇怪怪的错误挨着百度就好了
2.码代码
整体流程框图
1.打卡模块
挑重点讲讲将这个验证码识别吧。我尝试过本地的tessocr-OCR文本识别率感人,验证码纯随便。想用Opencv又感觉太浪费了。所以就去百度申请了一个ocr的api,免费的,有几千调用次数。欸,白嫖就很舒服了。还有个小难点,这个验证码无法直接扒取,只能通过截图保存。因此,需要在整张页面中做一个自适定位并截取的工作。
附代码:
def Analyze_code(screen_shot,chrom_driver):
element = chrom_driver.find_element_by_xpath('//*[@id="app"]/div/div[3]/div[7]/div/img') #找验证码图片
#print(element.location) # 打印元素坐标
#print(element.size) # 打印元素大小
left = element.location['x']
top = element.location['y']/2 #这里要除以2,不知道为啥得到的y轴像素有问题
right = element.location['x'] + element.size['width']
bottom = element.location['y'] + element.size['height']
image = Image.open(screen_shot)
cropped = image.crop((left, top, right, bottom))
cropped.save('pil_cut_thor.png')
#调用tesserocr的image_to_text()方法,传入image对象完成识别
# cropped = image.crop(( 720-200, 2400-300,720,2400-180)) # (left, upper, right, lower)
# cropped.save("pil_cut_thor.png")
time.sleep(0.2)
'''
#本地识别
#新建Image对象
#调用tesserocr的image_to_text()方法,传入image对象完成识别
check = Image.open("pil_cut_thor.png")
time.sleep(0.2)
result = tesserocr.image_to_text(check)
print(result)
return result
'''
#在线识别
# 二进制方式打开图片文件
f = open("pil_cut_thor.png", 'rb')
img = base64.b64encode(f.read())
params = {"image":img}
access_token = '自己申请’
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print (response.json())
response_json = json.dumps(response.json()) #解析json
raw_check_num = json.loads(response_json)['words_result'][0]['words']
check_num = raw_check_num.replace( " ","")
print("验证码为:"+check_num)
return check_num
2.邮件发送模块
去email网站申请一个邮箱,并开通SMTP服务
import yagmail # 邮件发送模块
import time
#通过邮件将新生成的文件发送到自己的邮箱
def send_email(user_name,email,staus):
yag = yagmail.SMTP(user='你的邮箱',password='密码',host='主域名)
t = time.localtime()
send_time=time.strftime("%Y-%m-%d %H:%M:%S",t)
contents = [user_name+'同学你好,你在'+send_time+'打卡'+staus[0]+'('+staus[1]+'),截图已经上传到附件,请查收']
contents = contents + [staus[2]]
yag.send(email, '请查看'+user_name+'的打卡结果', contents)
print('------邮件发送成功啦!')
3.定时启动
这里直接百度cron 或者 crontab,网上有更详细的教程,这里只做简单记录
这里是可供参考的教程
首先编辑定时任务列表
sudo crontab -e
第一次使用会让你选择编辑器,我这里选vim,大家随意。
在文件中添加
0 9 * * * /home/orangepi/auto_test/test.py >> /home/orangepi/auto_test/test.log 2>&1
每天上午9点执行我的test.py脚本,并打印日志文件
注意自己板子上的时区。而且crontab执行脚本不会进入脚本所在路径,所以有文件操作的地方需要注意路径问题,即相对路径会操作失败,需要转换成绝对路径。:
orangepi@orangepizero2: timedatectl set-timezone Asia/Shanghai
orangepi@orangepizero2: date -R
Wed, 12 May 2021 13:47:56 +0800
absolutepath=os.path.dirname(os.path.abspath(__file__))+'/'
效果图展示
运行的界面
保存的截图
收到的邮件