Python telegram bot proxy

Содержание:

Написание bot для telegram на python

Рассмотрим, как пишем бота для telegram python

Если у пользователя не установлен Python, то первоначально важно осуществить несложные действия

Затем набрать следующее значение:

  1. Вводитьsudo apt-get install python python-pip
  2. pip install pytelegrambotapi

Все приготовлено, чтобы написать кодовое слово. Затем пользователь принимает текстовое сообщение и бот сообщает свое приветствие. Телеграм заявляет ему о своих манипуляциях несколькими вариациями:

  • через запросный поиск серверного приложения (Long Poll);
  • через Webhook telegram bot python;

Сервис telegram будет направлять уведомления о том, что кто-то написал боту. Вторичный метод является наилучшим, но при этом нужно выделять IP-адрес, и установить SSL на сервере.

  1. Можно открывать популярный текстовый редактор, и можно писать кодовое сообщение;
  2. Далее требуется подключить токен. После того можно получать разнообразные сообщения. Если придет ответ, напишет: «Привет, чем я могу вам помочь?». Написать ему соответствующий ответ «Привет» или «Хэлло».

Вступление

Что должен уметь хороший робот? Ответ на этот вопрос лежит на поверхности. Всякий знает, что по-настоящему хороший робот стремится убить всех людей и уничтожить мир. Но массовые убийства — это, скорее, программа-максимум. Мы к ним обязательно вернемся, но начинать будем с малого.

Минимальные требования к нашему роботу просты. Во-первых, ему придется делать что-то если и не полезное, то хотя бы реалистичное. Телеграммный аналог «Hello, World» нас не устроит хотя бы по той причине, что три строки кода трудно растянуть на целую статью. Во-вторых, он должен поддерживать естественное общение хотя бы на уровне Siri. Специальные команды, которые нужно разучивать, и прочее шаманство, напоминающее командную строку UNIX, не пройдет. В-третьих, его возможности не должны ограничиваться обменом текстовыми сообщениями. Telegram способен на большее, и это было бы неплохо показать.

Подключаем библиотеку и получаем сообщения

Что­бы про­грам­ма на Python уме­ла управ­лять Телеграм-ботами, нуж­но в самое нача­ло кода доба­вить стро­ки:

import telebot;bot = telebot.TeleBot(‘токен’);

Един­ствен­ное, о чём нуж­но не забыть — заме­нить сло­во «токен» на насто­я­щий токен, кото­рый дал нам @BotFather. Откры­ва­ем про­грам­му горо­ско­па и добав­ля­ем.

Программа-гороскоп

Теперь научим бота реа­ги­ро­вать на сло­во «При­вет». Для это­го доба­вим после стро­чек с импор­том новый метод и сра­зу про­пи­шем в нём реак­цию на нуж­ное сло­во. Если не зна­е­те, что такое метод и зачем он нужен, — читай­те ста­тью про ООП.

И послед­нее, что нам оста­лось сде­лать до запус­ка, — доба­вить после мето­да такую строч­ку:

bot.polling(none_stop=True, interval=0)

Она ска­жет про­грам­ме, что­бы она непре­рыв­но спра­ши­ва­ла у бота, не при­шли ли ему какие-то новые сооб­ще­ния. Запус­ка­ем про­грам­му и про­ве­ря­ем, как рабо­та­ет наш бот.

Бот отве­ча­ет имен­но так, как мы запро­грам­ми­ро­ва­ли. Класс.

Такая ошиб­ка во вре­мя запус­ка про­грам­мы озна­ча­ет, что ком­пью­тер не может соеди­нить­ся с сер­ве­ром telegram.org, пото­му что его бло­ки­ру­ет Рос­ком­над­зор. Что делать? Слож­но ска­зать. Если бы вы жили в дру­гой стране, этой про­бле­мы бы не было. Ещё мож­но исполь­зо­вать какие-то сред­ства, кото­рые направ­ля­ют ваш тра­фик через дру­гую стра­ну, но рас­сказ об этих сред­ствах явля­ет­ся в Рос­сии пре­ступ­ле­ни­ем, поэто­му тут мы вам ниче­го не можем под­ска­зать.

Обучение чат-бота

В нашем примере мы будем использовать страницу Википедии в качестве текста. Скопируйте содержимое страницы и поместите его в текстовый файл под названием «chatbot.txt». Можете сразу использовать другой текст.

Чтение данных

Выполним чтение файла corpus.txt и преобразуем весь текст в список предложений и список слов для дальнейшей предварительной обработки.

