前言

订阅了挺多的网盘影视 tg 频道,但是打开 tg 还是觉得麻烦,于是就简单让 cursor 糊了个实时更新订阅的几个网盘资源频道消息。

项目地址:https://github.com/DEKVIW/tgmonitor

demo:https://pan.pkll.de

项目介绍:

基于 Python + Telethon + Streamlit 的 Telegram 频道消息监控与管理系统。

  • 自动监听网盘影视资源分享类 Telegram 频道,只保存包含网盘链接的消息
  • 支持主流网盘类型:阿里云盘、百度网盘、夸克网盘、天翼云盘、115 网盘、123 云盘、UC 网盘、迅雷
  • 推荐/适配频道(可自定义扩展):
频道名 频道名 频道名 频道名
BaiduCloudDisk tianyirigeng Aliyun_4K_Movies NewQuark
XiangxiuNB shareAliyun bdwpzhpd Lsp115
tyypzhpd SharePanBaidu QuarkFree alyp_1
vip115hot QukanMovie  

下面是详细的部署和使用教程

电报api获取步骤
  • 打开 Telegram 官方网站:https://my.telegram.org

  • 使用你的 Telegram 账户登录(扫码或手机验证码登录)

  • 登录成功后点击:

    API Development Tools

  • 填写基本信息(随便填也可以):

    • App title: 如 newquark
    • Short name: 如 quarkbot
    • 其他选填
  • 点击“Create application”

  • 创建完成后页面会显示你的:

    • api_id
    • api_hash

保存好这两个信息,后面要用。

环境与依赖版本建议

  • 推荐 Python 版本:3.10 或 3.11(3.12 也可,优先用 3.10/3.11,兼容性最佳)
  • 推荐 PostgreSQL 版本:13、14 或 15
  • 依赖安装:已在 requirements.txt 中声明,pip install -r requirements.txt 一键安装。

首次 Telethon 登录

