Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Ботовете в Telegram са програми, които помагат за установяване на контакт с публиката или опростяват действия, които преди това трябваше да се извършват ръчно. Тези програми са написани специално за платформата за съобщения. Ботовете работят по следния начин: потребителят изпраща команда през реда за въвеждане и системата отговаря с текстово или интерактивно съобщение. Понякога програмата дори имитира действията на реален човек - такъв бот вдъхва повече доверие сред клиентите.

Има няколко вида системи за автоматично подпомагане на потребителите. Някои ботове просто комуникират с клиентите, други редовно предоставят информация. Невъзможно е ясно да се разделят програмите на типове - разработчиците често комбинират няколко функции в един бот.

Можете да напишете прост бот за Telegram с интерактивни елементи под формата на бутони на екрана в 9 стъпки. Нека разгледаме подробно всеки от тях и да отговорим на няколко въпроса:

  • как да стартирате бот;
  • как да регистрирате вградена клавиатура от един или повече бутони;
  • как да програмирате бутоните за желаните функции;
  • какво е вграден режим и как да го настроите за съществуващ бот.

Стъпка 0: теоретична подготовка за API за ботове на Telegram

Основният инструмент, използван за създаване на ботове на Telegram, е HTML интерфейсът за програмиране на приложения или HTML API. Този елемент приема заявки от посетители и изпраща отговори под формата на информация. Готовите дизайни опростяват работата по програмата. За да напишете бот за Telegram, трябва да използвате този имейл адрес: https://api.telegram.org/bot/METHOD_NAME

За правилното функциониране на бота е необходим и токен – комбинация от знаци, която защитава програмата и отваря достъп до нея на надеждни разработчици. Всеки жетон е уникален. Низът се присвоява на бота при създаването. Методите могат да бъдат различни: getUpdates, getChat и други. Изборът на метод зависи от това какъв алгоритъм очакват разработчиците от бота. Пример за токен:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Ботовете използват GET и POST заявки. Параметрите на метода често трябва да бъдат допълвани – например, когато методът sendMessage трябва да изпрати идентификатора на чата и някакъв текст. Параметрите за усъвършенстване на метода могат да бъдат предадени като низ на заявка за URL чрез application/x-www-form-urlencoded или чрез application-json. Тези методи не са подходящи за изтегляне на файлове. UTF-8 кодиране също е необходимо. Като изпратите заявка до API, можете да получите резултата във формат JSON. Обърнете внимание на отговора на програмата за извличане на информация чрез метода getME:

ВЗЕМЕТЕ https://api.telegram.org/bot/getMe{ ok: true, резултат: { id: 231757398, first_name: "Бот за обменен курс", потребителско име: "exchangetestbot" } }

Резултатът ще се получи, ако ok равно на вярно. В противен случай системата ще покаже грешка.

Има два начина за получаване на персонализирани съобщения в ботове. И двата метода са ефективни, но са подходящи в различни случаи. За да получите съобщения, можете ръчно да напишете заявка с метода getUpdates – програмата ще покаже на екрана масива с данни за актуализиране. Заявките трябва да се изпращат редовно, след анализ на всеки масив изпращането се повтаря. Отместването е параметър, който определя броя на пропуснатите записи преди зареждане на нов резултат, за да се избегне повторното появяване на проверени обекти. Предимствата на метода getUpdates ще се проявят, ако:

  • няма начин за конфигуриране на HTTPS;
  • използват се сложни скриптови езици;
  • бот сървърът се променя от време на време;
  • ботът е зареден с потребители.

Вторият метод, който може да бъде написан за получаване на потребителски съобщения, е setWebhook. Използва се еднократно, няма нужда постоянно да изпращате нови заявки. Уеб кукичката изпраща актуализации на данни до посочения URL адрес. Този метод изисква SSL сертификат. Webhook ще бъде полезен в следните случаи:

  • използват се езици за уеб програмиране;
  • ботът не е претоварен, няма твърде много потребители;
  • сървърът не се променя, програмата остава на същия сървър за дълго време.

В по-нататъшни инструкции ще използваме getUpdates.

Услугата @BotFather Telegram е предназначена за създаване на чат ботове. Чрез тази система се задават и основни настройки – BotFather ще ви помогне да направите описание, да поставите профилна снимка, да добавите инструменти за поддръжка. Библиотеки - набори от HTML заявки за ботове на Telegram - са достъпни в Интернет, има доста от тях. При създаването на примерната програма е използван pyTelegramBotApi.

