装饰

最近遇到一个烦心的事,有很多人莫名其妙私聊我,而其中又夹杂着一些正常的私聊信息,不好过滤这些消息,于是我就想了一个方法:让正常聊天的人私聊我的机器人,我通过机器人得到这些消息,再回复他们;不私聊机器人,直接私聊我的,按垃圾信息处理。一切开始的前提是:你需要有一台能够长期稳定运行的服务器。下一篇文章更新了一下机器人的功能(添加回复功能):设计一个telegram聊天机器人(二号机(长轮询))




1. 创建一个 Telegram 机器人

在开发 Telegram 机器人之前,需要通过官方工具 @BotFather 创建一个机器人,并获取它的 Token。以下是详细步骤:

1.1 创建机器人

  1. 打开 Telegram,搜索 @BotFather,点击进入并点击 Start
  2. 输入以下命令创建一个新机器人:/newbot
  3. 根据提示设置机器人的显示名称和用户名:
    • 显示名称:例如 My Anti-Spam Bot
    • 用户名:必须以 bot 结尾,例如 my_antispam_bot
  4. 创建成功后,@BotFather 会返回一个机器人 Token,例如:123456789:ABCDEF1234567890abcdef1234567890 妥善保存此 Token,它是控制机器人访问权限的密钥。

1.2 获取管理员的 Telegram 用户 ID

您需要获取自己的 Telegram 用户 ID,用于接收机器人的消息。

  1. 搜索并启动 @userinfobot
  2. 输入 /start,它会返回您的 OWNER_ID ,例如:12345678



2. 实现垃圾信息拦截功能

2.1 项目结构

创建以下目录结构:

/opt/telegram_bot/
├── bot.py # 主脚本
├── requirements.txt # 依赖库
├── logs/ # 日志目录
└── bot.log # 日志文件

2.2 编写主脚本

以下是 bot.py 的内容:

from telegram.ext import Updater, MessageHandler, Filters
import logging

# 配置日志记录
logging.basicConfig(
filename="/opt/telegram_bot/logs/bot.log",
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.INFO,
)
logger = logging.getLogger(__name__)

# 内存中的黑名单
blacklist = set()

def handle_message(update, context):
user_id = update.message.chat_id
username = update.message.from_user.username
first_name = update.message.from_user.first_name or ""
last_name = update.message.from_user.last_name or ""
message_text = update.message.text
message_time = update.message.date.strftime("%Y-%m-%d %H:%M:%S")

# 根据是否有用户名生成用户链接
if username:
user_link = f"[{username}](https://t.me/{username})"
else:
user_link = f"[{first_name} {last_name}](tg://user?id={user_id})"

logger.info(f"收到消息: {message_text} 来自用户: {username or user_id}")

# 检测垃圾关键词
scam_keywords = ["Spam Info Bot", "点击链接", "账号验证", "永久停用", "恢复功能"]
if any(keyword in message_text for keyword in scam_keywords):
# 如果检测到垃圾信息,删除消息并记录
update.message.delete()
blacklist.add(user_id)
logger.warning(f"垃圾消息被拦截: {username or user_id} 内容: {message_text}")
return

# 正常消息,转发给 OWNER_ID
context.bot.send_message(
chat_id=OWNER_ID, # 替换成自己的账号ID
text=f"📩 收到正常消息:\n用户: {user_link}\n时间: {message_time}\n内容: {message_text}",
parse_mode="Markdown",
)


# 初始化机器人
updater = Updater("BOT_TOKEN", use_context=True) # 替换为实际的机器人令牌
dispatcher = updater.dispatcher
dispatcher.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))
updater.start_polling()
updater.idle()

2.3 安装依赖

创建 requirements.txt,内容如下:

python-telegram-bot
python-dotenv

安装依赖:

pip3 install -r /opt/telegram_bot/requirements.txt



3. 设置系统服务,自动启动机器人

为了让机器人能够自动启动并长期运行,我们将其配置为系统服务。

3.1 创建服务文件

创建 telegram_bot.service 文件:

sudo nano /etc/systemd/system/telegram_bot.service

内容如下:

[Unit]
Description=Telegram Anti-Spam Bot
After=network.target

[Service]
ExecStart=/usr/bin/python3 /opt/telegram_bot/bot.py
Restart=always
WorkingDirectory=/opt/telegram_bot

[Install]
WantedBy=multi-user.target

3.2 启动服务

  • 重新加载 Systemd:
sudo systemctl daemon-reload
  • 启动机器人服务:
sudo systemctl start telegram_bot
  • 设置开机自启:
sudo systemctl enable telegram_bot



4. 配置日志轮转

为了防止日志文件无限增长,我们可以通过 logrotate 工具设置日志轮转。

4.1 创建 logrotate 配置

创建 /etc/logrotate.d/telegram_bot 文件:

sudo nano /etc/logrotate.d/telegram_bot

内容如下:

/opt/telegram_bot/logs/bot.log {
daily # 每天轮换日志
rotate 7 # 保留最近 7 天的日志
compress # 压缩旧日志(生成 .gz 文件)
delaycompress # 延迟一天再压缩新生成的轮换日志
missingok # 如果日志文件不存在则跳过,不报错
notifempty # 如果日志为空则不进行轮换
sharedscripts
postrotate
systemctl reload meng_antiSpamBot.service > /dev/null 2>&1 || true
endscript
}


4.2 测试 logrotate

首先设置轮转配置的所有者:

sudo chown root:root /etc/logrotate.d/telegram_bot

运行以下命令测试配置:

sudo logrotate -d /etc/logrotate.d/telegram_bot

如果配置无误,您会看到日志轮转的模拟输出。

假如有错误,一般都是轮转配置每行后面多加了一个^M换行符,用如下代码清除即可:

sudo cat -A /etc/logrotate.d/telegram_bot         #查看日志的隐藏字符

sudo sed -i 's/[ \t]*$//' /etc/logrotate.d/telegram_bot #清除空格隐藏字符

sudo sed -i 's/\r$//' /etc/logrotate.d/telegram_bot #清除换行字符




5. 总结

最后,你只需要在telegram找到这个机器人,添加到你的个人简介就可以了。简介记得写明让客户私聊机器人,而不是直接私聊你。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注