本来是想做个自动签到,但是最后发现认证的sid有有效期orz,还只能通过公众号拿到
暂时没心思去探究这个sid究竟是啥算法了,只当熟悉一下GitHub Actions好了。
功能实现
首先当然是选用简单快捷的Python语言。
签到的功能很简单,根据sid发送一个POST请求到服务器就行,这里使用requests库完成。
当然用户不能什么也不知道,完成签到后需要给用户发送一条消息提醒提示签到成功与否,这里使用酷推作为消息推送工具,完成后,把返回值直接推送给用户。
这样就完成了一个初步的脚本:
import requests
import json
def push_message(msg):
CP_KEY=""
if CP_KEY != '':
params={"c":"签到提醒:\n"+msg}
headers={"Content-Type":"application/raw"} #发送多行消息
r=requests.post('https://push.xuthus.cc/send/'+str(CP_KEY), headers=headers, params =params)
sid=""
if sid != '':
game_id="xxx"
data = {"game_id":game_id,"sid":sid}
headers = {'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'referrer': "http://wx.xxx.com/g"+game_id+"/sign.html?sid="+sid,
'User-Agent': 'xxx'}
response = json.loads(requests.post('http://wx.xxx.com/sign/user', data =data, headers=headers).text)
msg=response["Msg"]
if(int(response["Code"])!=0): #签到不成功
msg=msg+"(Code="+str(response["Code"])+")"
push_message(msg)
联动Github Action
GitHub Action的功能本应该是CI\CD,之前没上线的时候很多项目用的都是Travis-CI,奈何现在被大伙玩出了不少新花样,比如直接在GitHub搜索「签到」就能发现不少自动签到脚本,当然我们要干的也是这个(x
基础概念
工作流程 Workflows
工作流程是您添加到仓库的自动化过程。 工作流程由一项或多项作业组成,可以计划或由事件触发。 工作流程可用于在 GitHub 上构建、测试、打包、发布或部署项目。
事件 Events
事件是触发工作流程的特定活动。 例如,当有推送提交到仓库或者创建议题或拉取请求时,GitHub 就可能产生活动。 您还可以使用仓库分发 web 挂钩在发生外部事件时触发工作流程。 有关可用于触发工作流程的事件的完整列表,请参阅触发工作流程的事件。
作业 Jobs
作业是在同一运行服务器上执行的一组步骤。 默认情况下,包含多个作业的工作流程将同时运行这些作业。 您也可以配置工作流程按顺序运行作业。 例如,工作流程可以有两个连续的任务来构建和测试代码,其中测试作业取决于构建作业的状态。 如果构建作业失败,测试作业将不会运行。
步骤 Steps
步骤是可以在作业中运行命令的单个任务。 步骤可以是操作或 shell 命令。 作业中的每个步骤在同一运行器上执行,可让该作业中的操作互相共享数据。
操作 Actions
操作 是独立命令,它们组合到步骤以创建作业。 操作是工作流程最小的便携式构建块。 您可以创建自己的操作,也可以使用 GitHub 社区创建的操作。 要在工作流程中使用操作,必须将其作为一个步骤。
运行器 Runners
运行器是安装了 GitHub Actions 运行器应用程序的服务器。 您可以使用 GitHub 托管的运行器或托管您自己的运行器。 运行器将侦听可用的作业,每次运行一个作业,并将进度、日志和结果报告回 GitHub。 对于 GitHub 托管的运行器,工作流程中的每项作业都会在一个新的虚拟环境中运行。
GitHub 托管的运行器基于 Ubuntu Linux、Microsoft Windows 和 macOS 。 有关 GitHub 托管的运行器的信息,请参阅“ GitHub 托管运行器的虚拟环境”。 如果您需要不同的操作系统或需要特定的硬件配置,可以托管自己的运行器。 有关自托管运行器的信息,请参阅“托管您自己的运行器”。
根据官方wiki我们可以写出这样一个基础的检查node bat版本的.yml
文件:
name: learn-github-actions #workflow名称
on: [push] #执行时间,此处为在push时执行
jobs: #作业
check-bats-version: #作业名
runs-on: ubuntu-latest #运行环境(Ubuntu-latest)
steps: #作业步骤
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
- run: npm install -g bats
- run: bats -v
use
的步骤为使用GitHub Action市场里已有的action,run
则是执行一些shell命令。
这个workflow的流程为:
- actions/checkout@v2 获取项目源码
- actions/setup-node@v1 完成node环境的配置
- npm install -g bats 安装bats
- bats -v 检查版本
把这个workflow放在项目的.github/workflows/
文件夹,push之后就可以在项目的Action看到一个名为 learn-github-actions
的workflow了。
但是这个workflow只会在项目有push时执行,如果需要开启手动运行则需要添加:
on: workflow_dispatch # manual trigger
之后就可以在Action标签页手动执行了。
向workflow传递变量
参考:环境变量
这个传递变量的操作实质上是通过设置环境变量并在workflow中读取完成。
例如需要读取一个名为KEY
的变量的过程如下:
-
在项目Settings-Secrets中设置Action Secrets
-
在workflow中读取:
jobs: weekday_job: runs-on: ubuntu-latest env: KEY: ${{ secrets.KEY }
-
在脚本中读取
import os key='' if os.environ.get('KEY', '') != '': key = os.environ['KEY']
编写workflow
这个workflow的流程如下:
- 获取项目源码
- 安装Python环境
- 安装pip
- 根据
requirements.txt
安装依赖 - 执行脚本
考虑到每天定时签到可能会被ban,在3和4之间可以设置一个随机的停止时间(后来证明没啥意义,GitHub Action的定时任务延迟还是很随机的x)
那我们就完成了这个workflow的作业部分:
jobs:
sign:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up python
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Random sleep
if: github.event_name == 'schedule'
run: sleep $(shuf -i 1-5 -n 1) min
- name: Run sign
env:
CP_KEY: ${{ secrets.CP_KEY }}
SID: ${{ secrets.SID }}
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
python3 ./sign.py
然后就是添加定期执行,参考定期任务,设置一个cron语法的选项即可,注意这里是UTC时间,北京时间是UTC+8:
on:
schedule:
# * is a special character in YAML so you have to quote this string
- cron: '0 0 * * *' # UTC time 0:00(8:00)
最后给这东西取个名字就完成了。
完善脚本
由于GitHub Action无法调试,所以出错只能通过log查看,这里我们可以使用logging
库来显示漂亮的log信息。
然后加上读取环境变量的语句,整个脚本就完成了。
import requests
import json
import os
import logging
def push_message(msg):
CP_KEY=""
if os.environ.get('CP_KEY', '') != '':
CP_KEY = os.environ['CP_KEY']
params={"c":"签到提醒:\n"+msg}
headers={"Content-Type":"application/raw"}
r=requests.post('https://push.xuthus.cc/send/'+str(CP_KEY),
headers=headers,
params =params)
logging.info('成功发送消息提醒')
else:
logging.info('未设置cool push key,不发送消息提醒')
def sign():
sid=""
if os.environ.get('SID', '') != '':
sid = str(os.environ['SID'])
game_id="171"
data = {"game_id":game_id,"sid":sid}
headers = {'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'referrer': "http://wx.xxx.com/g"+game_id+"/sign.html?sid="+sid,
'User-Agent': 'xxx'}
response = json.loads(requests.post('http://wx.xxx.com/sign/user',
data=data,
headers=headers).text)
msg=response["Msg"]
if(int(response["Code"])!=0):
msg=msg+"(Code="+str(response["Code"])+")"
logging.info(msg)
push_message(msg)
else:
msg="未设置sid,请在项目设置-Secrets中设置"
logging.info(msg)
push_message(msg)
if __name__=='__main__':
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(message)s',
datefmt='%H:%M:%S')
sign()
push后设置好action secrets就能定时签到啦。
上次修改於 2021-01-23