f=open('chatbot.txt','r',errors = 'ignore')
raw=f.read()
raw=raw.lower()# converts to lowercase
nltk.download('punkt') # first-time use only
nltk.download('wordnet') # first-time use only
sent_tokens = nltk.sent_tokenize(raw)# converts to list of sentences 
word_tokens = nltk.word_tokenize(raw)# converts to list of words

Давайте рассмотрим пример файлов sent_tokens и word_tokens

sent_tokens
word_tokens

Предварительная обработка исходного текста

Теперь определим функцию LemTokens, которая примет в качестве входных параметров токены и выдаст нормированные токены.

lemmer = nltk.stem.WordNetLemmatizer()
#WordNet is a semantically-oriented dictionary of English included in NLTK.
def LemTokens(tokens):
    return 
remove_punct_dict = dict((ord(punct), None) for punct in string.punctuation)
def LemNormalize(text):
    return LemTokens(nltk.word_tokenize(text.lower().translate(remove_punct_dict)))

Подбор ключевых слов

Определим реплику-приветствие бота. Если пользователь приветствует бота, бот поздоровается в ответ. В ELIZA используется простое сопоставление ключевых слов для приветствий. Будем использовать ту же идею.

GREETING_INPUTS = ("hello", "hi", "greetings", "sup", "what's up","hey",)
GREETING_RESPONSES = 
def greeting(sentence):
 
    for word in sentence.split():
        if word.lower() in GREETING_INPUTS:
            return random.choice(GREETING_RESPONSES)

Генерация ответа

Чтобы сгенерировать ответ нашего бота для ввода вопросов, будет использоваться концепция схожести текстов. Поэтому мы начинаем с импорта необходимых модулей.

  • Импортируйте векторизатор TFidf из библиотеки, чтобы преобразовать набор необработанных текстов в матрицу свойств TF-IDF.
    from sklearn.feature_extraction.text import TfidfVectorizer
  • Кроме того, импортируйте модуль коэффициента Отиаи из библиотеки scikit
from sklearn.metrics.pairwise import cosine_similarity

Этот модуль будет использоваться для поиска в запросе пользователя ключевых слов. Это самый простой способ создать чат-бота.

Определим функцию отклика, которая возвращает один из нескольких возможных ответов. Если запрос не соответствует ни одному ключевому слову, бот выдает ответ «Извините! Я вас не понимаю».

def response(user_response):
    robo_response=''
TfidfVec = TfidfVectorizer(tokenizer=LemNormalize, stop_words='english')
    tfidf = TfidfVec.fit_transform(sent_tokens)
    vals = cosine_similarity(tfidf, tfidf)
    idx=vals.argsort()
    flat = vals.flatten()
    flat.sort()
    req_tfidf = flat
    if(req_tfidf==0):
        robo_response=robo_response+"I am sorry! I don't understand you"
        return robo_response
    else:
        robo_response = robo_response+sent_tokens
        return robo_response

Наконец, мы задаем реплики бота в начале и конце переписки, в зависимости от реплик пользователя.

flag=True
print("ROBO: My name is Robo. I will answer your queries about Chatbots. If you want to exit, type Bye!")
while(flag==True):
    user_response = input()
    user_response=user_response.lower()
    if(user_response!='bye'):
        if(user_response=='thanks' or user_response=='thank you' ):
            flag=False
            print("ROBO: You are welcome..")
        else:
            if(greeting(user_response)!=None):
                print("ROBO: "+greeting(user_response))
            else:
                sent_tokens.append(user_response)
                word_tokens=word_tokens+nltk.word_tokenize(user_response)
                final_words=list(set(word_tokens))
                print("ROBO: ",end="")
                print(response(user_response))
                sent_tokens.remove(user_response)
    else:
        flag=False
        print("ROBO: Bye! take care..")

Вот и все. Мы написали код нашего первого бота в NLTK. Здесь вы можете найти весь код вместе с текстом. Теперь давайте посмотрим, как он взаимодействует с людьми:


Получилось не так уж плохо. Даже если чат-бот не смог дать удовлетворительного ответа на некоторые вопросы, он хорошо справился с другими.

Возможные трудности и рекомендации

Чтобы подготовиться к кодированию, если у пользователя Windows, но не был установлен Python, целесообразно его скачать в любой версии. Можно использовать Python 3.x. Другим важным шагом является то, что рекомендуется установить пакет pip

Если у пользователя операционная система ОС Windows, важно загрузить get-pip.py, а также открыть cmd, и уже далее перейти к скачанным файлам. А далее требуется установить пакет requests

