利用 GitHub Action 进行每日签到

前言

什么?你说你想弄一个自动签到的程序,但是又不想买服务器?

好,那就让 GitHub Action 来帮你

今天闲来无事看到我科学上网的每日自动签到脚本挂了,点进去网站一看,原来是网站改版了,正好可以重写一个顺便随便写篇文章记录一下

技术选型:可以用 nodejs 和 python,思来想去选择了 python

逻辑分析

一点进去官网看,发现有四个链接,每个链接里面的网页内容都是同一套样式,那么我们可以弄一个数组把这四个链接储存起来,当第一个链接挂了就换第二个进行登录,以此类推

image-20240404214212601

点开F12分析了一波,发现给网页传一个 POST 传参就可以登录成功,然后要手动访问主页

image-20240404215146506

具体逻辑

  1. 请求第一个链接,网页状态码返回 200,成功
  2. 给第一个链接传个 POST 请求,传参是账号密码和 remember-me
  3. 判断 POST 的返回值,若返回值为 1 则登录成功,顺便可以 print 一下登录结果
  4. 调用签到函数,然后整理好消息模板,通过 plusplus ——一个微信推送公众号,推送给我微信
  5. 完毕

代码编写

import json
import os

import httpx

"""
百变小樱自动签到

@auther Admsec
"""


class AutoBBxySign:

def __init__(self):
self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, "
"like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"}
self.session = httpx.Client()
self.originUrl = ""
self.loginUrl = ""
self.email = os.environ.get("email")
self.password = os.environ.get("password")
self.plusplusToken = os.environ.get("token")
self.params = {"email": self.email, "passwd": self.password, "remember-me": '0'}
self.signSuccessOrNot = False
self.signSuccessMsg = ""

'''
检查每个网站
'''

def check_websites_sync(self, websites):
with httpx.Client(headers=self.headers) as client:
for site in websites:
try:
response = client.get(site)
if response.status_code == 200:
print(f"这个链接可用,就你了: {site}")
self.loginUrl = site + "auth/login"
self.originUrl = site
return site
except httpx.RequestError as e:
print(f"这个链接不能用,避一避: {site} - {e}")
# 在这里可以加入针对失败访问的站点的后续操作
continue # 尝试下一个站点

'''
登录
'''

def login(self):
r = self.session.post(url=self.loginUrl, params=self.params, headers=self.headers)
# print(r.text)
response = json.loads(r.text)
if response['ret'] != 1:
print(f"登录失败, 原因:{response['msg']}")
return False
print("登录成功")
return True

"""
签到
"""

def sign(self):
client = self.session.post(url=self.originUrl + "user/checkin", params=self.params, headers=self.headers)
print(client.text)
response = json.loads(client.text)
if response['ret'] != 1:
print(f"签到失败了,原因是{response['msg']}")
self.signSuccessMsg = response['msg']
return False
self.signSuccessMsg = response
self.signSuccessOrNot = True
return True

"""
消息模板,顺便发送消息到微信公众号
"""

def msgTemplate(self):
if self.signSuccessOrNot:
msg = (f"签到成功\n总流量{self.signSuccessMsg['traffic']}\n"
f"今日已用{self.signSuccessMsg['trafficInfo'].get('todayUsedTraffic')}\n"
f"总共已用{self.signSuccessMsg['trafficInfo'].get('lastUsedTraffic')}\n"
f"剩余流量{self.signSuccessMsg['trafficInfo'].get('unUsedTraffic')}\n")
plusplusUrl = f"http://www.pushplus.plus/send?token={self.plusplusToken}&title=bbxy自动签到&content={msg}&template=txt"
httpx.get(url=plusplusUrl, params=self.params, headers=self.headers)
print("微信公众号消息已发送")
return True
else:
plusplusUrl = f"http://www.pushplus.plus/send?token={self.plusplusToken}&title=bbxy自动签到&content={self.signSuccessMsg}&template=txt"
httpx.get(url=plusplusUrl, params=self.params, headers=self.headers)
print("微信公众号消息已发送")
return False


if __name__ == '__main__':
"""
主程序
"""
websites = ["https://www.bbxy.buzz/", "https://dash.bbxy.buzz/", "https://bbxy.buzz/",
"https://baibianxiaoying.top/"]
a = AutoBBxySign()
a.check_websites_sync(websites)
a.login()
a.sign()
a.msgTemplate()

GitHub 发布项目

github 创建储存库,这步就不演示了

在项目根目录创建 .gitignore 文件,并添加以下内容,这样该文件夹就不会被同步上去

/venv

本地初始化并提交项目

git init
git add .
git commit -m "Initial commit"

关联本地储存库和 GitHub 储存库

git remote add origin <repository-url>

git remote add: 这部分表示在 Git 中添加一个新的远程。当你执行这个命令时,你正在告诉 Git 你想要添加一个新的远程连接。

origin: 这是你为远程连接取的名字。通常情况下,"origin" 是默认远程仓库的名字。在多人协作的项目中,通常会添加多个远程仓库,每个远程仓库有自己的名字来区分。

<repository-url>: 这是你想要关联的远程存储库的 URL。在 GitHub 上创建一个新的存储库时会得到一个 URL,你可以将其作为 <repository-url> 使用。

推送到 GitHub

git push -u origin main

git push: 将本地的提交推送(或上传)到名为 origin 的远程存储库(如果你已经使用 git remote add origin <repository-url> 命令来关联远程存储库)。

-u origin main: 这部分将远程的 master 分支作为本地当前分支的上游。这样设置之后,下次你只需输入 git push 就足以将本地的提交推送到 origin 的 main 分支,无需在每次推送时都指定远程和分支名称。

添加 secrets,变量名记得要大写

image-20240405023212571

添加 GitHub Action

按照图示选择

image-20240405010857543

编辑 workflow 文件

name: Daily Python Program

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
schedule:
- cron: '0 8 * * *' # 每天早上8点执行

jobs:
run_python_program:
runs-on: ubuntu-latest
env:
email: ${{ secrets.EMAIL }}
password: ${{ secrets.PASSWORD }}
token: ${{ secrets.TOKEN }}
LOG_LEVEL: debug

steps:
- name: Checkout repository
uses: actions/checkout@v2 # 检出代码

- name: Set up Python
uses: actions/setup-python@v3 # 设置Python环境
with:
python-version: '3.12' # 使用Python 3.x


- name: 运行程序
run: |
pip install -r requestsment.txt # 替换成你的Python程序文件名
python main.py

成功!

结语

上个月买了个鱼皮的知识星球,按照他说过的“设计和逻辑比业务代码更重要”的方法做,我的编程效率的确有很大提升,算是打个小广告吧(