【github action+python】完成定时任务并推送(学会自制)
参考图文解释Glados自动签到免费获取天数(github action版)之前用了一阵sever酱,然后前两天说cookie过期了,后来改了也没用,于是想自己写一份cookie不过期的。我尝试了半天,一直报一个json格式的错。(在电脑是可行的,在action上就报错)最后原博客回答:我看了下目前用github action的方式会触发cloudflare的五秒盾,阻止了脚本的签到行为。估计gi
前言
参考图文解释Glados自动签到免费获取天数(github action版)
之前用了一阵sever酱,然后前两天说cookie过期了,后来改了也没用,于是想自己写一份cookie不过期的。我尝试了半天,一直报一个json格式的错。(在电脑是可行的,在action上就报错)最后原博客回答:我看了下目前用github action的方式会触发cloudflare的五秒盾,阻止了脚本的签到行为。估计github上用这种方式打卡的人太多了就把这个ip给封了可能。就简单记一下学习过程。(不过其他的行为都是可以的)
一、效果图
最后想起来自己还租了个服务器,最后就在服务器上下了个pycharm(当然只下个解释器就行了),开着一直跑程序就行了。一天两次,懒得动脑筋,就time.sleep了。
二、自制流程
1.钉钉机器人推送
具体看
官方文档
主要依靠 在钉钉上拉一个群(三人及以上),不过三人群之后可以踢掉一个成为两人群,里面有个智能群助手上加入一个自定义机器人。
注意这个加签,我是勾上加签,关键词和ip地址没加,然后会给你一个webhook网址,对这个网址进行post请求即可完成推送。
下面代码的secret 和 webhook 我是改过的。
加上签之后网址会变复杂。
加签之后webhook
mobile 是要发送的人的手机号 /也可以改成要发送人的昵称 代码的 atUserIds
text 是文本信息
import time
import hmac
import hashlib
import base64
import urllib.parse
def dingding(mobile,text):
timestamp = str(round(time.time() * 1000))
#加签
secret = 'SECe875a893333f66767cd8d09c3bd122e01ca9214b38f7130b2d1dd7d9f'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
#Webhook
Webhook = "https://oapi.dingtalk.com/robot/send?access_token=5efbd2e95361045ae7ed6dce1030234c573021eeefe148aac9f68d5"
#加上签之后网址后面要加上 一段签名计算代买后的sign以及时间,不加签的应该不需要后面跟的。
url = Webhook + "×tamp={}&sign={}".format(timestamp, sign)
headers = {
'Content-Type': 'application/json'
}
json ={
"at": {
"atMobiles":[
mobile
],
"atUserIds":[
""
],
"isAtAll": "false"
},
"text": {
"content": text
},
"msgtype":"text"
}
requests.post(url=url , headers= headers,json=json)
最后效果是这样。
参考python玩钉钉机器人
2.qq邮箱推送
先从qq邮箱的页面获取smtp
下面的的key也已改过。
subject为发送主题
email为收件人邮箱 格式必须为“xxxxxxxxx@qq.com”
text 为文本内容 字符串
获取smtp之后 EMAIL_ADDRESS= 换成你的邮箱地址,就是你作为发件人
def qqemail(subject,email,text):
#无需安装第三方库
key='bsjpqxig' #换成你的QQ邮箱SMTP的授权码(QQ邮箱设置里) 设置-> 账户-> SMTP服务
EMAIL_ADDRESS='885317429@qq.com' #换成你的邮箱地址
EMAIL_PASSWORD=key
import smtplib
smtp=smtplib.SMTP('smtp.qq.com',25)
import ssl
context=ssl.create_default_context()
sender=EMAIL_ADDRESS #发件邮箱
receiver=email#"255576170@qq.com"#EMAIL_ADDRESS
#收件邮箱
from email.message import EmailMessage
subject=subject
body=text
msg=EmailMessage()
msg['subject']=subject #邮件主题
msg['From']=sender
msg['To']=receiver
msg.set_content(body) #邮件内容
with smtplib.SMTP_SSL("smtp.qq.com",465,context=context) as smtp:
smtp.login(EMAIL_ADDRESS,EMAIL_PASSWORD)
smtp.send_message(msg)
手机上关注qq邮箱公众号,每天发推送就会有提醒。效果如下。
3.Github Action 定时任务
参考
官方文档
其实很简单,具体分为两个部分,一个是.yml文件,一个是自己写的程序(可以不是python)
官方文档说yaml文件必须创建在.github/workflows下
创建的时候这里打出/
即可完成创建。
了解一下yaml的语法
test.yml
我们最关心的是定时的时间,
例子:
# 每月的最后1天
0 0 L * * *
说明:
Linux
* * * * *
- - - - -
| | | | |
| | | | +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | +---------- month (1 - 12) OR jan,feb,mar,apr ...
| | +--------------- day of month (1 - 31)
| +-------------------- hour (0 - 23)
+------------------------- minute (0 - 59)
- cron: 0 16 * * *
这个意思就是定时每天的16点 但因为这个是国际协调时间UTC
我们比它晚8个小时,所以对我们来说就是定时每天24点的时候
test.yml
代码中都有注解,意思就是每修改一次[master]里的分支一次 或者每定时一次 运行一次写好的代码g1.py
我们要装的python包就写在根目录创建的requirements.txt文件下即可。如果知识qq邮箱推送,可以不装包都行。
它的默认分支应该叫main,在setting里的branch下改个名就好,或者把yml文件的master改成main就行。
示例:
#工作名字
name: glados-checkin
#
on:
workflow_dispatch:
push:
# 当对分支master进行push操作的时候,这个工作流就被触发了
branches: [ master ]
pull_request:
#只运行特定分支master
branches: [ master ]
schedule:
# 定时任务,在每天的24点 18点推送签到信息到邮箱
- cron: 0 16 * * *
# 定时器更改时间
# https://tool.lu/crontab/
# https://datetime360.com/cn/utc-cst-china-time/ #UTC时间 国际协调时间+8=北京时间
# https://docs.github.com/cn/actions/using-workflows/workflow-syntax-for-github-actions#onschedule 官方参考
#watch:
# types: started
jobs:
#将工作流程中运行的所有作业组合在一起
checkin:
#定义名为 checkin 的作业。 子键将定义作业的属性
runs-on: ubuntu-latest
#将作业配置为在最新版本的 Ubuntu Linux 运行器上运行
#if: github.event.repository.owner.id == github.event.sender.id
# https://p3terx.com/archives/github-actions-manual-trigger.html
steps:
- uses: actions/checkout@v2
#uses 关键字指定此步骤将运行 actions/checkout 操作的 v3。 这是一个将存储
#库签出到运行器上的操作,允许您对代码(如生成和测试工具)运行脚本或其他操
#作。 每当工作流程将针对存储库的代码运行时,都应使用签出操作。
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: 3.9.1
- name: requirements
run: |
python -m pip install --upgrade pip
pip3 install -r requirements.txt
# if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Checkin
run: |
python3 ./g1.py
env:
#设置secrets的环境变量
COOKIE1: ${{ secrets.COOKIE1 }}
COOKIE2: ${{ secrets.COOKIE2 }}
#SMTP: ${{ secrets.SMTP }}
MAIL1: ${{ secrets.MAIL1 }}
MAIL2: ${{ secrets.MAIL2 }}
secrets
如果不想让别人知道自己的cookie 或者smtp一些比较隐私的东西,可以最后加上环境变量
env:
#设置secrets的环境变量
COOKIE1: ${{ secrets.COOKIE1 }}
COOKIE2: ${{ secrets.COOKIE2 }}
#SMTP: ${{ secrets.SMTP }}
MAIL1: ${{ secrets.MAIL1 }}
MAIL2: ${{ secrets.MAIL2 }}
然后在setting里的secrets添加即可,参考,这里的名称必须为大写
在python 中调用的时候,这样调用就行了
cookie1 = os.environ["COOKIE1"]#因为$前面是大写所以也是大写
还有一个说法说是smtp的授权码是加密的,所以必须要放在Secrets里,但我没放还是发出去了,应该不影响,只是防隐私(之前一直出错,就把cookie啥的加进去试试)。
如果只是个人用,我是直接把仓库换成私有的了,在setting下,把仓库性质改成private,就不用加这个secrets这么麻烦了。
最后
钉钉机器人的限制是每分钟最多发20条消息,超过了就会系统就会禁你机器人10分钟。
qq邮箱的限制是每天最多发500条邮箱。
github的限制是每人最多20个免费的工作流程。(相当于也是20个轻量服务器)
如果只是上上github这种网页,不用glados上外网,用网易云加速器的学术资源加速也能加快不少。
我租的服务器是腾讯云上面的,本来期待能github 上action 能免费帮忙签到的,ip竟然被封了,不过其他网页的ip应该没封。下面是爬虫签到glados的代码,在windows上能用。
爬虫签到代码
def start(cookie,who):
# 创建一个session,作用会自动保存cookie
session = requests.session()
#点签到之后的页
url= "https://glados.rocks/api/user/checkin"
url2= "https://glados.rocks/api/user/status"
referer = 'https://glados.rocks/console/checkin'
#checkin = requests.post(url,headers={'cookie': cookie ,'referer': referer })
#state = requests.get(url2,headers={'cookie': cookie ,'referer': referer})
origin = "https://glados.rocks"
useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
#请求负载
payload={
# 'token': 'glados_network'
'token': 'glados.network'
}
#referer 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器 籍此可以获得一些信息用于处理。
#json.dumps请求序列化
checkin = session.post(url,headers={'cookie': cookie ,'referer': referer,'origin':origin,'user-agent':useragent,'content-type':'application/json;charset=UTF-8'},data=json.dumps(payload))
state = session.get(url2,headers={'cookie': cookie ,'referer': referer,'origin':origin,'user-agent':useragent})
# print(res)
print(checkin.text )
while(1):
try:
if 'message' in checkin.text:
mess = checkin.json()['message']
time = state.json()['data']['leftDays']
time = time.split('.')[0]
print(time)
text = mess +',you have '+time+' days left'
if "@qq.com" in who:
qqemail("GLaDOS签到", who, text)
else:#因为两个who 不一样
dingding(who, text)
break
except Exception as e:
print(e)
总结
不过,最后还是知道了定时说晚安的方式,还能逗逗女友。
2024.3.13更新代码见:【任务计划程序】打卡签到(自用)
更多推荐
所有评论(0)