Если функция понятна в телеграме, и существует весь нужный инструментарий в телеграм, можно создать соответствующий скрипт, который впоследствии проверяет на наличие обновлений и затем уже отвечает на них определенным текстом. Телеграм обязан проверять обновления. getUpdates возвращает обновления за сутки. Чтобы получать обновления, требуется создать скрипт. А впоследствии создаются две функции. Когда скрипт телеграм считается готовым, главный его минус в том, что его нужно запускать каждый раз, когда возможен обмен с уведомлениями с установщиком. Чтобы робот прислушивался к серверу для обновлений, для этого нужно запустить главный цикл, добавив from time import sleep после import requests, заменив 2 последние строки.

Подключение бота к группе

Сейчас нам потребуется написать код, который бы смог подключить нас к приложению Long poll для дальнейшей авторизации во Вконтакте.

vk_session = vk_api.VkApi(token="Ваш ключ, который вы создали на странице настроек")
#пример  vk_session = vk_api.VkApi(token = "a6f87v8c9a9sa87a7af9a0f9f9v8a6s6c5b5m6n8bds09asc8d7b87d87bd87n"
vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, "id вашей группы Вконтакте")
#пример longpoll = VkBotLongPoll(vk_session, "637182735")
for event in longpoll.listen(): #Проверка действий
    if event.type == VkBotEventType.MESSAGE_NEW:

Вышенаписанные строчки активируют и подключать бота к нашему сообществу, дабы мы смогли с ним дальше работать.

Настраиваем сервер

Теперь научим сер­вер пони­мать, как рабо­тать с нашей про­грам­мой. Для это­го в корне сай­та нахо­дим файл .htaccess и добав­ля­ем в него такую строч­ку:

AddHandler cgi-script .py

Если у вас тако­го фай­ла нет — создай­те его и не забудь­те про точ­ку в самом нача­ле назва­ния.

Послед­нее, что оста­лось сде­лать, — настро­ить пра­ва досту­па у фай­ла с про­грам­мой. Нахо­дим её сре­ди фай­лов хостин­га и выстав­ля­ем пра­ва 755 или rwxrwxr-x:

Теперь с помо­щью Putty сно­ва под­клю­ча­ем­ся к сер­ве­ру и настра­и­ва­ем рабо­чее окру­же­ние. Это как буд­то вир­ту­аль­ная песоч­ни­ца, где мы смо­жем ста­вить нуж­ные моду­ли для Python, что­бы не мешать осталь­ным поль­зо­ва­те­лям сер­ве­ра.

Всё, что мы будем делать даль­ше, отно­сит­ся к хостин­гу SpaceWeb. Если у вас дру­гой хостинг, то, воз­мож­но, часть команд вам не при­го­дит­ся и Python будет рабо­тать напря­мую. У нас так не рабо­та­ет, поэто­му дела­ем вир­ту­аль­ное окру­же­ние.

В SSH-терминале пишем по оче­ре­ди такие коман­ды (вме­сто .thecode мож­но напи­сать назва­ние ката­ло­га, кото­рое вам по душе):

virtualenv .thecodesource .thecode/bin/activate

Эти две коман­ды созда­дут вир­ту­аль­ное про­стран­ство для запус­ка Python-файлов.

Теперь уста­но­вим Python-модуль для рабо­ты с Теле­гра­мом:

pip install pytelegrambotapi

Когда уста­нов­ка закон­чит­ся, пишем такую коман­ду:

nohup python3 /home/t/thecode/osebe/public_html/cgi-bin/telegoroskop.py

/home/t/thecode/osebe/ — это наш путь к пап­ке cgi-bin, а у вас он будет дру­гим. Поме­няй­те путь на свой и запус­кай­те.

Что­бы про­грам­ма про­дол­жа­ла рабо­тать после того, как мы закро­ем SSH-клиент, в самом нача­ле пишем коман­ду nohup.

Резуль­тат про­ек­та — бот @TheCode_Baboolya_bot.

Часть 1: Регистрация нового Telegram Bot-а

После начала общения с этим ботом, нажав /start, вы получите ответ от бота с указанием его возможностей. Нас интересует создание нового бота — /newbot.

После того как мы введем /newbot нас попросят придумать имя для нашего нового бота. Пусть оно будет MyFirstTestBot.


Далее нам нужно придумать юзернэйм для нашего бота. В нашем случае это будет mft001_bot.

После этого BotFather высылает нам специальный токен:

Наш токен оказался:

Этот токен понадобится нам при настройке нашего бота. Токен должен быть сохранён. Именно он  является единственным ключем для взаимодействия с ботом.

Теперь наш Tekegram-бот создан. Мы можем начать настраивать своего бота, например, установить изображение для бота, изменить или добавить описание бота и тп.

