I'm making a bot that displays new messages from different chats to the user. The first client, acting as a user, listens to the channels, and the second client, acting as a bot, displays a new message to the user.
from telethon import TelegramClient, events
api_id = '...'
api_hash = '...'
bot_token = '...'
client = TelegramClient('client', api_id, api_hash)
bot = TelegramClient('bot', api_id, api_hash).start(bot_token=bot_token)
client.start()
#client.on(events.NewMessage(chats=['...']))
async def main(event):
await bot.send_message('...', event.message)
client.run_until_disconnected()
But there is a problem: if media appears in the message, then the bot does not send the message and displays the following error:
telethon.errors.rpcerrorlist.MediaEmptyError: The provided media object is invalid or the current account may not be able to send it (such as games as users) (caused by SendMediaRequest)
If the message is sent by the first client, then the message is sent and no error occurs.
Help me please!
Related
I'd like to listen for a new incoming message in a Telegram channel.
I'm using the Telethon package and tried to run the example found in the docs.
from telethon import TelegramClient, events
api_id = "..."
api_hash = "..."
CHANNEL_ID = "..."
client = TelegramClient('anon', api_id, api_hash)
client.start()
#client.on(events.NewMessage(chats=CHANNEL_ID, outgoing=False))
async def my_event_handler(event):
print(event)
client.run_until_disconnected()
This code runs, asks me for my phone number and the login code. But after that, nothing happens.
When a message is sent to the channel, I don't see anything printed out.
I have my own telegram channel and a telegram bot which is also a channel administrator.
How can I get the username of all my subscribers using python(telebot)?
And is it possible to find out by which link the subscriber subscribed to the channel using python(telebot)?
I did not find how to do it with a telebot, but with a pyrogram
from pyrogram import Client
TARGET = -100....
api_id = 91...
api_hash = "2f01....."
link = 'https://t.me/+PP.........'
app = Client("my_account", api_id, api_hash)
async def main():
async with app:
async for event in app.get_chat_invite_link_joiners(chat_id=TARGET, invite_link=link):
I can't make a script for a long time. I have one telegram channel, I don't want to resend an album from this channel, but just send it to me in one message
from telethon import TelegramClient, events
from telethon import events
api_id =
api_hash = ""
chat = ''
client = TelegramClient('', api_id, api_hash)
print('started')
#client.on(events.Album)
async def handler(event):
#what farther
Here is one approach to do that:
from telethon import TelegramClient, events
api_id = ...
api_hash = ' ... '
chat = -1001277xxxxxx
client = TelegramClient('session', api_id, api_hash)
#client.on(events.Album)
async def handler(event):
# craft a new message and send
await client.send_message(
chat,
file=event.messages, # event.messages is a List - meaning we're sending an album
message=event.original_update.message.message, # get the caption message from the album
)
## or forward it directly
# await event.forward_to(chat)
client.start()
client.run_until_disconnected()
There is send_file which says
file (...): To send an album, you should provide a list in this parameter.
If a list or similar is provided, the files in it will be sent as an album in the order in which they appear, sliced in chunks of 10 if more than 10 are given.
caption (str, optional):
Optional caption for the sent media message. When sending an album, the caption may be a list of strings, which will be assigned to the files pairwise.
So extending #Tibebes answer
await client.send_file( # Note this is send_file not send_message
chat,
file=event.messages
caption=list(map(lambda a: str(a.message), event.messages))
)
I have this code
from telethon.sync import TelegramClient, events
with TelegramClient('name', api_id, api_hash) as client:
#client.on(events.NewMessage(pattern=pattern))
async def handler(event):
await event.reply("Here should be the Chat or Group name")
How to implement this?
if we are talking only about groups/channels
chat_from = event.chat if event.chat else (await event.get_chat()) # telegram MAY not send the chat enity
chat_title = chat_from.title
Else (If we want to get the full name of chat entities, including Users):
from telethon import utils
chat_from = event.chat if event.chat else (await event.get_chat()) # telegram MAY not send the chat enity
chat_title = utils.get_display_name(chat_from)
get_display_name() actually gets a name that you would see. Works for types User, Channel, Chat
That method shall not have await
I am using Telethon and Python 3.6xx
Been able to retreive message from groups, no problem but when it comes to channels I am stuck.
dialogs = client(get_dialogs)
for chat in dialogs.chats:
getmessage = client.get_messages(chat.id, limit=400)
for message in getmessage:
print(message.message)
I've searched the telethon documentation but most answers were in response to the old get_message_history.
When I'm trying with the following chat.id = 1097988869 (news.bitcoin.com) I'm getting an error below (for groups the chat.id works fine):
PeerIdInvalidError: An invalid Peer was used. Make sure to pass the right peer type
The accepted answer is good, but recent versions of Telethon let you achieve the same more easily. This will iterate over all messages in chat (for this example we use telethon.sync to avoid typing out async):
from telethon.sync import TelegramClient
with TelegramClient(name, api_id, api_hash) as client:
for message in client.iter_messages(chat):
print(message.sender_id, ':', message.text)
Where the variables should be obvious, for example (note these API values won't work, you need your own):
name = 'anon'
api_id = 123
api_hash = 'abcdefgh'
chat = 'me'
More examples using async are available in client.iter_messages documentation.
update :
in the new version of Telethon, #Lonami answer is best and use it.
############################################################
you can use this code for get messages :
client = TelegramClient('session_name',
api_id,
api_hash,
update_workers=1,
spawn_read_thread=False)
assert client.connect()
if not client.is_user_authorized():
client.send_code_request(phone_number)
me = client.sign_in(phone_number, input('Enter code: '))
channel_username='tehrandb' # your channel
channel_entity=client.get_entity(channel_username)
posts = client(GetHistoryRequest(
peer=channel_entity,
limit=100,
offset_date=None,
offset_id=0,
max_id=0,
min_id=0,
add_offset=0,
hash=0))
# messages stored in `posts.messages`
that work for me!
api_hash from https://my.telegram.org, under API Development.
from telethon import TelegramClient, events, sync
api_id = 'your api_id'
api_hash = 'your api_hash'
client = TelegramClient('session_name', api_id, api_hash)
client.start()
channel_username = 'username'# your channel
for message in client.get_messages(channel_username, limit=10):
print(message.message)