每日自动健康打卡(Python+腾讯云服务器)

1.配置需要

python3.7,Chrome或者Edeg浏览器,Chrome驱动或者Edge驱动

#需要配置selenium库,baidu-aip库,pillOW库,在终端执行以下命令
pip install selenium
pip install pillow
pip install baidu-aip

2.实现功能

1.模拟登录说唱大学微服务,需要百度OCR智能识别API接口识别验证码(免费获取)

2.虚拟位置信息填写,注释:其余信息保留上一天信息

3.反馈打卡信息到QQ邮箱,注释:需要自行配置POP3/ SMTP服务

4.挂到腾讯云服务上,每天定时自动打卡

3.参考链接

百度OCR智能识别的API调用链接

QQ邮箱配置链接

腾讯云服务器上运行(免费1个月)选择轻量应用服务器,我选的linux系统,这里的实例也是linux

4.linux服务器配置

参考腾讯文档,远程登录linux实例

1.以root登录

2.下载Python3.7,升级pip,yum,更换国内源

3.安装库,执行以下命令

pip3 install selenium
pip3 install pillow
pip3 install baidu-aip

4.在linux上安装谷歌浏览器和驱动

在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo

cd /etc/yum.repos.d/
vim google-chrome.repo

vim命名编辑google-chrome.repo文件,输入如下内容:

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

具体操作:按i插入,按Esc,然后Shift+;,输入qw,然后按Enter退出

安装浏览器,依次输入以下命令

yum -y install google-chrome-stable --nogpgcheck

# 检查版本信息
google-chrome --version
# 找到google_chrome路径:我对应的路径是/usr/bin/google-chrome,输入路径创建软连接
which google-chrome
# 创建软连接
ln -s /usr/bin/google-chrome /bin/chrome # 安装驱动
wget https://npm.taobao.org/mirrors/chromedriver/88.0.4324.96/chromedriver_linux64.zip
# 解压
yum -y install zip
unzip chromedriver_linux64.zip # 转移chromedriver到/user/bin目录下
sudo mv chromedriver /usr/bin # 解决root运行chrome问题
vim /opt/google/chrome/google-chrome
# 将最后一行改为如下:
exec -a "$0" "$HERE/chrome" "$@" --no-sandbox $HOME

将Python自动运行程序写到linux里:

vim automatic.py
# 然后把程序复制进去

测试运行:

python3 automatic.py

利用crontab定时运行python脚本:(输入如下命令)

crontab -e

# 从左到右依次表示分、时、日、月、周,设置为每天0:01自动打卡
1 0 * * * /usr/bin/python3 /root/automatic.py # 启动服务
service crond restart

5.代码部分

有详细解释