С регистрацией бота мы закончили. Наш бот уже есть, но на данный момент он еще ничего не умеет. Теперь нам нужна его начинка – какой-то механизм, который будет обрабатывать наши запросы к этому боту и возвращать нам ответы.

Как отправить и получить документ, аудио, видео, фото и.т.д

Продолжаем пилить telegram бот на python3 и на простом примере разберёмся, как отправлять файлы пользователям telegram бота.

Как отправить файл пользователю бота

Отправляем пользователю фотографию

@bot.message_handler(content_types=)
def text(message):
if message.text == ‘photo’:
file = open(‘photo.png’, ‘rb’)
bot.send_photo(message.chat.id, file)

1
2
3
4
5

@bot.message_handler(content_types=»text»)

def text(message)

ifmessage.text==’photo’

file=open(‘photo.png’,’rb’)

bot.send_photo(message.chat.id,file)

За это отвечает метод «send_photo» Аналогично поступим и с другими типами файлов. Например нам нужно отправить документ «file.txt»

Отправляем пользователю документ

@bot.message_handler(content_types=)
def text(message):
if message.text == ‘document’:
file = open(‘file.txt’, ‘rb’)
bot.send_document(message.chat.id, file)

1
2
3
4
5

@bot.message_handler(content_types=»text»)

def text(message)

ifmessage.text==’document’

file=open(‘file.txt’,’rb’)

bot.send_document(message.chat.id,file)

Тут мы уже используем метод «send_document» аналогично поступаем с другими типами файлов аудио, видео и прочие.

Как получить файл от пользователя

Все также как и со стикерами. В этом примере получим документ от пользователя и скачаем его себе на локалку.

