每日自动健康打卡(Python+腾讯云服务器)
每日自动健康打卡(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.参考链接
腾讯云服务器上运行(免费1个月)选择轻量应用服务器,我选的linux系统,这里的实例也是linux
4.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+腾讯云服务器)的更多相关文章
- 腾讯云服务器手动和自动安装WordPress网站程序
如果我们需要建站的话,对于基础个人网站.博客建站选择基础的1Mbps带宽配置的1GB内存的腾讯云服务器还是够用的,且如果我们需要用来建网站的话可以手工添加程序,以及有些面板,比如宝塔面板是自带CMS程 ...
- 部署Flask项目到腾讯云服务器CentOS7
部署Flask项目到腾讯云服务器CentOS7 安装git yum install git 安装依赖包 支持SSL传输协议 解压功能 C语言解析XML文档的 安装gdbm数据库 实现自动补全功能 sq ...
- 利用xhsell登录到远程腾讯云服务器
xshell连接管理腾讯云服务器图文教程 打开xshell点击文件新建会话框 linux服务器ssh管理软件XSHELL下载及安装图文教程 输入公网IP地址确认下一步 选中服务器连接 一次性接受,不储 ...
- 腾讯云服务器部署 django项目整个流程
CentOS7下部署Django项目详细操作步骤 前记:购买腾讯云服务器,配置自选,当然新用户免费体验半个月,我选择的系统是centos7系统版本, 接下来我们来看整个配置项目流程. 部署是基于:ce ...
- 本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效)
本地ES集群数据通过_reindex方式迁移到腾讯云服务器(亲测有效) 随着业务量的增加,本地的ES集群服务器性能和磁盘空间有点不够使用,项目组考虑使用腾讯云服务器,以下是我测试的使用_reindex ...
- centos7+腾讯云服务器搭建wordpress
title: centos7+腾讯云服务器搭建wordpress date: 2020-03-04 categories: web tags: [wordpress] 分两部分:1.搭建LEMP环境 ...
- 腾讯云服务器哪个地区节点好?来ping一下速度就知道了
腾讯云服务器怎么样?速度快吗?相信很多网友在购买云服务器之前都有此疑惑. 本人找了很久也没找到各区域节点的测试速度的域名和IP.即使有也不能批量查看对比哪个区域的速度. 网上都说这个区域节点速度快,那 ...
- 腾讯云服务器SMTP ERROR: Failed to connect to server
一般邮件发送失败是 1.配置的问题. 2.扩展问题socket/ssl 百度搜出来一般都是以上的解决办法, 但是我这次遇到的不是. 本地可以放到腾讯云服务器就不行了,扩展也都开了. 后来发现是安全组端 ...
- 腾讯云服务器、nginx部署loopback
最近在研究学习nginx,买了腾讯云服务器.在阿里上申请了域名,部署项目遇到很多问题记录一下,以备后用: 1.在腾讯服务器买好,阿里域名申请好后(也可以在腾讯上申请域名),需要添加安全组,创建不同的规 ...
随机推荐
- Machine learning (7-Regularization)
1.The Problem of Over-fitting 2.Cost Function 3.Regularized Linear Regression 4.Regularized Logistic ...
- Spring Security:Authorization 授权(二)
Authorization 授权 在更简单的应用程序中,身份验证可能就足够了:用户进行身份验证后,便可以访问应用程序的每个部分. 但是大多数应用程序都有权限(或角色)的概念.想象一下:有权访问你的面向 ...
- path-sum-ii leetcode C++
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- hdu 4288 Coder (线段树+离线)
题意: 刚开始有一个空集合.有三种操作: 1.往集合中加入一个集合中不存在的数 x 2.从集合中删除一个已经存在的数 x 3.计算集合的digest sum并输出. digest sum求 ...
- 第06课 OpenGL 纹理映射
纹理映射: 在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多 ...
- .net core 和 WPF 开发升讯威在线客服系统:把 .Net Framework 打包进安装程序
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程. 系列文章目录: https://blog.shengxunwei.com/Home/Post/44a3 ...
- istio ServiceMesh
什么是ServiceMesh?什么是Istio? 微服务的一种概念,随着微服务的来临,衍生出一系列的问题,比如服务发现.负载均衡.路由.流量控制.服务间通讯的可靠性.微服务的监控等一系列的问题.使用a ...
- Java操作MongoDB之mongodb-driver(一)
1. mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动. (1)通过maven仓库导入:https://mvnrepository.com/ar ...
- (三)MySQL数据管理
3.1 外键(了解即可) 方式一:在创建表的时候,增加约束(麻烦,比较复杂) CREATE TABLE IF NOT EXISTS `student`( `id` INT(4) NOT NULL AU ...
- SCTL 涅槃重生:投入 RAL 的怀抱
在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,PMC 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了一条 SQL ...