Telegram получает сообщения / сообщения чата - python Telethon

Я использую Telethon и Python 3.6xx

Мог получить сообщения из групп, нет проблем, но когда дело доходит до каналов, я застрял.

dialogs = client(get_dialogs)
for chat in dialogs.chats:
   getmessage = client.get_messages(chat.id, limit=400)
   for message in getmessage:
        print(message.message)

Я искал документацию телемарафона, но большинство ответов были в ответ на старый get_message_history.

Когда я пытаюсь использовать следующее chat.id = 1097988869 (news.bitcoin.com), я получаю сообщение об ошибке ниже (для групп chat.id работает нормально):

PeerIdInvalidError: использовался недопустимый одноранговый узел. Убедитесь, что вы передаете правильный тип однорангового узла


person AbeeCrombie    schedule 21.06.2018    source источник
comment
Вы хотите получать сообщения от канала?   -  person Alihossein shahabi    schedule 22.06.2018
comment
Обратите внимание, что в последних версиях Telethon client.get_messages(chat, limit=400) должен работать нормально.   -  person Lonami    schedule 20.01.2019


Ответы (3)


Обновить :

в новой версии Telethon лучше всего использовать ответ @Lonami.

############################################################

вы можете использовать этот код для получения сообщений:

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`
person Alihossein shahabi    schedule 22.06.2018
comment
Спасибо Али! просто для всех, кто является новичком, как я, вы можете получить доступ к тексту сообщения канала, добавив for message in posts.messages: print(message.message) - person AbeeCrombie; 22.06.2018
comment
Вы забыли from telethon.tl.functions.messages import GetHistoryRequest - person Lonami; 20.01.2019
comment
Обратите внимание, что для других людей, приходящих сюда, в более новых версиях Telethon библиотека является асинхронной, и этот код завершится ошибкой. Надо все как следует дождаться или import telethon.sync. - person Lonami; 10.03.2020

Принятый ответ хорош, но последние версии Telethon позволяют легче добиться того же. Это будет перебирать все сообщения в chat (в этом примере мы используем telethon.sync, чтобы не набирать 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)

Например, если переменные должны быть очевидны (обратите внимание, что эти значения API не будут работать, вам нужны собственные):

name = 'anon'
api_id = 123
api_hash = 'abcdefgh'
chat = 'me'

Дополнительные примеры использования async доступны в client.iter_messages < / a> документация.

person Lonami    schedule 20.01.2019
comment
Это работает с Telethon==1.10.8, в то время как принятый ответ вызывает исключение, потому что posts больше не имеет атрибута messages. - person Elias Strehle; 12.11.2019
comment
@EliasStrehle posts по-прежнему должен иметь messages, но, возможно, ему просто не хватает вызова await. - person Lonami; 12.11.2019
comment
Есть ли ярлык для пересылки всех сообщений из чата? Я пытаюсь переадресовать все сообщения из чата, начиная с самых старых и заканчивая самыми новыми - person Philippe; 27.02.2020
comment
@Lonami, как получать сообщения с канала или группы. Там написано ValueError: No user has "xxx" as username - person Gray Programmerz; 08.04.2021

это работает для меня!

api_hash из https://my.telegram.org в разделе «Разработка API».

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)
person Mad Javad    schedule 05.10.2020