如何在Django应用中集成Telethon实现Telegram消息监听及ORM交互
Django 集成 Telethon 完整解决方案
1. 解决手机号重复验证问题
Telethon的手机号验证仅需在首次运行时完成,验证通过后会在当前目录生成.session后缀的会话文件,你只需要:
- 先在本地开发环境运行一次你编写的独立Telethon代码,完成短信/二次验证流程,生成对应的会话文件(你的示例中文件名为
anon.session) - 后续部署时将该会话文件和代码一起上传到服务器,无需再次验证
注意:不要泄露会话文件,该文件包含你的Telegram账号登录凭证
2. 推荐集成方案:自定义Django管理命令
该方案可以让Telethon服务完全独立运行,和Django Web服务互不干扰,同时能直接调用Django环境的所有能力包括ORM,是生产环境的最优选择。
实现步骤:
- 在你需要集成Telethon的Django应用目录下,创建层级目录
management/commands,两个目录下都要新建空的__init__.py文件 - 在
commands目录下新建run_telethon.py,写入以下代码:
from django.core.management.base import BaseCommand from django.conf import settings from asgiref.sync import sync_to_async from telethon import TelegramClient, events # 导入你需要用到的Django模型 from yourapp.models import YourModel class Command(BaseCommand): help = '启动Telegram消息监听服务' def handle(self, *args, **options): api_id = settings.TELEGRAM_API_ID api_hash = settings.TELEGRAM_API_HASH client = TelegramClient('anon', api_id, api_hash) # 示例:异步回调中操作Django ORM @sync_to_async def save_message_to_db(content): # 所有ORM操作放在sync_to_async包裹的同步函数中 YourModel.objects.create(content=content) @client.on(events.NewMessage) async def my_event_handler(event): if 'hello' in event.raw_text: # 调用ORM操作 await save_message_to_db(event.raw_text) await event.reply('hi!') client.start() client.run_until_disconnected()
- 在Django的
settings.py中添加配置项:
TELEGRAM_API_ID = 231232131 TELEGRAM_API_HASH = '32131232312312312edwq'
- 启动服务:直接运行命令
python manage.py run_telethon即可,生产环境可以用systemd、supervisor等工具托管该进程,实现后台常驻运行。
3. 备选方案:Django启动时自动运行Telethon服务
如果你需要Telethon服务和Django Web服务同时启动,可以利用Django的AppConfig钩子实现:
- 在你的应用的
apps.py中修改对应AppConfig类:
import os import threading from django.apps import AppConfig from telethon import TelegramClient from django.conf import settings class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'yourapp' def ready(self): # 避免Django开发模式runserver重载时重复启动 if os.environ.get('RUN_MAIN') != 'true': return # 单独开线程运行Telethon事件循环 def run_telethon(): client = TelegramClient('anon', settings.TELEGRAM_API_ID, settings.TELEGRAM_API_HASH) # 这里添加你的事件处理逻辑,ORM操作方法和上面自定义命令的写法一致 client.start() client.run_until_disconnected() t = threading.Thread(target=run_telethon, daemon=True) t.start()
注意:该方案仅适合小流量场景,高并发下容易出现线程安全问题,生产环境优先选择自定义管理命令方案。
4. ORM交互注意事项
- Telethon是异步框架,Django ORM默认为同步实现,不能直接在异步回调函数中调用ORM操作,必须用
asgiref.sync.sync_to_async包裹同步的ORM操作后异步调用 - 如需进行批量ORM操作,建议放在同一个
sync_to_async包裹的函数中执行,减少切换开销
内容的提问来源于stack exchange,提问作者durdenk
相关产品推荐
相关产品推荐

