Быстрые сообщения для телеграм на Python + telethon
Начнём как обычно с зависимостей.
from telethon import TelegramClient, events, sync import pyPrivnote as pn import requests import re
Далее как обычно - мы инициализируем приложения телеграм для либы telethon
api_id = 333333 api_hash = "123asd123asd123asd123ase" phone = "+880005553535" client = TelegramClient("session", api_id, api_hash) client.start() client.sign_in(phone)
Объяснения что это и зачем было в статье по привнотам, вот тут: https://teletype.in/@codingcommunity/BJszHdLvN
Далее нам необходим яндекс токен для перевода слов или предложений.
https://translate.yandex.ru/developers/keys
Получить его можно тут. Естественно у вас должен быть аккаунт яндекс.
Далее мы его записываем в переменную и создаём 2 функции по переводу с РУ на англ и наоборот.
y_token = "trnsl.1.1.МНОГОМНОГОМНОГОМНОГОСИМВОЛОВ" def en_ru(text): params = "text={}&lang=en-ru&format=plain".format(text) URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=" + y_token + "&" + params get = requests.get(URL).json()["text"][0] return get def ru_en(text): params = "text={}&lang=ru-en&format=plain".format(text) URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=" + y_token + "&" + params get = requests.get(URL).json()["text"][0] return get
Ну тут всё просто. В соответствии с их документацией нам необходимо передать параметры по которым будет идти перевод и сам текст. На выходе мы получаем переведенный текст. 2 функции идентичны. Сначала мы создали переменную params в которую записали наш текст, затем идёт lang=en-ru а это значит что мы будем передавать английский текст и хотим получить русский текст. Далее мы создаём URL который будет отправляется в виде запроса, тут всё так же по документации яндекса. Далее передаём запрос, парсим с ответа в формате json переведённый текст. Вторая функция та же самая. Можно было сделать одну функцию и передавать в неё параметр языка. Но раньше я об этом не думал :D
Теперь идёт хэндлер для отлова сообщений.
@client.on(events.NewMessage(outgoing=True)) async def my_event_handler(event): if "//btc" in event.raw_text: await event.edit('3Pqs') elif "//eth" in event.raw_text: await event.edit('0xF') elif "//bch" in event.raw_text: await event.edit('bitcoincash:qq') elif "//ltc" in event.raw_text: await event.edit('MD') elif "//dash" in event.raw_text: await event.edit('XbUVu') elif "//ru_en" in event.raw_text: tee = event.raw_text[8:] await event.edit(ru_en(tee)) elif "//en_ru" in event.raw_text: tee = event.raw_text[8:] await event.edit(en_ru(tee)) elif "//help" in event.raw_text: await event.edit('Работаю.') await client.delete_messages(event.chat_id, event.id) elif "//google" in event.raw_text: tee = event.raw_text[9:] await event.edit("https://google.gik-team.com/?q=" + str(tee.replace(" ", "+"))) elif "//calc" in event.raw_text: tee = event.raw_text[7:] result = eval(tee) await event.edit(str(result))
Тут всё просто, бывают моменты что за работу мне платят в крипте, поэтому я записал заранее свои кошельки и при вводе в чате //dash - это слово заменится на мой dash кошелек. Такс, с кошельками мы разобрались. Далее идёт перевод. Мы получаем строку текста, нам в переводчике не нужны //en_ru или //ru_en так что мы отсекаем всё что после них, то бишь - мы создаем переменную tee = event.raw_test[8:] . А это значит что мы будем получать весь текст после 8 символов и передаём его в функцию переводчика. Далее получаем от неё переведенный текст и изменяем исходное сообщение. Работает оно так:
Далее у нас идёт интересная вещь. Иногда надоедают вопросы на которые отвечал уже сотни раз, поэтому я посылаю людей в гугл. После написания //google нужно указать поисковой запрос. Результат можете проверить сами С:
Ну и одно из последний это калькулятор. Использует он eval. К счастью для нас в хэндлере стоит @client.on(events.NewMessage(outgoing=True)) . То есть только наши сообщения. А вообще eval - Разбирает и исполняет указанное выражение.
И на последнее я оставил функции отлова привнотов о которой писал в одной из первых статей и в начале данного "гайда".
@client.on(events.NewMessage) async def my_event_handler(event): if re.findall(r'(https://privnote.com/)', event.raw_text, re.I): awesome_re = re.search("(?P<url>https?://[^\s]+)", event.raw_text).group("url") note_text = pn.read_note(str(awesome_re)) await client.send_message("https://t.me/joinchat/AAAAAFjфффффффффф", str(note_text))
Ну и в конце что бы всё работало надо указать:
client.run_until_disconnected()
А теперь весь листинг программы:
from telethon import TelegramClient, events, sync import pyPrivnote as pn import requests import re api_id = 333333 api_hash = "123asd123asd123asd123ase" phone = "+880005553535" client = TelegramClient("session", api_id, api_hash) client.start() client.sign_in(phone) y_token = "trnsl.1.1.МНОГОМНОГОМНОГОМНОГОСИМВОЛОВ" def en_ru(text): params = "text={}&lang=en-ru&format=plain".format(text) URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=" + y_token + "&" + params get = requests.get(URL).json()["text"][0] return get def ru_en(text): params = "text={}&lang=ru-en&format=plain".format(text) URL = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=" + y_token + "&" + params get = requests.get(URL).json()["text"][0] return get @client.on(events.NewMessage(outgoing=True)) async def my_event_handler(event): if "//btc" in event.raw_text: await event.edit('3Pqs') elif "//eth" in event.raw_text: await event.edit('0xF') elif "//bch" in event.raw_text: await event.edit('bitcoincash:qq') elif "//ltc" in event.raw_text: await event.edit('MD') elif "//dash" in event.raw_text: await event.edit('XbUVu') elif "//ru_en" in event.raw_text: tee = event.raw_text[8:] await event.edit(ru_en(tee)) elif "//en_ru" in event.raw_text: tee = event.raw_text[8:] await event.edit(en_ru(tee)) elif "//help" in event.raw_text: await event.edit('Работаю.') await client.delete_messages(event.chat_id, event.id) elif "//google" in event.raw_text: tee = event.raw_text[9:] await event.edit("https://google.gik-team.com/?q=" + str(tee.replace(" ", "+"))) elif "//calc" in event.raw_text: tee = event.raw_text[7:] result = eval(tee) await event.edit(str(result)) @client.on(events.NewMessage) async def my_event_handler(event): if re.findall(r'(https://privnote.com/)', event.raw_text, re.I): awesome_re = re.search("(?P<url>https?://[^\s]+)", event.raw_text).group("url") note_text = pn.read_note(str(awesome_re)) await client.send_message("https://t.me/joinchat/AAAAAFjфффффффффф", str(note_text)) client.run_until_disconnected()
На этом всё. Мой код не идеален, да и вообще, это всё костыли. Не повторяйте моих ошибок.