Nexmoe

由于某学习平台屏蔽了腾讯云和阿里云这两家服务商的 IP,我就把我 15 年买的古董树莓派 3B 翻了出来用来跑脚本。

由于我的树莓派不是全天 24 小时供电的,不能保证永久在线,所以我希望开机就自动启动的我脚本。

然后我希望我的脚本仅在有签到的时候通过 Server 酱通知我。

刷入系统

SD 卡这东西说实话在如今已经很少见了,我在家到处翻才翻到一张杂牌的 8G 卡,不过能用就行,现在树莓派刷入系统真方便,直接用官方的软件就行。

干掉 Python2 换上 Python3

正当我以为能直接跑脚本的时候,我才知道树莓派默认用的 Python2,所以第二步就是干掉 Python2 换上 Python3 了,终端中运行

sudo apt remove python # 卸载 Python2 
sudo apt autoremove # 清理 Python2
sudo apt install python3 # 一般系统已经有 Python3 了,这步可以跳过
sudo ln -s /usr/bin/python3.7 /usr/bin/python #	创建一个新的链接指向 Python3

Clone 脚本

git clone https://hub.fastgit.org/mkdir700/chaoxing_auto_sign.git # 用的 Github 加速源

配置脚本并运行测试

进入 chaoxing_auto_sign/local/config.py 对脚本进行配置

然后在终端中 cd {填你的路径}/chaoxing_auto_sign/local/ 并使用 python main.py timing 运行脚本进行测试。

gif

一切就绪,开始进入本文的重头戏。

安装 Screen

终端中运行

sudo apt install screen

开机自动运行脚本

/home/pi/Desktop/ 新建 start.sh 方便编辑查找,内容如下

#!/bin/sh
 
CreateScreen()
{
        screen -dmS $1
        screen -x -S $1 -p 0 -X stuff "$2"
        screen -x -S $1 -p 0 -X stuff '\n'
}

CreateScreen "chaoxing" "/home/pi/Desktop/chaoxing.sh"

/home/pi/Desktop/ 新建 chaoxing.sh 方便编辑查找,内容如下

#!/bin/sh

cd {填你的路径}/chaoxing_auto_sign/local/
python main.py timing

终端中运行

sudo nano /etc/rc.local

exit 0 上插入如下代码以让系统在启动时自动运行 start.sh

su pi -c "exec /home/pi/Desktop/start.sh"

编辑完成后按组合键 Ctrl+O 回车保存,然后就可以重启树莓派了,重启后在终端输入

screen -r chaoxing

查看脚本是否运行正常

(扩展)仅有签到时通过 Server 酱通知

2021 年 9 月 17 日:不是很懂 python,改了过后貌似签到成功了也不会通知。

脚本默认在每次运行时都会进行通知,频率很高非常烦人。所以做此修改。

修改 chaoxing_auto_sign\local\message.py 的代码为

from datetime import datetime

import aiohttp

from config import SERVER_CHAN_SEND_KEY


async def server_chan_send(dataset):
    """server 酱将消息推送"""
    if SERVER_CHAN_SEND_KEY == '':
        return
    
    msg = ("| 账号 | 课程名 | 签到时间 | 签到状态 |\n"
           "| :----: | :----: | :------: | :------: |\n")
    msg_template = "|  {}  |  {}  | {}  |    {}    |"
    
    for datas in dataset:
        if datas:
            for data in datas:
                msg += msg_template.format(data['username'], data['name'], data['date'], data['status'])
                
            params = {
                'title': msg,
                'desp': msg
            }
            
            async with aiohttp.ClientSession() as session:
                async with session.request(
                    method="GET",
                    url="https://sctapi.ftqq.com/{}.send?title=messagetitle".format(SERVER_CHAN_SEND_KEY),
                    params=params
                ) as resp:
                    text = await resp.text()
        else:
            msg = "当前暂无签到任务!\{}".format(datetime.now().strftime('%Y年%m月%d日 %H:%M:%D'))
            break