方法一:推荐 - 使用 session 获取脚本

  1. 运行专门的 session 获取脚本:

    1
    python get_session.py
  2. 按提示输入 API 凭据:

    • TELEGRAM_API_ID:你的 Telegram API ID
    • TELEGRAM_API_HASH:你的 Telegram API Hash
  3. 按提示输入手机号、验证码

    • 手机号格式+国家代码手机号(如:+8613812345678
  4. 登录成功后,session 文件会自动保存为 tg_monitor_session.session

方法二:直接运行监控服务登录

  1. 本地运行监控服务进行登录:

    1
    python -m app.core.monitor
  2. 按提示输入手机号、验证码

  3. 登录成功后,session 文件会自动保存为 tg_monitor_session.session

Session 文件说明

  • 文件名:tg_monitor_session.session
  • 包含 Telegram 登录凭据,无需重复登录
  • 请妥善保管,不要泄露给他人
  • 如果 session 失效,删除文件重新登录即可
  • 把文件放到项目根目录

Docker 部署说明

1. 克隆项目

1
2
git clone https://github.com/DEKVIW/tgmonitor.git
cd docker

2. 环境准备

.env 环境配置:

1
2
3
4
5
6
TELEGRAM_API_ID=你的API_ID
TELEGRAM_API_HASH=你的API_HASH
DATABASE_URL=postgresql://tg_user:password@db:5432/tg_monitor
DEFAULT_CHANNELS=频道1,频道2
LOG_LEVEL=INFO
SECRET_SALT=your_secret_salt_key_here

⚠️ 重要提示:

  1. SECRET_SALT 密钥:用于用户登录验证,建议使用随机生成的强密钥

    • 可以使用项目提供的脚本生成:python generate_secret.py
    • 可以使用在线工具生成:https://www.random.org/strings/
    • 或使用命令生成:openssl rand -hex 32
    • 示例:SECRET_SALT=a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234
  2. 数据库密码包含特殊字符时的转义处理

如果数据库密码包含特殊字符(如 #@%&+=!$*()[]{}|\:;"'<>,/?),需要进行 URL 编码转义。在线 URL 编码工具Online URL Encoder

示例

  • 原始密码:1j7wxLn#ZTlNZ#3tpkwF
  • 转义后:1j7wxLn%23ZTlNZ%233tpkwF# 转义为 %23

完整示例

1
2
3
# 原始密码:1j7wxLn#ZTlNZ#3tpkwF
DATABASE_URL=postgresql://tg_user:1j7wxLn%23ZTlNZ%233tpkwF@localhost:5432/tg_monitor
SECRET_SALT=a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234

3. 构建与初始化数据库

1
2
3
cd docker
docker-compose up -d db
docker-compose run --rm monitor python -m app.scripts.init_db

注意: 此命令会自动创建默认管理员用户(用户名: admin,密码: admin123)

4. 启动服务

1
docker-compose up -d

查看服务状态和日志

1
2
3
4
5
6
7
8
9
10
11
# 查看服务状态
docker-compose ps

# 查看监控服务日志
docker-compose logs -f monitor

# 查看Web服务日志
docker-compose logs -f web

# 查看数据库日志
docker-compose logs -f db

5. 其它注意事项

  • .env 文件中的 DATABASE_URL 主机名应为 db,如:

    1
    DATABASE_URL=postgresql://tg_user:password@db:5432/tg_monitor
  • 管理脚本、初始化等操作都建议用 docker-compose run --rm ... 方式临时运行

快速部署(系统环境)

1. 克隆项目

1
2
git clone https://github.com/DEKVIW/tgmonitor.git
cd tgmonitor

2. 配置数据库(系统环境)

1
2
3
4
5
6
7
8
sudo apt update
sudo apt install postgresql postgresql-contrib -y
sudo -u postgres psql
# 在 psql 命令行中执行:
CREATE DATABASE tg_monitor;
CREATE USER tg_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE tg_monitor TO tg_user;
\q

3. 创建虚拟环境并安装依赖

1
2
3
python3 -m venv tgmonitor-venv
source tgmonitor-venv/bin/activate
pip install -r requirements.txt

4. 配置环境变量

编辑 .env 文件,示例:

1
2
3
4
5
6
TELEGRAM_API_ID=你的API_ID
TELEGRAM_API_HASH=你的API_HASH
DATABASE_URL=postgresql://tg_user:your_password@localhost:5432/tg_monitor
DEFAULT_CHANNELS=频道1,频道2
LOG_LEVEL=INFO
SECRET_SALT=your_secret_salt_key_here

5. 初始化数据库表

1
python -m app.scripts.init_db

注意: 此命令会自动创建默认管理员用户(用户名: admin,密码: admin123)

6. 启动服务

第一步:前台测试运行

先正常启动服务进行测试,确认稳定后再后台运行:

1
2
3
4
5
# 启动监控服务(前台运行,用于测试)
python -m app.core.monitor

# 新开一个终端,启动Web服务(前台运行,用于测试)
streamlit run app/web/web.py

测试要点

  • 监控服务:检查是否正常连接 Telegram,是否开始监听频道
  • Web 服务:访问 http://localhost:8501 检查登录和功能是否正常
  • 观察日志输出,确认无错误信息

第二步:后台稳定运行

测试稳定后,使用后台运行:

1
2
3
4
5
# 监控服务(后台运行)
nohup python -m app.core.monitor > data/monitor.log 2>&1 &

# Web服务(后台运行)
nohup streamlit run app/web/web.py > data/web.log 2>&1 &

查看运行状态

1
2
3
4
5
6
# 查看进程
ps aux | grep python

# 查看日志
tail -f data/monitor.log
tail -f data/web.log

使用命令参考

说明:以下命令提供 Docker 和系统两种版本,部署完成后可根据需要选择使用。

频道管理命令

列出频道

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --list-channels

# 系统版本
python -m app.scripts.manage --list-channels

添加频道

1
2
3
4
5
# Docker 版本(多个频道用空格分隔)
docker-compose run --rm monitor python -m app.scripts.manage --add-channel 频道名1 频道名2

# 系统版本
python -m app.scripts.manage --add-channel 频道名1 频道名2

删除频道

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --del-channel 频道名

# 系统版本
python -m app.scripts.manage --del-channel 频道名

修改频道名

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --edit-channel 旧频道名 新频道名

# 系统版本
python -m app.scripts.manage --edit-channel 旧频道名 新频道名

频道诊断

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --diagnose-channels

# 系统版本
python -m app.scripts.manage --diagnose-channels

用户管理命令

创建默认用户

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --create-default

# 系统版本
python -m app.scripts.init_users --create-default

添加新用户

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --add-user 用户名 密码 [姓名] [邮箱]

# 系统版本
python -m app.scripts.init_users --add-user 用户名 密码 [姓名] [邮箱]

修改密码

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --change-password 用户名 新密码

# 系统版本
python -m app.scripts.init_users --change-password 用户名 新密码

修改用户名

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --change-username 旧用户名 新用户名

# 系统版本
python -m app.scripts.init_users --change-username 旧用户名 新用户名

编辑用户信息

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --edit-user 用户名 [姓名] [邮箱]

# 系统版本
python -m app.scripts.init_users --edit-user 用户名 [姓名] [邮箱]

查看所有用户

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --list-users

# 系统版本
python -m app.scripts.init_users --list-users

删除用户

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --remove-user 用户名

# 系统版本
python -m app.scripts.init_users --remove-user 用户名

数据维护命令

网盘链接去重

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --dedup-links

# 系统版本
python -m app.scripts.manage --dedup-links

快速网盘链接去重

1
2
3
4
5
# Docker 版本(可指定批次大小)
docker-compose run --rm monitor python -m app.scripts.manage --dedup-links-fast [批次大小]

# 系统版本
python -m app.scripts.manage --dedup-links-fast [批次大小]

去重功能说明

  • --dedup-links: 标准去重,智能判断逻辑

    • 相同链接且时间间隔 5 分钟内:优先保留网盘链接数量多的消息
    • 超过 5 分钟:保留最新的消息
    • 适合精确去重,但内存占用较大
  • --dedup-links-fast [批次大小]: 快速去重,分批处理

    • 默认批次大小:5000 条消息
    • 可自定义批次:--dedup-links-fast 1000
    • 简单时间比较:保留最新的消息
    • 内存占用低,适合大数据量处理
    • 自动清理 10 小时前的去重统计数据

链接检测命令

检测最近 N 小时的链接

1
2
3
4
5
6
7
8
9
10
11
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --check-links [小时数] [并发数]

# 系统版本
python -m app.scripts.manage --check-links [小时数] [并发数]

# 示例:
# 最近24小时,默认5并发
docker-compose run --rm monitor python -m app.scripts.manage --check-links 24
# 最近48小时,10并发
docker-compose run --rm monitor python -m app.scripts.manage --check-links 48 10

检测所有历史链接

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --check-all-links [并发数]

# 系统版本
python -m app.scripts.manage --check-all-links [并发数]

时间段检测

1
2
3
4
5
6
7
8
9
10
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --check-period [时间段] [并发数]

# 系统版本
python -m app.scripts.manage --check-period [时间段] [并发数]

# 预定义时间段示例:
docker-compose run --rm monitor python -m app.scripts.manage --check-period today
docker-compose run --rm monitor python -m app.scripts.manage --check-period week 5
docker-compose run --rm monitor python -m app.scripts.manage --check-period 2024-01-15:2024-01-20

查看检测统计

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --link-stats

# 系统版本
python -m app.scripts.manage --link-stats

查看失效链接

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --show-invalid-links [数量]

# 系统版本
python -m app.scripts.manage --show-invalid-links [数量]

系统管理命令

查看帮助

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --help

# 系统版本
python -m app.scripts.manage --help

查看用户管理帮助

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.init_users --help

# 系统版本
python -m app.scripts.init_users --help

快速上手示例

首次使用流程

1
2
3
4
5
6
7
8
9
10
11
# 1. 查看当前频道列表
docker-compose run --rm monitor python -m app.scripts.manage --list-channels

# 2. 添加监控频道
docker-compose run --rm monitor python -m app.scripts.manage --add-channel 频道名1 频道名2

# 3. 执行首次去重
docker-compose run --rm monitor python -m app.scripts.manage --dedup-links

# 4. 小规模链接检测测试
docker-compose run --rm monitor python -m app.scripts.manage --check-links 1 3

查看帮助: python -m app.scripts.manage --help

链接检测高级功能

查看中断记录

1
2
3
4
5
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --show-interrupted

# 系统版本
python -m app.scripts.manage --show-interrupted

清空检测数据

1
2
3
4
5
# Docker 版本(需要确认)
docker-compose run --rm monitor python -m app.scripts.manage --clear-link-check-data

# 系统版本
python -m app.scripts.manage --clear-link-check-data

清空旧检测数据

1
2
3
4
5
6
7
8
9
10
# Docker 版本
docker-compose run --rm monitor python -m app.scripts.manage --clear-old-link-check-data [天数]

# 系统版本
python -m app.scripts.manage --clear-old-link-check-data [天数]

# 示例:
docker-compose run --rm monitor python -m app.scripts.manage --clear-old-link-check-data 7 # 7天前
docker-compose run --rm monitor python -m app.scripts.manage --clear-old-link-check-data 30 # 30天前(默认)
docker-compose run --rm monitor python -m app.scripts.manage --clear-old-link-check-data 60 # 60天前

systemd 服务管理

为了方便启动和停止项目,可以使用 systemd。也可不做,用手动也行。

监控服务

创建文件:/etc/systemd/system/tg-monitor.service
内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=TG Monitor Service
After=network.target

[Service]
User=root
WorkingDirectory=/root/data/python/tg-monitor
Environment="PATH=/root/data/python/tg-monitor/tgmonitor-venv/bin"
ExecStart=/root/data/python/tg-monitor/tgmonitor-venv/bin/python -m app.core.monitor
Restart=always

[Install]
WantedBy=multi-user.target

Web 服务

创建文件:/etc/systemd/system/tg-monitor-web.service
内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=TG Monitor Web Service
After=network.target

[Service]
User=root
WorkingDirectory=/root/data/python/tg-monitor
Environment="PATH=/root/data/python/tg-monitor/tgmonitor-venv/bin"
ExecStart=/root/data/python/tg-monitor/tgmonitor-venv/bin/streamlit run app/web/web.py --server.port 8501 --server.address 0.0.0.0
Restart=always

[Install]
WantedBy=multi-user.target

启动和管理服务

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
# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用服务(开机自启)
sudo systemctl enable tg-monitor
sudo systemctl enable tg-monitor-web

# 启动服务
sudo systemctl start tg-monitor
sudo systemctl start tg-monitor-web

# 重启服务
sudo systemctl restart tg-monitor
sudo systemctl restart tg-monitor-web

# 查看服务状态
sudo systemctl status tg-monitor
sudo systemctl status tg-monitor-web

# 查看日志(推荐用 journalctl)
sudo journalctl -u tg-monitor -f
sudo journalctl -u tg-monitor-web -f

# 停止服务
sudo systemctl stop tg-monitor
sudo systemctl stop tg-monitor-web

条目去重

相同的网盘链接只保存最新更新的条目信息,遇到更新间隔不超过 1 分钟保留网盘标签最多的条目。

systemd 定时去重和 crontab 二选一即可

systemd 定时去重

新建服务文件 /etc/systemd/system/tg-dedup.service

1
2
3
4
5
6
7
[Unit]
Description=TG Monitor Dedup Service

[Service]
Type=oneshot
WorkingDirectory=/root/data/python/tg-monitor
ExecStart=/root/data/python/tg-monitor/tgmonitor-venv/bin/python -m app.scripts.manage --dedup-links

新建定时器 /etc/systemd/system/tg-dedup.timer

1
2
3
4
5
6
7
8
9
[Unit]
Description=Run TG Monitor Dedup daily

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

启用并启动定时器

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable tg-dedup.timer
sudo systemctl start tg-dedup.timer
sudo systemctl status tg-dedup.timer

crontab

1
(crontab -l 2>/dev/null; echo "0 * * * * cd /root/data/python/tg-monitor && /root/data/python/tg-monitor/tgmonitor-venv/bin/python -m app.scripts.manage --dedup-links-fast >> /root/data/python/tg-monitor/dedup.log 2>&1") | crontab -

数据库备份和恢复

备份

项目已提供智能备份脚本 scripts/backup_db.sh,需要根据需求修改备份的目标目录:

1
2
3
4
5
6
7
8
9
# 给脚本添加执行权限
chmod +x scripts/backup_db.sh

# 手动运行备份(推荐在项目根目录运行)
./scripts/backup_db.sh

# 或者在scripts目录运行
cd scripts
./backup_db.sh

使用前提:确保项目根目录存在 .env 文件,且包含正确的 DATABASE_URL 配置

添加定时任务:

1
2
3
4
5
# 在项目根目录添加定时任务(推荐)
(crontab -l 2>/dev/null; echo "0 3 * * * cd /root/data/python/tg-monitor && ./scripts/backup_db.sh >> /mnt/Google/backup/tg-monitor/backup.log 2>&1") | crontab -

# 或者使用绝对路径(备选方案)
(crontab -l 2>/dev/null; echo "0 3 * * * /root/data/python/tg-monitor/scripts/backup_db.sh >> /mnt/Google/backup/tg-monitor/backup.log 2>&1") | crontab -

恢复

项目已提供智能恢复脚本 scripts/restore_db.sh完全自动化,无需手动配置:

1
2
3
4
5
6
7
8
9
10
11
12
# 给脚本添加执行权限
chmod +x scripts/restore_db.sh

# 恢复数据库(推荐在项目根目录运行)
./scripts/restore_db.sh tg_monitor_20240607_091557.sql.gz

# 或者指定完整路径
./scripts/restore_db.sh /mnt/Google/backup/tg-monitor/tg_monitor_20240607_091557.sql.gz

# 或者在scripts目录运行
cd scripts
./restore_db.sh ../backup/tg_monitor_20240607_091557.sql.gz

使用前提:确保项目根目录存在 .env 文件,且包含正确的 DATABASE_URL 配置

注意事项:恢复操作会覆盖现有数据库中的所有数据,请谨慎操作!