Ouvir um bate-papo por telegrama usando seu cliente

Uma vez eu queria ter mensagens de uma das conversas por telegrama armazenadas no meu disco (sem iniciar um cliente comum). Não revelarei meus motivos, mas essa oportunidade me pareceu necessária e útil.


Existem bots no telegrama para isso. No Habré existem vários artigos dedicados aos bots, por exemplo: " Assistente de bate-papo para o site ".


O bot permite que você leia e envie mensagens, você não precisa de um telefone para registrar um bot e o número de bots pode ser qualquer. Mas o nome do bot inclui a palavra "bot", que pode causar perguntas desnecessárias ao host do bate-papo.


Mas, como se costuma dizer, uma pergunta corretamente colocada é metade da resposta.


Acontece que, além da "API do bot de telegrama", há também a "API do cliente de telegrama" API para criar seus próprios clientes.


O cliente também pode enviar e ler mensagens, mas apenas de um usuário registrado (vinculado ao telefone), o que mais me convém (já estou registrado no chat).


O site do telegrama possui uma lista de APIs para diferentes plataformas: https://telegram.org/apps#source-code


No entanto, a biblioteca mais fácil de usar foi o python: a biblioteca-cliente do Pure Python 3 MTProto API Telegram chamada "telethon"


Somente aqui está o problema. Eu não sei python. Bem, há motivos para conhecê-lo.
De acordo com o manual do teleton, sua instalação é muito simples. Basta executar o comando na linha de comando:


pip3 install telethon 

Armadilhas que encontrei durante a instalação:


  • O pip3 não está instalado (instalador para python).

sudo apt-get -y instala o python3-pip


  • A biblioteca funciona apenas nas versões python> 3.5. Então você pode ter que atualizá-lo.

Tudo foi estabelecido. Role readme.txt ainda mais.


O próximo ponto é a criação de um cliente de telegrama ... Como, já? Bem, sim, tudo é simples. É verdade que primeiro você precisa se registrar como criador do cliente.


Vamos ao site do telegrama: https://my.telegram.org
Entramos no telefone e aguardamos o código de confirmação no cliente nativo do telegrama. É bastante longo (12 caracteres) e inconveniente para entrada.


Vamos ao item " API ". Pesquisamos a "API do Telegram" e acessamos a seção "Criando um aplicativo" ( https://my.telegram.org/apps ).


Preencha os campos Título do aplicativo e Nome abreviado , clique em "Criar aplicativo" e lembre-se de duas variáveis: api_id e api_hash .


É hora de fazer um cliente.


 from telethon import TelegramClient, sync #  api_id  api_hash api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) client.start() 

session_name - você pode inserir qualquer nome. Você será solicitado a digitar o telefone e um código de confirmação será enviado. Depois disso, o cliente funcionará sem ligar para o telefone (até você mudar session_name). O arquivo session_name.session aparecerá ao lado do seu programa.


Se não houver erros, o cliente está pronto. Só agora, ele não exibe nada. Vamos tentar obter informações úteis.


Aprenda um pouco sobre você:


 print(client.get_me().stringify()) 

o resultado é fornecido no formato:


 User( photo=None, last_name='Pupkin', first_name='Vasya', id=123456789, phone='79041234567', .... - - ... ) 

Podemos enviar uma mensagem nossa:


 client.send_message('username', 'Hello! Talking to you from Telethon') 

Você pode e uma imagem


 client.send_file('username', '/home/myself/Pictures/holidays.jpg') 

Como outros me veem:


 client.download_profile_photo('me') 

Analisamos em quais bate-papos estamos inscritos:


 print all chats name for dialog in client.iter_dialogs(): print(dialog.title) 

lemos todas as mensagens de chat "chat_name" (com cuidado, pode haver muitas mensagens)


 messages = client.get_entity('chat_name') print(messages) 

ver todos os usuários do chat


 participants = client.get_participants('chat_name') print(participants) 

Entregou-se?
Agora, de fato, estamos fazendo o que todos começamos isso por ...


Precisamos de um programa que monitore novas mensagens em um canal específico.


Para impedir que o cliente termine o trabalho, após client.start (), inserimos a linha:


 client.run_until_disconnected() 

Essa construção (inserida antes de client.start ()) exibe apenas novas mensagens:


 @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) print(event.message.to_dict()['message']) 

Vamos descobrir.


 @client.on(events.NewMessage(chats=('chat_name'))) 

cria um evento que é acionado quando uma nova mensagem aparece


  print(event.message) 

exibe uma mensagem neste formulário:


 Message(edit_date=None, views=None, reply_markup=None, fwd_from=None, id=187, entities=[], post=False, mentioned=False, via_bot_id=None, media_unread=False, out=True, media=None, date=datetime.datetime(2018, 10, 1, 9, 26, 21, tzinfo=datetime.timezone.utc), to_id=PeerChannel(channel_id=123456789), reply_to_msg_id=None, from_id=123456789, silent=False, grouped_id=None, post_author=None, message='hello telegram') 

De tudo isso, precisamos de um campo: "message = 'olá telegrama'":


  print(event.message.to_dict()['message']) 

A mensagem foi recebida, mas de quem é, não está clara, porque somente ID do usuário por mensagem. Para corresponder ao ID e nome de usuário, faça o download de todos os usuários do chat e coloque-os no dicionário (hash) no formato d [id] = "first_name last_name"


 participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname 

Agora podemos descobrir quem enviou a mensagem:


 s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) 

Em princípio, você pode obter o nome de usuário diretamente do telegrama, mas se houver poucos usuários, é mais fácil com um dicionário.


Recebemos a data do envio da mensagem:


 mess_date=event.message.to_dict()['date'] 

Tudo, todos os dados que temos. Resta gravá-los em um arquivo.
Para fazer isso, primeiro abra o arquivo para gravação:


 f=open('messages_from_chat', 'a') 

E escreva a mensagem:


 f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() 

Isso é tudo! Tudo o que eu precisava, o programa faz. O utilitário, é claro, é úmido, mas executa sua tarefa.


O Python não foi tão complicado quanto é pintado , especialmente porque a descrição de várias bibliotecas na Internet está cheia. Para escrever mais alguns utilitários e se acostumar com isso, você pode usá-lo como uma linguagem de script em vez de bash.


O texto completo do utilitário:
 from telethon import TelegramClient, sync, events api_id = 12345 api_hash = '0123456789abcdef0123456789abcdef' client = TelegramClient('session_name', api_id, api_hash) @client.on(events.NewMessage(chats=('chat_name'))) async def normal_handler(event): # print(event.message) user_mess=event.message.to_dict()['message'] s_user_id=event.message.to_dict()['from_id'] user_id=int(s_user_id) user=d.get(user_id) mess_date=event.message.to_dict()['date'] f.write(mess_date.strftime("%d-%m-%Y %H:%M")+"\n") f.write(user+"\n") f.write(user_mess+"\n\n") f.flush() client.start() group='group_name' participants = client.get_participants(group) users={} for partic in client.iter_participants(group): lastname="" if partic.last_name: lastname=partic.last_name users[partic.id]=partic.first_name+" "+lastname f=open('messages_from_chat', 'a') client.run_until_disconnected() f.close() 

Descrição completa da biblioteca .

Source: https://habr.com/ru/post/pt425151/


All Articles