telethon使用:监听消息

如何运行telethon?

按照官方文档,以下代码就可以直接运行telethon,获取到当前用户信息:

from telethon import TelegramClient

# Remember to use your own values from my.telegram.org!
api_id = 12345
api_hash = '0123456789abcdef0123456789abcdef'
client = TelegramClient('anon', api_id, api_hash)

async def main():
    # Getting information about yourself
    me = await client.get_me()

    # "me" is a user object. You can pretty-print
    # any Telegram object with the "stringify" method:
    print(me.stringify())

但实际上运行起来需要代理,否则就会超时。本机使用的是v2ray的代理,按照以下代码配置后会发现执行依然超时。

client = TelegramClient('mybot', api_id, api_hash,
                        timeout=14, proxy=("http", "127.0.0.1", 10809))

可以确定端口号,协议,ip都是正确的,但就是会超时。
首先查阅官方文档,发现设置proxy对于不同版本的python来说语法不同。甚至需要安装的包也是不同的

For Python >= 3.6 : install python-socks[asyncio]
For Python <= 3.5 : install PySocks

我本机是安装的3.10,因此需要先安装python-socks,直接执行pip install python-socks
于是初始化client的代码改为:

import python_socks

client = TelegramClient('mybot', api_id, api_hash,
                        timeout=10, proxy=(python_socks.ProxyType.HTTP, '127.0.0.1', 10809))

同理,采用socks方式来连接的代码为:

client = TelegramClient('mybot', api_id, api_hash,
                        timeout=10, proxy=("socks5", '127.0.0.1', 10808))

如何监听消息

使用telethon的目的是,当执行完一些任务后,往telethon发送文件及消息,另起一个任务,监听消息,并持续将收到的文件下载到本地,并执行后续一系列操作

发送文件及消息

telethon发送消息的方法是:send_message,上传文件的方法是:send_file
可以直接按照文档示例的demo来实现:send_file demo

监听消息,接收文件

接收文件的方法是:download_media,但是只能直接调用,监听需要使用events
调用events.NewMessage接收消息,查阅了许多文档,但都无法运行成功。
首先,按照官方文档实现:

import asyncio
from telethon import TelegramClient, events
import python_socks

api_id = 1234
api_hash = 'asfgggfhgfjgh'
user_phone = '+11111111'
client = TelegramClient('mybot', api_id, api_hash,
                        timeout=10, proxy=(python_socks.ProxyType.SOCKS5, '0.0.0.0', 10808))


@client.on(events.NewMessage(pattern='(?i)hello.+'))
async def handler(event):
    # Respond whenever someone says "Hello" and something else
    await event.reply('Hey!')


@client.on(events.NewMessage(outgoing=True, pattern='!ping'))
async def handler(event):
    # Say "!pong" whenever you send "!ping", then delete both messages
    m = await event.respond('!pong')
    await asyncio.sleep(5)
    await client.delete_messages(event.chat_id, [event.id, m.id])

结果直接运行完就退出,无法获取到消息,更加无法回复,以及实现后续的操作。
于是搜索telethon监听消息,大概能找到许多类似这样的文章:https://www.jianshu.com/p/db5a2d0b630b
根据示例,写出代码示例为:

# 获取client部分省略,与上一个代码示例一致
async def msg_event_handler(event: events.NewMessage.Event):
    message = event.message
    # 判断是否是群组或者频道发送的消息
    if event.is_channel or event.is_group:
        # 获取消息的id,
        print(message)
        #    if isinstance(message.to_id, types.PeerChannel):
        #         to_id = message.to_id.channel_id
        #     else:
        #         to_id = message.to_id.chat_id
        # 自定义处理

client.add_event_handler(callback=msg_event_handler,
                         event=events.NewMessage(incoming=True))

结果依然是直接跳过,无监听状态,也无任何结果
其实答案就在telethon文档开始的quick start处可以看出来,通过run_until_disconnected来持续监听,因此改为以下代码:

import asyncio
from telethon import TelegramClient, events
import python_socks

api_id = 1234
api_hash = 'asfgggfhgfjgh'
user_phone = '+11111111'
with TelegramClient('mybot', api_id, api_hash,
                    timeout=10, proxy=(python_socks.ProxyType.HTTP, 'x.x.x.x', 10809)) as client:
    # print(client.download_profile_photo('me'))

    @client.on(events.NewMessage('me'))
    async def handler(event):
        # event.raw_text
        if event.message.media:
            print(event.message.media)
            path = await event.message.download_media()
        print(event.message)

        # await event.reply('Hey!')
    client.run_until_disconnected()

就可以持续监听本账号文件的接收了,注意TelegramClient的proxy,我运行使用的是wsl的ubuntu,但是vp_n在windows上,这里还需要额外获取一下访问windows的ip(一般来说是在windows上ipconfig,使用无线局域网适配器 WLAN),以及可能需要暂时关闭防火墙。

TG机器人(Telegram bot)通常是用Python编写,因为Python有一个强大的库Telethon,用于与Telegram API交互。以下是创建一个基本的Telegram Bot的简单步骤: 首先,你需要安装必要的库: ```bash pip install telethon python-telegram-bot ``` 然后,你可以创建一个`bot.py`文件,包含以下基本代码: ```python from telegram.ext import Updater, CommandHandler, MessageHandler, Filters import os # 获取TelegramBot token TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN' def start(update, context): update.message.reply_text('你好!我是你的Telegram机器人,我可以做些事情...') def echo(update, context): update.message.reply_text(update.message.text) def error(update, context): # log the error here print(f"Error handling {update.message}: {context.error}") if __name__ == '__main__': updater = Updater(token=TOKEN, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler("start", start)) dp.add_handler(MessageHandler(Filters.text & (~Filters.command), echo)) # 非命令消息处理 dp.add_error_handler(error) # 错误处理器 updater.start_polling() # 开始监听更新 updater.idle() # 进入主循环,直到收到stop命令 ``` 在这个例子中,当你发送`/start`命令时,机器人会回复欢迎信息,而普通的消息会被转发回去。 注意替换`YOUR_TELEGRAM_BOT_TOKEN`为你从Telegram开发者平台上获取的实际token。 运行这个脚本时,你的机器人就会开始工作了。你可以通过添加更多的命令处理器(CommandHandler)和自定义消息处理器(MessageHandler)来扩展其功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值