如何运行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),以及可能需要暂时关闭防火墙。