一些唠叨
很久很久之前就对首页刷到的 bot 感兴趣,以前还把自己的账号标记成机器人玩(大家不要学),今天我终于拥有机器人账号了 @Tokusatsu@mas.to
!是发送特摄相关内容的,欢迎大家来玩!!!这篇博客不是教程吗怎么还夹带私货
做事情有时候真的看缘分的,前两天突然就这么灵光一闪开始捣腾,刚开始做的是 misskey 的文字 bot,而且因为是从本地发帖,操作起来也相当简单。之后 kon酱给我发了一个Firefish/Misskey上的定时发图bot ,再加上特摄真的很多表情包,勾起了我做图片bot的心,但是!我根本看不懂!!!
天呐我真的对代码一无所知,何况还是 json 这种一听就吓得我退避三舍的东西,所以我选择直接对 gpt 提要求,它给出的方案是在本地建一个图片文件夹并加入随机列表。
misskey 是有网盘的,kon 酱那个方案就是读取网盘里的图片列表并且直接从网盘上传,这样就不会占用太多资源。我还想加上定时删除功能,这样未免太过复杂。
但 mastodon 有自带的定时删除,而且由于我技术力不够显然也是不太用得上网盘的,于是最终决定在 mastodon 上运营这个账号。我的诉求是:
- 文字和图片中随机选一条
- 每天上午和晚上9点自动发送
- 半年之前的帖子自动删除
1 和 2 都请 gpt 老师帮我实现了,3 依靠 mastodon 实现了,于是我美美入睡满心期待等第二天的帖子,然后一觉醒来什么都没有……
这才知道本地的发帖程序只有电脑保持开机才可以运行,上午我没开电脑程序的发送请求就被系统拒绝了!!!
询问 gpt 后无奈接受了部署云端的建议,又是一个我听都没听过的操作方案,经过一整天的不断调整,好歹是弄出来了,因此特意写这篇记录 绝对不是因为太久没写博客了手痒
2025.07.26:由于railway目前已经取消每月更新的免费额度,新用户只能免费使用一个月,所以本方案不再适用于白嫖党,但是没关系,我找gpt老师研究了最新的免费办法,并且相比起使用railway更加简单方便,请直接点击目录或者手动翻到本文第五节——伟大的github。
正式部署
这个操作流程,我大概描述一下就是,在本地准备好文件,推送到 github 仓库,再把这个仓库部署到 railway ,让 railway 根据文件里写的脚本自动运行。
听起来不是很难,问题不大我一步一步写。
下载与注册
-
安装 Python:https://www.python.org/downloads
下载自己电脑型号对应的版本,安装的时候下方有个
Add Python to PATH
必须勾选检查是否安装成功
1.在电脑上按win+R
2.输入cmd
然后按enter回车,打开命令提示符
3.输入python --version
4.如果看到类似Python 3.12.3
说明安装成功 -
获取 API Token
-
登录准备用来作为 bot 的 mastodon 账号,打开
设置
-开发
,点击创建新应用
-
给应用取个名字,这个名字之后会出现在帖子下方用作发帖来源
-
勾选权限,
write:media 上传媒体文件
和write:statuses 发表嘟文
,再点击提交
-
点开应用,复制“你的访问令牌”,也就是 Token
-
-
注册一个 github 账号,下载 Github Desktop 、Git 和 VScode
具体操作可以参考这篇文章:Hugo-小白博客部署记录
-
注册railway:https://railway.com/
点击右上角
Sign in
,选择用 github 账号登录
准备文件
在 D 盘新建一个mastodon_bot 文件夹,在其中准备以下6个文件:
1.bot.py
最主要的运行脚本。先新建一个 txt 文档,然后另存为 bot.py
就好了
|
|
2.Procfile
python 后面就是那个脚本名字,也是新建 txt 文档,另存为命名的时候一定要注意这个文件是没有后缀名的
|
|
3.sentences.txt
|
|
4.images/
图片文件夹(.jpg/.png/.webp),用来放随机发送的图片
5.requirements.txt
Python 依赖列表
|
|
6.railway.json
Railway 配置
|
|
新建github仓库
-
登录后点击右上角
+
→New repository
-
填写信息:
Repository name: mastodon-bot(或其他名字)
Description(可选)
选择 Public 或 Private
不要勾选 README 等初始化选项(我们用自己已有的文件)
-
点击
Create repository
将本地代码上传到github
在D:\mastodon_bot 中任意空白处右键,点击 Open Git Bash Here,在弹出的命令行界面中输入:
|
|
enter回车,再输入:
|
|
https://github.com/你的用户名/mastodon-bot.git
就是你的仓库地址,可以在这里直接复制:
成功后可以在github仓库看到本地的代码文件
部署railway
点击新建项目,选择刚刚建立的 github 仓库
点击左边 worker 召唤出右边面板,点击 Varibles
,点击 + New Varibles
在 VARIABLE_NAME
中分别输入 ACCESS_TOKEN 和 INSTANCE_URL,对应的 VALUE or ${{REF}}
中分别输入 TOKEN 和实例地址
后续维护更新
打开 Github Desktop,登录 Github 账号,点击添加已经存在的仓库,并且在本地选择对应的文件夹
修改内容后,点击左边 Changes
栏,点击文件名可以看到具体内容,勾选要同步的文件
,下方 Summary(required)
为本次更新行为命名,再点击最下面 Commit to main
提交,最后点击上方第三个大黑框 Push origin
进行推送即可,推送成功后rail会自动更新部署无需手动操作。
结语
不出意外的话这样就是成功了!中间其实还有一个步骤是 github 的授权没有给到 railway,导致新建项目的时候首页看不到那个 github 仓库,我记得自己重新搞了个什么授权操作,但是不记得具体操作步骤是什么了,也没有办法复刻这一步……
总之如果有人根据我这个流程设置bot遇到了这个问题的话,可以评论留言或者从fedi联系我,看到界面我应该能想起来吧(大概
本文到此结束了,感谢gpt老师对此做出的重大贡献,祝大家都能玩上喜欢的bot!!!
伟大的github
这里介绍一个新的方案,依然会一步一步详细讲解,所以本节以上的内容都可以不用看直接跳过,当不存在就好了,没有删除只是为了留档。
获取 API Token
-
登录准备用来作为 bot 的 mastodon 账号,打开
设置
-开发
,点击创建新应用
-
给应用取个名字,这个名字之后会出现在帖子下方用作发帖来源
-
勾选权限,
write:media 上传媒体文件
和write:statuses 发表嘟文
,再点击提交
-
点开应用,复制“你的访问令牌”,也就是 Token
注册 github 账号
具体操作可以参考这篇文章:Hugo-小白博客部署记录
部署github
新建仓库
-
网页登录账号后,点击上方设置,找到
Secrets and variables
-Actions
-
点击右边的绿色按钮
New repository secret
-
需要新建两个repository secret,内容如下:
Name Secret ACCESS_TOKEN 访问令牌(在实例账号开发中复制 INSTANCE_URL 实例地址(后面不要加/,如 https://mas.to
创建文件
-
新建 bot.py 文件
打开仓库,点击图上红色框框链接:
文件内容如下:
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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
import random import requests from datetime import datetime, timezone import os ACCESS_TOKEN = os.getenv('ACCESS_TOKEN') INSTANCE = os.getenv('INSTANCE_URL') if not ACCESS_TOKEN or not INSTANCE: print("请设置环境变量 ACCESS_TOKEN 和 INSTANCE_URL") exit(1) TEXT_FILE = "sentences.txt" IMAGE_FOLDER = "images" def get_random_content(): """ 随机获取待发送的内容(文字段落或图片路径) 1. 从文本文件中读取全文,用空行分隔成段落,每段可以是多行文本 2. 从图片文件夹读取所有支持格式的图片路径 3. 如果都没有内容返回 None 4. 随机返回其中一条内容 """ content_list = [] if os.path.exists(TEXT_FILE): with open(TEXT_FILE, "r", encoding="utf-8") as f: text = f.read() paragraphs = [p.strip() for p in text.split('\n\n') if p.strip()] content_list.extend(paragraphs) if os.path.isdir(IMAGE_FOLDER): for file in os.listdir(IMAGE_FOLDER): if file.lower().endswith((".png", ".jpg", ".jpeg", ".gif", ".webp")): content_list.append(os.path.join(IMAGE_FOLDER, file)) if not content_list: print("没有可发送的文字或图片。") return None return random.choice(content_list) def upload_media(image_path): url = f"{INSTANCE}/api/v2/media" headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"} try: with open(image_path, "rb") as img: files = {"file": img} response = requests.post(url, headers=headers, files=files) if response.status_code == 200: return response.json()["id"] else: print(f"图片上传失败:{response.text}") return None except Exception as e: print(f"上传图片异常:{e}") return None def post_status(content): url = f"{INSTANCE}/api/v1/statuses" headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"} try: if os.path.isfile(content): media_id = upload_media(content) if not media_id: return data = {"status": "", "media_ids[]": [media_id]} else: data = {"status": content} r = requests.post(url, headers=headers, data=data) print(f"{datetime.now(timezone.utc)} 状态码: {r.status_code}") print(r.text) except Exception as e: print(f"发帖异常:{e}") def job(): print(f"{datetime.now(timezone.utc)} 开始执行定时任务") selected = get_random_content() if selected: print("将发送:", selected) post_status(selected) else: print("没有内容发送") if __name__ == "__main__": print("机器人启动,执行一次任务后退出...") job()
完成后应如图所示:
点击右上角绿色的
Commit changes
提交 -
新建 .github/workflows/schedule.yml 文件
回到仓库页面,点击红色框框新建文件 :
文件内容如下:
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
name: Mastodon Bot Scheduled Posting on: schedule: - cron: '0 1 * * *' # UTC 01:00 = 北京时间 09:00 - cron: '0 13 * * *' # UTC 13:00 = 北京时间 21:00 workflow_dispatch: # 添加这个就可以手动测试了 jobs: post: runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v3 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.12' - name: Install dependencies run: | pip install requests pip install schedule - name: Run bot script env: ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} INSTANCE_URL: ${{ secrets.INSTANCE_URL }} run: python bot.py
完成后应如图所示:
注意:在文件名输入框内直接输入/
会自动生成对应的文件夹
-
新建 sentences.txt 文件
这里放随机发帖的文字,采取空行分隔,空行与空行之间代表一次发帖内容:
-
新建 images/test.txt 文件
提交后打开 images 文件夹,上传图片:
打开 test.txt 文件,删除:
务必点击绿色按钮提交!
试运行
-
回到仓库页面,点击上方
Actions
-
选择
Mastodon Bot Scheduled Posting
-
点击
Run workflow
,Branch 选择main
,最后点击绿色按钮运行 -
检查bot账号是否正常发帖
添加内容
-
添加图片
打开 images 文件夹,上传新的图片,为本次更新命名并推送更新
-
添加文字
打开 sentences.txt 文件,编辑内容并推送更新