python打卡以及Linux自动运行python文件
- 前因
- 分析
- python代码
- 实现linux自动运行python文件
- 了解crond
- 开机自启设置
- 定时运行python文件设置
- crond踩坑
- 总结
前因
学校弄了个每日打卡,需要我们每天打卡两次,对于学校这种强烈的关心,我们非常感动(吃不消)。为了减轻学校每天催检的负担,于是有了这个自动打卡悄悄的,不要让学校知道我们这么为它着想
分析
签到之前是进去填数据,现在改进得简单了,登陆后点击一键签到就行。所以,先弄出个python代码实现登陆和签到的功能
借鉴了一个大神师兄的代码,他发现了登陆页面需要提交三个参数,账户密码和一个固定的参数,而点击签到是一个get请求,所以只要用python 的requests库模拟正常签到发的网络请求携带上正常的参数即可
而对于怎么让这个python文件能自动运行呢?
办法还是有的
- 可以让python文件一直运行,代码逻辑实现到点模拟签到请求
- 可以使用win10下自带的定时任务
但是这一个个的方法感觉好low,要一直开着电脑,那么有没有能一直开着的电脑能给我用用,这就用到了阿里云的服务器了,服务器一般可是一直开着的呀,不用多浪费。
所以,要是把代码放到阿里云服务器上,并像win10的定时任务一样到点就运行,这就完美解决了
python代码
import requests
import time
import urllib3
from bs4 import BeautifulSoup
# 禁用warning
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 填写账号密码
userAccounts = [
# ['username1', 'password2'],
# ['username2', 'password2']
]
# 账号密码登陆后返回请求需要headers
def login(username, password):
#登陆需要的三个参数username、password、rememberme
data = {
'username': username,
'password': password,
'rememberMe': 'false'
}
# 模拟post请求,verify=False禁用https检测
response = requests.post(
url='签到网址', data=data, verify=False)
# 获取setCookie字段
setCookie = response.headers['Set-Cookie']
# 获取JSESSIONID
JSESSIONID = setCookie[:setCookie.index(';')]
# 模拟正常请求构造headers,很多头其实也可以不用,信息可以从浏览器的开发者模式中自己找到加上
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-US;q=0.7',
'Connection': 'keep-alive',
'Cookie': JSESSIONID,
'Host': '自己找到加上或者删除这个header',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
return headers
'''
点击打卡请求是get请求,参数只有一个_=13位数字
嗯13位时间戳
所以在后面加上时间戳
那么就很简单了
解决打卡只需模拟get请求
生成一个13位时间戳,带上JSESSIONID即可
'''
# process函数处理打卡和签到
def process():
# 遍历账号
for userAccount in userAccounts:
# 登陆,获取headers
headers = login(userAccount[0], userAccount[1])
# 模拟打卡
r = requests.get('签到网址?_=%d' %
(int(round(time.time() * 1000))), verify=False, headers=headers)
print('%s打卡成功' % (userAccount[0]))
# main函数调用process
if __name__ == '__main__':
process()
实现linux自动运行python文件
了解crond
windows下有计划任务,可以设置定时任务
而 crond 就是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程
其中:
分钟,可以是从0到59之间的任何整数。
小时,可以是从0到23之间的任何整数。
日期,可以是从1到31之间的任何整数。
月份,可以是从1到12之间的任何整数。
星期,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件
例如
#基本格式
* * * * * user command
#分 时 日 月 周 用户 命令
#每天11.30运行该目录下的test_main脚本
30 11 * * * /home/test_main.sh
#每分钟执行一次
* * * * * user command
#每隔2小时执行一次
* */2 * * * user command (/表示频率)
#每天8:30分执行一次
30 8 * * * user command
#每小时的30和50分各执行一次
30,50 * * * * user command(,表示并列)
#每个月的3号到6号的8:30执行一次
30 8 3-6 * * user command (-表示范围)
#每个星期一的8:30执行一次
30 8 * * 1 user command (周的范围为0-7,0和7代表周日)
开机自启设置
用root权限编辑rc.local文件
sudo vim /etc/rc.local
在exit 0上面编辑启动脚本的命令
/python路径 /文件路径/auto.py > /日志打印路径/auto.log
最后重启Linux,脚本就能自动运行并打印日志了
定时运行python文件设置
用root权限编辑crontab文件
sudo vim /etc/crontab
在文件末尾添加以下命令
2 * * * * root /python路径/python /文件路径/auto.py > /home/日志想存放的位置/auto.log
以上代码的意思是每隔两分钟执行一次脚本并打印日志
如果已经配置了python环境,可以直接写python,不用具体写出python路径
crond踩坑
网上有的博客中提到一些命令不是crond的,而是crontab
所以可能会出现下列错误
Unit crond.service could not be found.
这是因为Ubuntu上的服务名称是cron不是crond。所以你的命令应该是:
service cron start
总结
所以,我们需要用到上面的自动运行python文件,只需要把签到的python代码文件上传到服务器,然后在crontab文件中设置每天什么时候运行就可以了,如果还要追求完美的可以再设置在一个区间时间中随机时间选取一个时间进行签到,同时设计出如果签到失败可以有邮件通知,防止由于服务器停止运行而错过签到