Стъпка 1: Внедряване на заявки за обменен курс

Първо трябва да напишете кода, който изпълнява заявки. Ще използваме, когато пишем API на PrivatBank, по-долу е връзка към него: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Трябва да използвате тези методи във вашия код:

  • load_exchange – намира обменни курсове и показва кодирана информация;
  • get_exchange – показва данни за конкретна валута;
  • get_exchanges – показва списъка на валутите според извадката.

В резултат на това кодът във файла pb.py изглежда така:

import re import requests import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): return json.loads(requests.get(URL).text) def get_exchange(ccy_key ): за exc в load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): ако re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) не е None: result.append(exc) връща резултат

Програмата може да издаде следния отговор на посочените заявки:

[ { ccy:"USD", base_ccy:"UAH", buy:"25.90000", разпродажба:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", buy:"29.10000", разпродажба:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", покупка:"0.37800", продажба:"0.41800" }, {ccy:"BTC", base_ccy:"USD", покупка:"11220.0384", продажба: "12401.0950" } ]

Стъпка 2: Създайте Telegram Bot с @BotFather

Можете да създадете програма за получаване на съобщения и отговаряне на тях с помощта на услугата @BotFather. Отидете на неговата страница в Telegram и въведете командата /newbot. В чата ще се появят инструкции, според които първо трябва да запишете името на бота, а след това неговия адрес. Когато акаунтът на бота бъде създаден, на екрана ще се появи приветствено съобщение, съдържащо токен. За допълнителна конфигурация използвайте тези команди:

  • /setdescription – описание;
  • /setabouttext – информация за новия бот;
  • /setuserpic – профилна снимка;
  • /setinline – вграден режим;
  • /setcommands – описание на командите.

В последната стъпка на конфигуриране ние описваме /help и /exchange. Когато всички стъпки са изпълнени, е време да преминете към кодирането.

Стъпка 3: Настройване и стартиране на бота

Нека създадем файл config.py. В него трябва да посочите уникалния код на бота и часовата зона, в която програмата ще намира информация.

ТОКЕН = '' # заменете с токена на вашия ботTIMEZONE = 'Европа/Киев' TIMEZONE_COMMON_NAME = 'Киев'

След това създаваме друг файл с импортирането на предварително написания pb.py, библиотеки и други необходими компоненти. Липсващите библиотеки се инсталират от системата за управление на пакети (pip).

import telebotimport configimport pbimport datetimeimport pytzimport jsonimport traceback P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = config.TIMEZONE_COMMON_NAME

Нека използваме съдържанието на pyTelegramBotApi, за да създадем бот. Изпращаме получения токен, като използваме следния код:

bot = telebot.TeleBot(config.TOKEN) bot.polling(none_stop=True)

Параметърът none_stop гарантира, че заявките се изпращат постоянно. Работата на параметъра няма да бъде засегната от грешки в метода.

Стъпка 4: Напишете манипулатора на команди /start

Ако всички предишни стъпки са направени правилно, ботът е започнал да работи. Програмата генерира заявки редовно, защото използва метода getUpdates. Преди реда с елемента none_stop се нуждаем от част от кода, който обработва командата /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Поздрави! Мога да ви покажа обменните курсове.n' + 'За да получите обменните курсове, натиснете / exchange.n' + 'За да получите помощ натиснете /help.' )

RџSЂRo commands=['start'] равно на True start_command се извиква. Съдържанието на съобщението отива там. След това трябва да внедрите функцията за изпращане_съобщение във връзка с конкретно съобщение.

Стъпка 5: Създайте манипулатор на команди /help

Командата /help може да се реализира като бутон. Щраквайки върху него, потребителят ще бъде отведен до акаунта на програмиста в Telegram. Дайте име на бутона, като например „Попитайте програмиста“. Задайте параметъра reply_markup, който пренасочва потребителя към връзка, за метода send_message. Нека напишем в кода параметъра, който създава клавиатурата (InlineKeyboardMarkup). Имате нужда само от един бутон (InlineKeyboardButton).

