CATsama:如何做一个定时发嘟的 Mastodon bot

性感猫猫,每日上午八点半,在您的时间线上推送一个喵喵神签

在缪尚后厅和大家聊天时,猫猫从键盘经过,留下一串神秘文字。大家一致认为这是猫猫给我们留下的忠告,因此决定在缪尚给猫猫神开个位置,就有了这个喵喵喵账号。让我们有请 CATsama!

在 VPS 上安装 python

综合此方和塔塔的教程,决定安装 miniconda。

1
2
3
4
5
6
7
# 在 /root 文件夹执行如下命令
mkdir miniconda
cd miniconda

# 下载 python 最新版本并用 bash 安装
wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
sh Miniconda3-latest-Linux-x86_64.sh //用bash安装

之后会有很长一段的文字,都是许可说明,一直按 Enter 即可,直到出现 Do you accept the license terms? [yes|no] 输入 yes,开启正式安装。安装路径直接使用默认 /root/miniconda3
安装完成后会询问是否运行 conda init 来初始化,选择 yes
检查是否安装成功,重启终端后输入 conda --version

安装 bot

安装前准备

注册 Mastodon 账号,在管理面板找到开发-创建新应用,创建新应用并给予读写权限,复制访问令牌。
由于 Fedi 有许多 bot 账号,为避免 bot 账号之间陷入无限回复循环,建议勾选账号设置中的 “这是一个机器人账户”。

安装

创建存放 bot 相关文件的文件夹,这里模仿塔塔,存在 /root/miniconda 下。

1
2
3
4
5
6
7
8
9
10
# 代码来源于塔塔
cd miniconda
conda create -n mastbot python=3.8 # 创建一个叫mastbot的版本为3.8的python虚拟环境,如果已经创建了就不用了
conda activate mastbot # 激活mastbot环境,root账号前会出现(mastbot)
pip3 install requests beautifulsoup4 Mastodon.py # 安装mastodon.py
pip3 install numpy # 安装 numpy,catsama 需要
mkdir catsama
cd catsama
nano mybot_usercred.secret # 写入刚才复制的访问令牌,保存退出
nano catsama.py # 发嘟脚本

发嘟 python 脚本框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import random
from mastodon import Mastodon

mastodon = Mastodon(
access_token = 'mybot_usercred.secret',
api_base_url = '实例地址',
)

# 要发送的内容放在当前文件夹下面的 `content.txt` 里,每行一句
content = random.choice(open("content.txt").read().splitlines())
# content 即为发送嘟文的内容,可根据 bot 的需要替换为不同内容

mastodon.status_post(content)

上述工作完成后,python bot.py 运行脚本。如果顺利,bot 就会发出嘟嘟;如有报错,根据报错信息修改。

定时发嘟

想要实现定时发嘟肯定不能人工蹲点,而要实现自动化。使用 crontab 设置定时任务,定时自动运行 python bot.py 即可实现定时发嘟。

1
30 2 * * *  cd /root/miniconda/catsama && /root/miniconda3/envs/mastbot/bin/python catsama.py >> /root/miniconda/catsama/log.txt 2>&1

设置为每天服务器时间 2:30 发送一条喵签。如有报错信息,将输出到 log.txt,可根据报错修改。

catsama 脚本存档

生成一个含有字母、数字、特殊符号和汉字的字符串,这串字符即为喵签内容。如果遇到低概率随机生成的串为空或最终输出的部分为空,则从 ABC 的朋友们名字中选择一个作为喵签内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import random
import string
import numpy as np, numpy.random
from mastodon import Mastodon

# 随机生成num个中文字符并输出为list
def GBK2312(num):
str = ''
if num == 0:
return str
for i in range(1,num+1):
head = random.randint(0xb0, 0xf7)
body = random.randint(0xa1, 0xfe)
val = f'{head:x}{body:x}'
str = str + bytes.fromhex(val).decode('gb2312')
return list(str)

# 随机生成num个数字并输出为list
def listNum(num):
nums = []
while len(nums) < num:
i = random.randint(0,9)
nums.append(i)
return list(str(nums))

# 生成猫签
def predictfuture():
# 随机生成n个数字
numN = random.randint(0,9)
num = listNum(numN)
# 随机生成n个字母
src_letters = string.ascii_letters
letN = random.randint(0,26)
letters = random.sample(src_letters,letN)
# 随机生成n个特殊字符
spN = random.randint(0,6)
src_special = string.punctuation
special = random.sample(src_special,spN)
# 随机生成n个汉字
chN = random.randint(0,26)
chinese = GBK2312(chN)
# 合并所有随机生成的内容
ran_list = num + letters + special + chinese
# 随机打乱生成的内容
random.shuffle(ran_list)
# print(ran_list)
# list转str
temp = ''.join(ran_list)
numS = numN + letN + spN + chN
# 填补可能出现的所有类型字符都为0或随机长度为0的情况
ABC_list = ['Enjolras', 'Combeferre', 'Jean prouvaire', 'Feuilly', 'Courfeyrac',' Bahorel', 'Lesgle or Laigle', 'Joly', 'Grantaire']
friendABC = random.randint(0, len(ABC_list)-1)
# 输出猫猫语
if numS == 0:
catsama = ABC_list[friendABC]
else:
catl = random.randint(0,numS)
if catl == 0:
catsama = ABC_list[friendABC]
else:
catsama = temp[0:catl]
return catsama

mastodon = Mastodon(
access_token = 'mybot_usercred.secret',
api_base_url = 'https://musain.cafe',
)

content = predictfuture() + ', miao!'
# print(content)

mastodon.status_post(content)