May 30, 2019

Быстрые сообщения для телеграм на 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()
На этом всё. Мой код не идеален, да и вообще, это всё костыли. Не повторяйте моих ошибок.