import sys
import time
from aip import AipOcr
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from PIL import Image
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr class LogIn:
def __init__(self, user, passwd, path, lat=30.630869, long=104.083748):
self.target = 'https://wfw.scu.edu.cn/ncov/wap/default/index' # 说唱大学微服务地址
self.username = str(user) # 用户名
self.password = str(passwd) # 密码
self.lat = lat # 纬度
self.long = long # 经度
self.path = path def main(self):
attempt = 0
print('\n准备')
chrome_options = webdriver.ChromeOptions()
# 设置无界面显示参数,因为要放在linux服务器上运行,无法显示界面,调试的时候需要把下面五行注释掉,显示chrome界面
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('window-size=1920x1080')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--hide-scrollbars')
chrome_options.add_argument('--headless') s = Service(self.path)
browser = webdriver.Chrome(service=s, options=chrome_options)# 加载 chromedriver,用edge的就去下载edgedriver
print('开始')
while True:
browser.delete_all_cookies() # 清空cookie
browser.get(self.target)
try: # 切换为账号密码登录
browser.switch_to.frame('loginIframe') # 切换frame
switch_element = WebDriverWait(browser, 10).until(
EC.element_to_be_clickable((By.XPATH, '/html/body/div/div/div[2]/div[2]/div[1]/div/div[3]'))
) # 找到对应元素位置
switch_element.click() # 点击切换
except Exception as error:
print('network wrong...\n', error) # 输入账号和密码
input_user = browser.find_element(by=By.XPATH, value='/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[1]/div[2]/div/input')
input_user.send_keys(self.username)
input_pwd = browser.find_element(by=By.XPATH, value='/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[2]/div[2]/div/input')
input_pwd.send_keys(self.password)
time.sleep(1) # 截图验证码并识别(这里用的百度云的免费OCR),需要自行注册,不会的可以参考这篇博客:https://www.cnblogs.com/xiaowenshu/p/11792012.html ver_btn = browser.find_element(by=By.CLASS_NAME, value='van-field__button')
ver_btn.click()# 刷新验证码
# 获取图片元素的位置
loc = ver_btn.location
# 获取图片的宽高
size = ver_btn.size
# 获取验证码上下左右的位置
left = loc['x']
top = loc['y']
right = (loc['x'] + size['width'])
botom = (loc['y'] + size['height'])
val = (left, top, right, botom) print(loc)
print(size)
# 验证码截图保存到当前目录下ver.png
# 打开网页截图
browser.save_screenshot('full.png')
# 通过上下左右的值,去截取验证码
pic = Image.open('full.png')
ver_pic = pic.crop(val)
ver_pic.save('ver.png') verification = self.Vertification('ver.png')
print('verification code:' + verification) # 识别验证码完毕 input_ver = browser.find_element(by=By.XPATH, value='/html/body/div/div/div[2]/div[2]/div[2]/div[3]/div[3]/div[2]/div/input')
input_ver.send_keys(verification)
browser.find_element(by=By.XPATH, value='/html/body/div/div/div[2]/div[2]/div[2]/div[3]/button').click() # 点击登录
time.sleep(5) # 等待跳转
if browser.current_url == self.target:
break # 登录成功,退出循环
attempt += 1
if attempt == 5: # 有时候网页会卡,即使密码正确也登录不上去,每次循环尝试5次登录(一般5次内能登录上去)
print('请检查账号密码,或稍后再试!')
browser.quit()
sys.exit() # 获取地理位置并提交
browser.execute_cdp_cmd(
"Browser.grantPermissions", # 授权地理位置信息
{
"origin": "https://wfw.scu.edu.cn/",
"permissions": ["geolocation"]
},
)
browser.execute_cdp_cmd(
"Emulation.setGeolocationOverride", # 虚拟位置
{
"latitude": self.lat,
"longitude": self.long,
"accuracy": 50,
},
)
try: # 提交位置信息
area_element = WebDriverWait(browser, 10).until(
EC.element_to_be_clickable((By.NAME, 'area'))
)
area_element.click()
except Exception as error:
print('get location wrong...\n', error) time.sleep(2) # 等待位置信息 """
邮箱信息,没有单独写个函数,需要配置QQ邮箱,开启POP3/ SMTP服务,并获取授权码
因为是提醒自己打卡,所以自己是发件人,自己是收件人
填入授权码
"""
# 建立邮箱信息
my_sender = 'XXX@qq.com' # 发件人邮箱账号
my_pass = 'XXX' # 发件人邮箱密码(当时申请smtp给的口令)
my_user = 'XXX@qq.com' # 收件人邮箱账号 browser.find_element(by=By.XPATH, value='/html/body/div[1]/div/div/section/div[5]/div/a').click() # 提交信息
try:
ok_element = WebDriverWait(browser, 3).until(
EC.element_to_be_clickable((By.XPATH, '/html/body/div[4]/div/div[2]/div[2]')) # 提交按钮
)
ok_element.click()
print(self.username, 'success!') WebDriverWait(browser, 3).until(
EC.presence_of_element_located((By.XPATH, '/html/body/div[5]/div/div[1]')) # 成功对话框标题
)
title_success = browser.find_element(by=By.XPATH, value='/html/body/div[5]/div/div[1]').get_attribute("innerHTML")
print('From website:', title_success) msg = MIMEText('打卡成功', 'plain', 'utf-8')
msg['From'] = formataddr(["终极打卡人", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["打工人", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "打卡提示" # 邮件的主题,也可以说是标题 server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except:
info = browser.find_element(by=By.CLASS_NAME, value='wapat-title').get_attribute('innerHTML')
print('From website |', self.username, ':', info) msg = MIMEText('打卡失败,请手动打卡', 'plain', 'utf-8')
msg['From'] = formataddr(["终极打卡人", my_sender])
msg['To'] = formataddr(["打工人", my_user])
msg['Subject'] = "打卡提示" server = smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(my_sender, my_pass)
server.sendmail(my_sender, [my_user, ], msg.as_string())
server.quit()
browser.quit() """
函数声明:
调用百度OCR的API,需要输入以下API接口:
APP_ID = '***'
API_KEY = '***'
SECRET_KEY = '***'
传入截取图片url,传出识别结果字符串
"""
def Vertification(self, url): # 创建AipOcr
""" 你的 APPID AK SK """
APP_ID = 'XXX'
API_KEY = 'XXX'
SECRET_KEY = 'XXX' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 文字识别高精度版本 """ 读取图片 """
def get_file_content(url):
with open(url, 'rb') as fp:
return fp.read() image = get_file_content('ver.png') """ 调用通用文字识别(含位置高精度版) """
result = client.accurate(image)
print(str(result))
res = result['words_result'][0]['words']
return str(res) # """ 如果有可选参数 """
# options = {}
# options["recognize_granularity"] = "big"
# options["detect_direction"] = "true"
# options["vertexes_location"] = "true"
# options["probability"] = "true"
#
# """ 带参数调用通用文字识别(含位置高精度版) """
# client.accurate(image, options) if __name__ == '__main__': """
用户输入区:
学号用户名
密码(一般为身份证后六位)
定位地点的经纬度
"""
username = 'XXX' # 用户名(学号)
password = 'XXX' # 密码
latitude = 30.630869 # 虚拟位置纬度
longitude = 104.083748 # 经度 path = '.\chromedriver\chromedriver.exe' #chromedriver路径
# path = '/usr/bin/chromedriver' # linux服务器上的chromedriver路径
t = LogIn(user=username, passwd=password, lat=latitude, long=longitude, path=path)
t.main()

运行结果图:

每日自动健康打卡(Python+腾讯云服务器)的更多相关文章

  1. 腾讯云服务器手动和自动安装WordPress网站程序

    如果我们需要建站的话,对于基础个人网站.博客建站选择基础的1Mbps带宽配置的1GB内存的腾讯云服务器还是够用的,且如果我们需要用来建网站的话可以手工添加程序,以及有些面板,比如宝塔面板是自带CMS程 ...

  2. 部署Flask项目到腾讯云服务器CentOS7

    部署Flask项目到腾讯云服务器CentOS7 安装git yum install git 安装依赖包 支持SSL传输协议 解压功能 C语言解析XML文档的 安装gdbm数据库 实现自动补全功能 sq ...

  3. 利用xhsell登录到远程腾讯云服务器

    xshell连接管理腾讯云服务器图文教程 打开xshell点击文件新建会话框 linux服务器ssh管理软件XSHELL下载及安装图文教程 输入公网IP地址确认下一步 选中服务器连接 一次性接受,不储 ...

  4. 腾讯云服务器部署 django项目整个流程

    CentOS7下部署Django项目详细操作步骤 前记:购买腾讯云服务器,配置自选,当然新用户免费体验半个月,我选择的系统是centos7系统版本, 接下来我们来看整个配置项目流程. 部署是基于:ce ...

  5. 本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效)

    本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效) 随着业务量的增加,本地的ES集群服务器性能和磁盘空间有点不够使用,项目组考虑使用腾讯云服务器,以下是我测试的使用_reindex ...

  6. centos7+腾讯云服务器搭建wordpress

    title: centos7+腾讯云服务器搭建wordpress date: 2020-03-04 categories: web tags: [wordpress] 分两部分:1.搭建LEMP环境 ...

  7. 腾讯云服务器哪个地区节点好?来ping一下速度就知道了

    腾讯云服务器怎么样?速度快吗?相信很多网友在购买云服务器之前都有此疑惑. 本人找了很久也没找到各区域节点的测试速度的域名和IP.即使有也不能批量查看对比哪个区域的速度. 网上都说这个区域节点速度快,那 ...

  8. 腾讯云服务器SMTP ERROR: Failed to connect to server

    一般邮件发送失败是 1.配置的问题. 2.扩展问题socket/ssl 百度搜出来一般都是以上的解决办法, 但是我这次遇到的不是. 本地可以放到腾讯云服务器就不行了,扩展也都开了. 后来发现是安全组端 ...

  9. 腾讯云服务器、nginx部署loopback

    最近在研究学习nginx,买了腾讯云服务器.在阿里上申请了域名,部署项目遇到很多问题记录一下,以备后用: 1.在腾讯服务器买好,阿里域名申请好后(也可以在腾讯上申请域名),需要添加安全组,创建不同的规 ...

随机推荐

  1. Noip模拟33垫底反思 2021.8.8

    T1 Hunter 考场上没写$%p$挂了25分.也是很牛皮,以后打完过了样例一定要检查 因为样例太小了......很容易忘记%%%% 正解随便手模就出来了. 1 #include<bits/s ...

  2. 2021.8.17考试总结[NOIP42]

    $\huge{取模不能比大小!}$ $\huge{取模不能比大小!}$ $\huge{取模不能比大小!}$ 有了打地鼠的前车之鉴,我深信树规板子是可以出现在联赛题里的. 所以T1十分钟码完直接溜了,后 ...

  3. 8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算

    8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算 xiang2012 Post at 2012/8/7 10:37:33 8M的摄像头,30f ...

  4. Mysql的入门和连接问题

    Mysql的连接问题 最近学完了mysql的基础语法,基本上是掌握了mysql的简单运用. 1.入门mysql 我是通过看<漫画sql>入门的,这个视频案例很到位,跟着2倍速学前9章就可以 ...

  5. Github点赞超多的Spring Boot学习教程+实战项目推荐!

    Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!   很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...

  6. 手写vue-router & 什么是Vue插件

    博文分享 这篇文章你可以学习到: 实现一个自己的vue-router 了解什么是Vue的插件 学习b站大佬后做的笔记整理和源码实现 1.1.3一步一步带你弄懂vue-router核心原理及实现哔哩哔哩 ...

  7. opencv学习(一)——图像入门

    图像入门 一.读取图像 在opencv中使用cv.imread(filename, flags)函数读取图像.filename参数表示读取图像的路径.读取图像的路径应完整给出,且不能含有中文,否则在调 ...

  8. C语言的“隐式函数声明”违背了 “前置声明” 原则

    这个问题来源于小组交流群里的一个问题: 最终问题落脚在 : 一个函数在main中调用了,必须在main之前定义或者声明吗? 我在自己的Centos上做了实验,结果是函数不需要,但是结构体(变量也要)需 ...

  9. 2020 天翼杯 部分wp

    天翼杯 呜呜呜呜 是我太菜了 Web APItest 源码 const express = require("express"); const cors = require(&qu ...

  10. Windows漏洞:MS08-067远程代码执行漏洞复现及深度防御

    摘要:详细讲解MS08-067远程代码执行漏洞(CVE-2008-4250)及防御过程 本文分享自华为云社区<Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御>,作者 ...