You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django应用中集成Telethon实现Telegram消息监听及ORM交互

Django 集成 Telethon 完整解决方案

1. 解决手机号重复验证问题

Telethon的手机号验证仅需在首次运行时完成,验证通过后会在当前目录生成.session后缀的会话文件,你只需要:

  • 先在本地开发环境运行一次你编写的独立Telethon代码,完成短信/二次验证流程,生成对应的会话文件(你的示例中文件名为anon.session)
  • 后续部署时将该会话文件和代码一起上传到服务器,无需再次验证

注意:不要泄露会话文件,该文件包含你的Telegram账号登录凭证

2. 推荐集成方案:自定义Django管理命令

该方案可以让Telethon服务完全独立运行,和Django Web服务互不干扰,同时能直接调用Django环境的所有能力包括ORM,是生产环境的最优选择。

实现步骤:

  1. 在你需要集成Telethon的Django应用目录下,创建层级目录management/commands,两个目录下都要新建空的__init__.py文件
  2. 在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()
  1. 在Django的settings.py中添加配置项:
TELEGRAM_API_ID = 231232131
TELEGRAM_API_HASH = '32131232312312312edwq'
  1. 启动服务:直接运行命令 python manage.py run_telethon 即可,生产环境可以用systemd、supervisor等工具托管该进程,实现后台常驻运行。

3. 备选方案:Django启动时自动运行Telethon服务

如果你需要Telethon服务和Django Web服务同时启动,可以利用Django的AppConfig钩子实现:

  1. 在你的应用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:06:04