@bot.message_handler(content_types=)
def handle_docs_audio(message):
document_id = message.document.file_id
file_info = bot.get_file(document_id)
urllib.request.urlretrieve(f’http://api.telegram.org/file/bot{config.token}/{file_info.file_path}’, file_info.file_path)

1
2
3
4
5

@bot.message_handler(content_types=»document»)

def handle_docs_audio(message)

document_id=message.document.file_id

file_info=bot.get_file(document_id)

urllib.request.urlretrieve(f’http://api.telegram.org/file/bot{config.token}/{file_info.file_path}’,file_info.file_path)

Получим от пользователя музыку

@bot.message_handler(content_types=)
def handle_docs_document(message):
audio_id = message.audio.file_id
file_info = bot.get_file(audio_id)
urllib.request.urlretrieve(f’http://api.telegram.org/file/bot{config.token}/{file_info.file_path}’, file_info.file_path)

1
2
3
4
5

@bot.message_handler(content_types=»audio»)

def handle_docs_document(message)

audio_id=message.audio.file_id

file_info=bot.get_file(audio_id)

urllib.request.urlretrieve(f’http://api.telegram.org/file/bot{config.token}/{file_info.file_path}’,file_info.file_path)

Точно таким-же способом можно получить любой тип файла от пользователей и создать Telegram бот на Python для конвертации файлов или у кого на что фантазии хватает))

Возможности

Возможности веб-фреймворков обычно демонстрируют на примере разработки блоговых движков. Мы разработаем нечто похожее по сути, но несколько более персональное: простенький трекер для любителей Quantified Self. Идея Quantified Self заключается в том, что сбор и анализ данных о самом себе помогает заметить тенденции и факты, которые невозможно различить невооруженным взглядом. Некоторые виды информации можно отслеживать автоматически при помощи датчиков в фитнес-браслетах, умных часах или смартфонах. Другие нужно собирать вручную. Существуют, к примеру, приложения для ведения дневника настроений или для хранения данных о съеденной еде (худеющим это полезно).

Ничто не мешает когда-нибудь интегрировать наш трекер с сервисами вроде Fitbit, но в данный момент мы ограничимся ручным сбором информации. Попробуем сделать мокап интерфейса — разумеется, текстовый. Наш воображаемый пользователь будет записывать в трекере результаты взвешивания на напольных весах, прочитанные книги и продолжительность сна. Как? Например, так.

Диалог звучит естественно? Еще как — сложно было бы сказать по-другому. В то же время в этих сообщениях можно разглядеть смысл и без искусственного интеллекта. Первое слово, если отбросить местоимение «я» — это всегда описание действие. Остаток сообщения — объект, на который это действие направлено. Если же в сообщении есть число, его можно считать количественной оценкой.

Информацию нужно не только собирать. Необходимы еще средства для того, чтобы извлекать и анализировать ее. Попробуем представить естественный диалог, который позволяет это сделать.

Вырисовывается логика. Тут командой служит первое слово: «что» для истории действия, «сколько» для статистики. Второе слово — это название действия, которое в записи шло первым. «Я» и вопросительный знак в конце можно игнорировать. Очевидно, что такие вопросы сочетаются не с любым действием, но эту проблему легко решить, предусмотрев список синонимов.

Эпилог

Как известно человек боится того чего не знает, не понимает, не может предсказать. Чтобы страха и паники не было нужна достоверная и доступная информация, а также осмысление ситуации насколько возможно широко.

Приведу пример, цифра 10 000 сама по себе не страшна, но что будет если мы приправим ее небольшим контекстом, 10 000 смертей, выглядит страшнее, не правда ли? Если дальше продолжить эксперимент с добавлением контекста то можно дойти до ужасающих результатов, допустим “10000 новых смертей от коронавируса в России в день” и тогда мы получим то, что называется паника, которое настолько сильна, что подавляет развитие разума и логического мышления, заменяя его подавляющим чувством тревоги и неистового возбуждения, совместимого с животной реакцией «дерись или беги».
Именно поэтому стоит критически анализировать информацию, особенно в наше время.

Эта статья не претендует на абсолютные знания технологий которые здесь используются, но дает понимание от начала и до конца как сделать работающее приложение и интегрировать его с мессенджером Telegram, а также показывает читателю как сделать полный цикл от начала разработки и до автоматической публикации на сервер совершенно бесплатно.

Спасибо тем кто дочитал до конца за внимание. Приятного кодинга!

Приступаем

Идея ясна, можно начинать. Зрители последней серии «Мстителей» знают, что Тони Старк делает роботов, задумчиво шевеля в воздухе цветными голограммами. Увы, нам далеко до Тони Старка. Мы вынуждены обходиться обыкновенным Python. Для хранения истории действий возьмем SQLite с единственной таблицей под названием .

Теперь займемся описанной выше логикой. Выбрасываем из полученного сообщения «я» и вопросительный знак, делим его на две части, команду и действие , после чего решаем, что делать дальше.

Этот алгоритм отправляется в функцию , которая принимает на входе базу данных и текст входящего сообщения, а на выходе отдает текст ответа робота. Функции (история действия),remember` (добавить новую запись) не заслуживают особого внимания: каждая из них сводится к простому запросу SQL.

Отладить диалог можно и в консоли — дедовском диалоговом интерфейсе.

Посмотрим, что получилось:

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score!
Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя!
Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.

Я уже участник «Xakep.ru»

Исправляем ошибки

Отлично! Теперь у вас есть работающий бот.

Есть ещё кое-что. API RandomDog генерирует не только изображения, но ещё видео и гифки. Мы не сможем получить видео или GIF от API, потому что произойдёт ошибка.

Давайте это исправим, чтобы бот отправлял нам только изображения. Если нам попадётся видео или GIF, мы снова будем вызывать API, пока не получим изображение.

1. Проверяем расширение файла с помощью регулярного выражения

Чтобы решить эту проблемы, мы будем использовать регулярное выражение.

Отличить изображение от видео или GIF, можно по расширению файла. Нам понадобится последняя часть URL.

Во-первых, необходимо определить, какие расширения файлов допускаются в нашей программе.

allowed_extension = 

Затем использовать регулярное выражение, чтобы извлечь расширение файла из URL.

file_extension = re.search("(*)$",url).group(1).lower()

Создайте функцию , используя этот код. Она будет перебирать URL, пока вы не получите файл с подходящим расширением (jpg, jpeg, png).

def get_image_url():
    allowed_extension = 
    file_extension = ''
    while file_extension not in allowed_extension:
        url = get_url()
        file_extension = re.search("(*)$",url).group(1).lower()
    return url

2. Модифицируем код

Отлично! Теперь нам осталось заменить строку  в функции  на . Ваш код должен выглядеть так:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler
import requests
import re

def get_url():
    contents = requests.get('https://random.dog/woof.json').json()
    url = contents
    return url

def get_image_url():
    allowed_extension = 
    file_extension = ''
    while file_extension not in allowed_extension:
        url = get_url()
        file_extension = re.search("(*)$",url).group(1).lower()
    return url

def bop(bot, update):
    url = get_image_url()
    chat_id = update.message.chat_id
    bot.send_photo(chat_id=chat_id, photo=url)

def main():
    updater = Updater('YOUR_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('bop',bop))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

Всё должно работать идеально. Этот код можно найти на моём GitHub.

Поздравляю с окончанием урока, теперь у вас есть классный бот для Telegram.

Перевод статьи Dzaky Widya Putra: Learn to build your first bot in Telegram with Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *