你是否曾经为了不错过批踢踢(PTT)某个看板的热门文章,而频繁手动刷新?或者希望将特定看板的文章自动转发到Telegram频道或群组,以便与朋友共享讨论?本教程将手把手教你如何利用机器人(Bot)和脚本,实现Telegram自动转传PTT文章,让你无需手动操作,就能实时接收最新内容。
问题现象描述
许多PTT使用者想要将特定看板(如Gossiping、C_Chat等)的新文章或推文自动转发到Telegram,但苦于没有现成的工具或不知道如何配置。手动复制粘贴不仅效率低下,还容易遗漏。此外,部分用户尝试使用第三方机器人时,常遇到权限不足、格式混乱或无法持续运行的问题。本教程将提供一个完整的解决方案,涵盖从准备条件到故障排除的全流程,确保你能稳定实现Telegram自动转传PTT文章。
详细教程步骤
准备工作:注册Telegram Bot并获取Token
具体操作说明:
1. 打开Telegram,在搜索栏输入 @BotFather,点击进入该机器人。
2. 发送 /newbot命令,按提示为你的新机器人设置名称(如 PTT_Forward_Bot)和用户名(必须以 bot结尾,例如 PTT_Forward_Bot)。
3. 创建成功后,BotFather会返回一个 API Token,形如 1234567890:ABCdefGHIjklMNOpqrsTUVwxyz。请务必复制并妥善保存此Token,后续所有配置都需要它。
4. 将你的机器人添加到目标Telegram群组或频道中,并确保它拥有 发送消息的权限。
注意事项/小提示:
- Token是机器人的唯一凭证,切勿泄露给他人。
- 如果忘记Token,可以重新向BotFather发送
/token命令,选择对应机器人即可重新获取。 - 建议将机器人设为群组管理员,以避免被误删或限制。
备用方案:
- 若无法创建新机器人,可使用现有公开机器人(如
@PTT_Alert_Bot),但需注意其功能可能受限。 - 无
获取PTT看板文章数据源:了解PTT API
具体操作说明:
PTT本身没有官方API,但我们可以通过第三方开源项目 PTT-Crawler或 PTT-API来获取文章列表。推荐使用 PTT-Crawler,它基于Python编写,能稳定抓取看板最新文章。
1. 在你的电脑或服务器上安装Python(版本3.8以上)和pip。
2. 打开终端或命令提示符,执行 pip install ptt-crawler安装库。
3. 编写一个简单的Python脚本来测试抓取:例如,抓取Gossiping看板前5篇文章的标题和链接。参考代码:
`python
from ptt_crawler import PttCrawler
crawler = PttCrawler()
articles = crawler.get_articles(board='Gossiping', pages=1)
for article in articles[:5]:
print(article['title'], article['url'])
`
4. 运行脚本,观察输出是否正常。如果成功显示文章信息,说明数据源可用。
注意事项/小提示:
- PTT有访问频率限制,建议每次抓取间隔至少1秒,避免被封锁IP。
- 如果抓取大量看板,需考虑使用代理或调整请求间隔。
- 确保你的网络能够正常访问
ptt.cc(部分地区可能需要科学上网)。
备用方案:
- 使用 PTT-API(
pip install ptt-api)作为替代,其接口类似,但更新频率较低。 - 若无法安装Python库,可手动解析PTT网页HTML,但复杂度较高,不推荐新手操作。
核心操作:编写自动转传脚本
具体操作说明:
现在我们将结合Telegram Bot API和PTT爬虫,编写一个自动转传脚本。
1. 创建一个Python文件,例如 ptt_forward.py。
2. 导入所需库:requests(用于发送Telegram消息)、time(用于控制间隔)、json(用于数据存储)。
3. 定义核心函数:
- fetch_new_articles(board, last_id):抓取指定看板的新文章,返回比 last_id更新的文章列表。
- send_to_telegram(token, chat_id, message):通过Telegram Bot API发送消息。
4. 主循环逻辑:
- 设置一个变量 last_article_id初始为0。
- 每60秒(可调整)运行一次抓取函数。
- 如果发现新文章,依次发送到Telegram,并更新 last_article_id。
5. 示例代码片段(简化版):
`python
import requests, time, json
from ptt_crawler import PttCrawler
TOKEN = '你的Bot Token'
CHAT_ID = '@你的群组或频道用户名'
BOARD = 'Gossiping'
crawler = PttCrawler()
last_id = 0
while True:
articles = crawler.get_articles(board=BOARD, pages=1)
new_articles = [a for a in articles if a['id'] >last_id]
for article in reversed(new_articles):
message = f"新文章:{article['title']}\n链接:{article['url']}"
requests.post(f'https://api.telegram.org/bot{TOKEN}/sendMessage',
data={'chat_id': CHAT_ID, 'text': message})
last_id = article['id']
time.sleep(60)
`
6. 运行脚本,观察Telegram是否收到文章转发。
注意事项/小提示:
- 建议将
last_id保存到本地文件(如last_id.txt),防止脚本重启后重复发送。 - 消息格式可自定义,例如添加 #PTT标签或使用Markdown排版。
- 如果抓取频率过高,可能导致PTT临时封禁IP,建议间隔至少30秒。
备用方案:
- 使用 PythonAnywhere或 Heroku等免费云平台部署脚本,实现24小时运行。
- 若不想写代码,可使用现成的 IFTTT或 Zapier集成,但灵活性较低。
验证结果:检查转传是否成功
具体操作说明:
1. 在PTT目标看板发布一篇测试文章(或等待自然新文章出现)。
2. 观察你的Telegram群组或频道,是否在1-2分钟内收到包含文章标题和链接的消息。
3. 检查消息格式:标题是否正确、链接是否可点击、是否有乱码或多余字符。
4. 连续观察3-5篇文章,确认脚本持续运行且无漏发。
5. 查看脚本运行终端,确认没有报错信息(如网络超时或Token错误)。
注意事项/小提示:
- 如果未收到消息,先检查脚本是否在运行(可添加打印日志)。
- 确保Telegram Bot在目标群组中未被静音或限制。
- 测试时建议使用一个低频看板(如Test板),避免干扰。
备用方案:
- 手动调用Telegram API测试:在浏览器中输入
https://api.telegram.org/bot你的Token/sendMessage?chat_id=@你的群组&text=测试消息,看是否能发送成功。 - 若链接无法打开,检查PTT文章URL格式是否为
https://www.ptt.cc/bbs/看板名/文章ID.html。
备用处理:常见故障及解决方案
具体操作说明:
如果转传失败或异常,按以下步骤排查:
1. 检查网络连接:确保脚本运行的设备能正常访问 ptt.cc和 api.telegram.org。可使用 ping命令测试。
2. 验证Token和Chat ID:重新向BotFather获取Token,并确认Chat ID格式正确(群组为 @群组用户名,频道为 @频道用户名)。
3. 调整抓取间隔:如果频繁出现超时或空数据,将 time.sleep(60)改为 time.sleep(120)或更长。
4. 查看错误日志:在脚本中添加 try-except块,捕获异常并输出到文件,例如:
`python
try:
# 你的代码
except Exception as e:
with open('error.log', 'a') as f:
f.write(f"{time.ctime()}: {str(e)}\n")
`
5. 重启脚本:有时临时性故障通过重启即可解决。
6. 更换数据源:如果PTT-Crawler失效,尝试使用PTT-API或手动解析网页。
注意事项/小提示:
- 如果频繁被PTT封锁,考虑使用代理或更换IP。
- 不要同时运行多个抓取实例,以免请求冲突。
- 定期更新Python库:
pip install --upgrade ptt-crawler requests
备用方案:
- 使用 Docker容器化部署脚本,避免环境依赖问题。
- 如果所有方法都失败,可考虑使用 RSS方式(PTT部分看板支持RSS),搭配Telegram RSS机器人(如
@RSSBot)实现转传。
进阶优化:添加推送格式美化与过滤功能
具体操作说明:
为了让转传内容更美观且实用,可以添加以下功能:
1. 消息格式化:使用Telegram的Markdown或HTML语法,例如将标题加粗、添加分隔线。
`python
message = f"*新文章:{article['title']}*\n[查看原文]({article['url']})"
requests.post(f'https://api.telegram.org/bot{TOKEN}/sendMessage',
data={'chat_id': CHAT_ID, 'text': message, 'parse_mode': 'Markdown'})
`
2. 关键词过滤:只转传包含特定关键词(如“爆卦”、“新闻”)的文章。
`python
keywords = ['爆卦', '新闻']
if any(k in article['title'] for k in keywords):
# 发送消息
`
3. 推文热度筛选:抓取文章推文数,只转传超过一定推数的热门文章(需额外解析PTT页面)。
4. 定时任务:使用 schedule库替代 while True循环,实现更精确的定时抓取(如每5分钟一次)。
注意事项/小提示:
- 使用Markdown时,注意转义特殊字符(如
*、_),否则可能导致解析失败。 - 关键词过滤支持中文,但需确保脚本编码为UTF-8。
- 推文数解析会增加请求负担,建议谨慎使用。
备用方案:
- 使用 Telegram Bot API 的 Inline Mode实现更复杂的交互,但需要额外开发。
- 无
部署到服务器:实现24小时不间断运行
具体操作说明:
本地电脑无法保证长期运行,推荐部署到云服务器或免费平台:
1. 使用 VPS(如阿里云、腾讯云):
- 通过SSH登录服务器,安装Python环境。
- 上传脚本文件,使用 nohup python3 ptt_forward.py &后台运行。
- 使用 screen或 tmux管理会话,方便查看日志。
2. 使用免费平台(如 PythonAnywhere):
- 注册账号,上传脚本。
- 在 "Tasks" 页面创建定时任务,例如每5分钟运行一次脚本(需修改脚本为单次运行模式)。
3. 使用 Docker:
- 编写Dockerfile,将脚本打包成镜像。
- 在服务器上运行 docker run -d --restart=always确保容器自动重启。
注意事项/小提示:
- 服务器需保持网络稳定,建议选择与PTT网络延迟较低的地区。
- 如果使用定时任务模式,脚本需设计为“只抓取最新文章并退出”,避免重复运行。
- 定期检查服务器资源占用,避免内存泄漏。
备用方案:
- 使用 GitHub Actions免费运行脚本(需配置环境变量),但受限于执行时间(最多6小时)。
- 无
常见问题补充
Q1:为什么脚本运行后Telegram没有收到任何消息?
A:首先检查脚本是否正常运行(查看终端输出)。其次确认Bot已被添加到目标群组/频道,并且有发送权限。最后测试Telegram API是否可用:在浏览器中直接访问 https://api.telegram.org/bot你的Token/sendMessage?chat_id=@你的群组&text=test。
Q2:如何避免重复发送同一篇文章?
A:在脚本中维护一个本地文件(如 last_id.txt),每次成功发送后更新文章ID。下次抓取时只处理ID更大的文章。如果脚本意外重启,读取该文件恢复状态。
Q3:PTT抓取频率太高被封怎么办?
A:将抓取间隔增加到至少60秒,并添加随机延迟(如 time.sleep(random.uniform(60, 90)))。如果仍然被封,更换IP或使用代理。
Q4:能否转传PTT的推文(留言)而不是文章?
A:可以,但需要解析文章页面中的推文内容。这增加了复杂度,建议使用专门的PTT推文爬虫库(如 ptt-push-crawler),或仅转传文章标题和链接。
Q5:脚本在服务器运行一段时间后自动停止了?
A:常见原因包括:内存不足、网络断开、Python库版本冲突。建议添加自动重启机制(如使用 supervisor或 systemd),并定期查看错误日志。
总结:
通过本教程,你已学会从零搭建Telegram自动转传PTT文章的系统,涵盖机器人注册、数据抓取、脚本编写、故障排查及部署优化,实现实时、稳定的文章推送。