你是否曾经为了不错过批踢踢(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-CrawlerPTT-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-APIpip 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秒。

备用方案:

  • 使用 PythonAnywhereHeroku等免费云平台部署脚本,实现24小时运行。
  • 若不想写代码,可使用现成的 IFTTTZapier集成,但灵活性较低。

验证结果:检查转传是否成功

具体操作说明:

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.ccapi.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 &后台运行。

- 使用 screentmux管理会话,方便查看日志。

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库版本冲突。建议添加自动重启机制(如使用 supervisorsystemd),并定期查看错误日志。

总结:

通过本教程,你已学会从零搭建Telegram自动转传PTT文章的系统,涵盖机器人注册、数据抓取、脚本编写、故障排查及部署优化,实现实时、稳定的文章推送。