Крайният код на манипулатора на команди изглежда така:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Попитайте програмиста', url='ваша ссылка на профил' ) ) bot.send_message( message.chat.id, '1) За да получите списък с наличните валути, натиснете /exchange.n' + '2) Кликнете върху валутата, която ви интересува.n' + '3) Вие ще получи съобщение, съдържащо информация относно източника и целевите валути, ' + 'курсове за покупка и курсове за продажба.n' + '4) Щракнете върху „Актуализиране“, за да получите текущата информация относно заявката. ' + 'Ботът също ще покаже разликата между предишния и текущия обменен курс.n' + '5) Ботът поддържа inline. Тип @ във всеки чат и първите букви на валута.', reply_markup=клавиатура )

Действие на кода в чата на Telegram:

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Стъпка 6: Добавяне на манипулатора на команди /exchange

Тази стъпка е необходима за показване на бутони със символи на наличните валути в чата. Екранна клавиатура с опции ще ви помогне да избегнете грешки. PrivatBank предоставя информация за рублата, долара и еврото. Опцията InlineKeyboardButton работи по следния начин:

  1. Потребителят кликва върху бутона с желаното обозначение.
  2. getUpdates получава обратно извикване (CallbackQuery).
  3. Става известно как да се справите с натискането на клавиатурата - предава се информация за натиснатия бутон.

/обменен манипулатор код:

@bot.message_handler(commands=['exchange']) def exchange_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('USD', callback_data='get-USD') ) keyboard.row( telebot.types.InlineKeyboardButton('EUR', callback_data='get-EUR'), telebot.types.InlineKeyboardButton('RUR', callback_data='get-RUR') ) bot.send_message( message.chat .id, 'Щракнете върху валутата по избор:', reply_markup=клавиатура )

Резултатът от кода в Telegram:

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Стъпка 7: Написване на манипулатор за вградените бутони на клавиатурата

Пакетът pyTelegramBot Api съдържа функцията за декориране @bot.callback_query_handler. Този компонент е предназначен да преобразува обратното извикване във функция – API разгръща и пресъздава извикването. Изписва се така:

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query)

Нека напишем и метода get_ex_callback:

def get_ex_callback(query): bot.answer_callback_query(query.id) send_exchange_result(query.message, query.data[4:])

Има още един полезен метод – answer_callback_query. Помага за премахване на натоварването между натискането на бутона и показването на резултата на екрана. Можете да изпратите съобщение до send_exchange_query, като подадете код на валута и съобщение. Нека напишем send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'typing') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), reply_markup=get_update_keyboard(ex) ), parse_mode='HTML' )

Докато чатботът получава резултата от заявката от банката API, посетителят вижда надписа „написване на съобщение“. Изглежда, че отговаря истински човек. За да покажете такъв индикатор на екрана, ще трябва да добавите редове за състояние на въвеждане. След това ще използваме get_exchange - с негова помощ програмата ще получи обозначението на валутата (рубли, евро или долари). send_message използва допълнителни методи: serialize_ex преобразува валутата в друг формат, а get_update_keyboard настройва софтуерни клавиши, които актуализират информацията и изпращат данни за валутния пазар до други чатове.

Нека напишем кода за get_update_keyboard. Трябва да се споменат два бутона – t и e означават тип и обмен. Елементът switch_inline_query за бутона Споделяне е необходим, за да може потребителят да избира от няколко чатове. Посетителят ще може да избере на кого да изпрати текущия обменен курс на долара, рублата или еврото.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) върне клавиатурата

Понякога трябва да видите колко се е променил обменният курс за кратко време. Нека напишем два метода за бутона Актуализиране, така че потребителите да могат да виждат курсове в сравнение.

Разликата между обменните курсове се предава на сериализатора чрез параметъра diff.

Предписаните методи работят само след актуализиране на данните, те няма да повлияят на първото показване на курса.

def serialize_ex(ex_json, diff=None): резултат = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Купете: ' + ex_json['buy'] if diff: резултат += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Продайте: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: резултат = '(' + str(diff) + ' " src="https://sworg/images/core/emoji/2.3/svg/2197.svg">" src="https://sworg/images /core/emoji/72x72/2197.png">" src="https://sworg/images/core/emoji/72x72/2197.png">)' elif diff < 0: резултат = '(' + str( diff)[1:] + ' " src="https://sworg/images/core/emoji/2.3/svg/2198.svg">" src="https://sworg/images/core/emoji/72x72 /2198.png">" src="https://sworg/images/core/emoji/72x72/2198.png">)' връща резултат

Представете си, че посетителят иска да знае обменния курс на долара. Ето какво се случва, ако изберете USD в съобщението:

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Стъпка 8: Внедряване на манипулатора на бутона за актуализиране

Нека да напишем кода за обработка на действия с бутона Актуализиране и да добавим частта iq_callback_method към него. Когато програмните елементи започват с параметъра get, трябва да напишете get_ex_callback. В други ситуации анализираме JSON и се опитваме да получим ключа t.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback(query) с изключение на ValueError: пас

Ако t е равно на u, ще трябва да напишете програма за метода edit_message_callback. Нека разбием този процес стъпка по стъпка:

  1. Изтегляне на актуална информация за състоянието на валутния пазар (exchange_now = pb.get_exchange(data['c']).
  1. Писане на ново съобщение чрез сериализатор с разл.
  2. Добавяне на подпис (get_edited_signature).

Ако първоначалното съобщение не се промени, извикайте метода edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(data['c']) text = serialize_ex( exchange_now, get_exchange_diff(get_ex_from_iq_data(data), exchange_now ) ) + 'n' + get_edited_signature() if query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' ) elif query.inline_message_id : bot.edit_message_text( текст, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Нека напишем метода get_ex_from_iq_data за анализ на JSON:

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': exc_json['s'] }

Ще ви трябват още няколко метода: например get_exchange_diff, който чете старата и новата информация за цената на валутите и показва разликата.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(now['buy']) - float(last['buy']))) }

Последният, get_edited_signature, показва времето, когато курсът е последно актуализиран.

def get_edited_signature(): връщане 'Актуализиран ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + '(' + TIMEZONE_COMMON_NAME + ')'

В резултат на това актуализираното съобщение от бота със стабилен обменен курс изглежда така:

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Когато курсът се промени, разликите между стойностите се показват в съобщението поради предписаните параметри.

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Стъпка 9: Внедряване на вграден режим

Вграденият режим е необходим за бързо изпращане на информация от програмата към всеки чат - сега не е необходимо да добавяте бот към разговора като участник. Когато потребител на Telegram въведе име на бот със знак @ пред него, опциите за преобразуване трябва да се появят над реда за въвеждане. Ако щракнете върху един от елементите, ботът ще изпрати съобщение до разговора с резултатите и бутоните за актуализиране и изпращане на данни. Името на подателя ще съдържа надписа „чрез ".

InlineQuery се предава на query_text чрез библиотеката. Кодът използва функцията answer_line за извличане на резултатите от търсенето като масив от данни и елемента inline_query_id. Използваме get_exchanges, така че ботът да намира няколко валути при поискване.

@bot.inline_handler(func=lambda query: True) def query_text(inline_query): bot.answer_inline_query(inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Предаваме масив от данни на get_iq_articles, за да върнем обекти от InlineQueryResultArticle чрез този метод.

def get_iq_articles(exchanges): result = [] for exc in exchanges: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputTextMessageContent (serialize_ex(exc), parse_mode='HTML'), reply_markup=get_update_keyboard(exc), description='Convert ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) върнат резултат

Сега, ако напишете @ и интервал в реда, на екрана ще се появят резултатите от търсенето – опции за конвертиране в три налични валути.

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Потребителите могат да филтрират резултатите, като въведат желаната валута.

След като щракнете върху желаната валута от списъка, чатът получава същото съобщение, което получават потребителите на бота. Можете също да използвате бутона Актуализиране. Изображението по-долу показва актуализираното съобщение, изпратено чрез бота:

Telegram бот в Python. Пълно ръководство за писане на бот с обменни курсове от нулата

Заключение

Сега знаете как да създадете бот за Telegram. Можете да добавите полезни инструменти към вашата програма: бутони за актуализиране и изпращане на резултата до други потребители на месинджъра и вграден режим, който ви позволява да използвате функциите на бота извън чата с него. Въз основа на тази инструкция можете да създадете всеки прост бот с други функции - не само този, който ще показва валутни курсове. Не се страхувайте да експериментирате с библиотеки, API и код, за да създадете автоматизиран асистент, който ще разговаря с клиенти в Telegram и ще укрепва връзката на заинтересованите хора с компанията.

Как 1

  1. Фантастична публикация

Оставете коментар