GitHub action 可以简单理解为一个可以用来自动跑代码的地方,每个repo都有这个功能,没有在自己仓库找到的话,可能是你没开。关于github action 的具体介绍我就不复述,可以自己去了解或者去GitHub官方文档查看。需要提到的是GitHub action 不适用于精准时间的自动任务,因为workflow的执行是需要排队的,如果某个时间点人多那就多排一会。
![打开repo的action](https://i-blog.csdnimg.cn/blog_migrate/2b39f407c483353068dee66ac49f8274.png)
一、创建仓库/folk仓库
可以自己新建一个仓库或者folk自己想要的仓库
也可以查看一下鄙人的仓库
二、创建yml文件
1 直接在仓库根目录下创建
.github/workflows
目录,并且在这个目录下添加一个以.yml结尾的文件即可
2 在仓库内点击action-》new workflow -》set up a workflow yourself
# workflow name 随便给自己的任务起个名
name: tly-checkin
# trigger 什么时候触发这个任务
on:
workflow_dispatch: # 自己手动执行
schedule: # 定时任务 第一个填分钟 第二个填小时
- cron: 15 * * * * # 想要运行的小时-8即为填入值例如:bj11点运行 填11-8=3
# 工作内容
jobs:
checkin: # 作业名
runs-on: ubuntu-22.04 #运行环境 ubuntu-22.04 Linux 运行器上运行
steps:
- uses: actions/checkout@v2
- name: Set up Python version
uses: actions/setup-python@v2
with:
python-version: 3.9.18
- name: requirements
run: |
python -m pip install --upgrade pip
pip install requests
- name: Checkin
run: |
python3 ./tlyauto.py #要执行的py代码
env: #设置secrets的环境变量
COOKIE1: ${{ secrets.COOKIEW }}
TOKEN: ${{ secrets.BHSHARE_TOKEN }}
这里面的大体内容基本不变,可以在了解基本语法后自由编写;不学也没关系,能知道哪里是干嘛的就行,直接复制就行。
需要注意的是:
定时任务的语法格式:按顺序为:分钟 小时 天 月 年 任意匹配就填 * 具体数值就填具体
runs-on:运行环境如果和python的版本 不匹配可能报错:Error: Version 3.9.1 with arch x64 not found 我这里直接指定运行版本和python的版本,而不使用ubuntu-latest 防止后期更新导致报错。
env:这里的内容是为了防止自己的隐私直接写入代码被别人直接看到,所以相当于加了一层保护,可以在这里设置自己的secrets 注意名称大写
定义后的使用也很简单:
#具体在python中使用
import os
cookie = os.environ["COOKIE1"] #cookie
token = os.environ["TOKEN"] #token
三、创建执行的代码
将自己想要执行的代码写入即可,我这里是一个网站的签到,网站的签到需要输入验证码,所以调用了云码的接口,这里是网上随便找的之前用的接口不开放了,,,这个是收费的开始有250次试用,之后一块钱500次,如果有更好的接口可以推荐推荐~
可以看到不是每次都是准确的
import time
import requests
import base64
import json
import os
from datetime import datetime
cookie = os.environ["COOKIE1"] #账号cookie 从secrets获取
# cookie可以从浏览器中获取,登录之后f12 找到cookie即可
token = os.environ["TOKEN"] #验证码token
#token在http://zhuce.jfbym.com/自行申请 收费1块钱500次
#解析图片获取验证码
def imgcode_online(imgurl):
_custom_url = "http://api.jfbym.com/api/YmServer/customApi"
_token = token
verify_type="10110"
_headers = {
'Content-Type': 'application/json'
}
payload = {
"image": imgurl,
"token": _token,
"type": verify_type
}
resp = requests.post(_custom_url, headers=_headers, data=json.dumps(payload))
print('resp-----')
print(resp.text)
#result = resp.text
result = json.loads(resp.text)#转换为字典
if result['code'] == 10000:
print('data----')
print(result['data'])
return result['data']
else:
print('msg:----')
print(result['msg'])
return 'error'
# 10000 识别成功
# 10001 参数错误
# 10002 余额不足
# 10003 无此访问权限
# 10004 无此验证类型
# 10005 网络拥塞
# 10006 数据包过载
# 10007 服务繁忙
# 10008 网络错误,请稍后重试
# 10009 结果准备中,请稍后再试
# 10010 请求结束
def getmidstring(html, start_str, end):
start = html.find(start_str)
if start >= 0:
start += len(start_str)
end = html.find(end, start)
if end >= 0:
return html[start:end].strip()
def tly():
signUrl="https://tly31.com/modules/index.php"
hearder={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36','Cookie':cookie}
res=requests.get(url=signUrl,headers=hearder).text
signtime=getmidstring(res,'<p>上次签到时间:<code>','</code></p>')
timeArray = time.strptime(signtime, "%Y-%m-%d %H:%M:%S")
timeStamp = int(time.mktime(timeArray))
t = int(time.time())
#86400是一天
if t-timeStamp>86400:
print("距上次签到时间大于24小时啦,可签到")
#获取验证码图片
captchaUrl="https://tly31.com/other/captcha.php"
signurl="https://tly31.com/modules/_checkin.php?captcha="
hearder={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36','Cookie':cookie}
res1=requests.get(url=captchaUrl,headers=hearder)
base64_data = base64.b64encode(res1.content).decode()
oocr=imgcode_online(base64_data)
print('获得的验证码:-----')
print(oocr['data'])
# base64_data = base64.b64encode(res1.content)
# oocr=imgcode_online('data:image/jpeg;base64,'+str(base64_data, 'utf-8'))
res2=requests.get(url=signurl+oocr['data'].upper(),headers=hearder).text
print('res2:----')
print(res2)
else:
print("还未到时间!",t-timeStamp)
def main_handler(event, context):
tly()
if __name__ == '__main__':
tly()
四、执行与调试
保存后直接执行即可。如果第一次执行action中会有执行的按钮,执行后可以点击具体的一次执行查看执行的结果。
如果执行过之后想要调试,那可有点痛苦了,一来不使用魔法的话GitHub的网速折磨人,二来调试不方便。
点击想要查看的workflows后就可以再次执行,不过这里的执行貌似是根据他当时执行的状态,也就是说你执行后进行的修改是不会被更新执行的。
不建议直接用网页进行调试,想要调试的话,可以在触发条件on里面添加push:这样就可以每次用git 去push的时候就触发;如果非要在网页进行调试,那就在触发条件里面添加 workflow_dispatch: 自己手动执行:
参考文章:
基于GITHUB ACTION的定时任务,真香!_github action定时-CSDN博客