使用GitHub action 实现定时任务完成带验证码的签到

GitHub action 可以简单理解为一个可以用来自动跑代码的地方,每个repo都有这个功能,没有在自己仓库找到的话,可能是你没开。关于github action 的具体介绍我就不复述,可以自己去了解或者去GitHub官方文档查看。需要提到的是GitHub action 不适用于精准时间的自动任务,因为workflow的执行是需要排队的,如果某个时间点人多那就多排一会。

action的位置

打开repo的action
打开repo的action

一、创建仓库/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:  自己手动执行:


参考文章:

图片验证码识别接口 - 简书 (jianshu.com)

验证码识别技术开发文档-云码 (jfbym.com)

基于GITHUB ACTION的定时任务,真香!_github action定时-CSDN博客

【github action+python】完成定时任务并推送(学会自制)_glados自动签到-CSDN博客

TLY签到签到: TLY自动签到TLY自动签到 (gitee.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值