利用 GitHub Action 进行每日签到 发表于 2024-04-05 更新于 2024-05-26
字数总计: 1.6k 阅读时长: 6分钟 阅读量: 广东
前言 什么?你说你想弄一个自动签到的程序,但是又不想买服务器?
好,那就让 GitHub Action 来帮你
今天闲来无事看到我科学上网的每日自动签到脚本挂了,点进去网站一看,原来是网站改版了,正好可以重写一个顺便随便写篇文章记录一下
技术选型:可以用 nodejs 和 python,思来想去选择了 python
逻辑分析 一点进去官网看,发现有四个链接,每个链接里面的网页内容都是同一套样式,那么我们可以弄一个数组把这四个链接储存起来,当第一个链接挂了就换第二个进行登录,以此类推
点开F12分析了一波,发现给网页传一个 POST 传参就可以登录成功,然后要手动访问主页
具体逻辑
请求第一个链接,网页状态码返回 200,成功
给第一个链接传个 POST 请求,传参是账号密码和 remember-me
判断 POST 的返回值,若返回值为 1 则登录成功,顺便可以 print 一下登录结果
调用签到函数,然后整理好消息模板,通过 plusplus ——一个微信推送公众号,推送给我微信
完毕
代码编写 import jsonimport osimport 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) 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 文件,并添加以下内容,这样该文件夹就不会被同步上去
本地初始化并提交项目
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,变量名记得要大写
添加 GitHub Action 按照图示选择
编辑 workflow 文件
name: Daily Python Program on: push: branches: [ "main" ] pull_request: branches: [ "main" ] schedule: - cron: '0 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 with: python-version: '3.12' - name: 运行程序 run: | pip install -r requestsment.txt # 替换成你的Python程序文件名 python main.py
成功!
结语 上个月买了个鱼皮的知识星球,按照他说过的“设计和逻辑比业务代码更重要”的方法做,我的编程效率的确有很大提升,算是打个小广告吧(