Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Ботовите во Telegram се програми кои помагаат да се воспостави контакт со публиката или да се поедностават дејствијата што претходно требаше да се извршат рачно. Овие програми се напишани специјално за платформата за месинџер. Ботовите работат на овој начин: корисникот испраќа команда преку линијата за внесување, а системот одговара со текстуална или интерактивна порака. Понекогаш програмата дури и имитира постапки на вистинска личност - таков бот инспирира поголема доверба кај клиентите.

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

Можете да напишете едноставен бот за Telegram со интерактивни елементи во форма на копчиња на екранот во 9 чекори. Ајде да го разгледаме секој од нив детално и да одговориме на неколку прашања:

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

Чекор 0: теоретска позадина за АПИ-то на ботови на Telegram

Главната алатка што се користи за креирање на ботови на Telegram е интерфејсот за програмирање на апликации HTML, или HTML API. Овој елемент ги прифаќа барањата на посетителите и испраќа одговори во форма на информации. Готови дизајни ја поедноставуваат работата на програмата. За да напишете бот за Telegram, треба да ја користите оваа адреса на е-пошта: https://api.telegram.org/bot/METHOD_NAME

За правилно функционирање на ботот, потребен е и токен - комбинација на знаци што ја штити програмата и отвора пристап до неа на доверливи програмери. Секој токен е уникатен. Низата му се доделува на ботот при креирањето. Методите можат да бидат различни: getUpdates, getChat и други. Изборот на метод зависи од тоа каков алгоритам очекуваат програмерите од ботот. Токен пример:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Ботовите користат GET и POST барања. Параметрите на методот честопати треба да се дополнат - на пример, кога методот sendMessage треба да испрати ID на разговор и одреден текст. Параметрите за усовршување на методот може да се пренесат како низа за барање на URL-адреса со користење на апликација/x-www-form-urlencoded или преку апликација-json. Овие методи не се погодни за преземање датотеки. Потребно е и UTF-8 кодирање. Со испраќање барање до API, можете да го добиете резултатот во JSON формат. Погледнете го одговорот на програмата за преземање информации преку методот getME:

ДОБИЈ https://api.telegram.org/bot/getMe{ во ред: точно, резултат: { 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 изгледа вака:

увоз за повторно увоз барања за увоз json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): врати json.loads(requests.get(URL).text) def get_exchange(ccy_key ): за exc во load_exchange(): if ccy_key == exc['ccy']: return exc return Неточно def get_exchanges(cccy_pattern): резултат = [] ccy_pattern = re.escape(cccy_pattern) + '.*' за exc во load_exchange(): ако re.match(ccy_pattern, exc['cccy'], re.IGNORECASE) не е Нема: result.append(exc) врати резултат

Програмата може да го издаде следниов одговор на наведените барања:

[ { ccy:"USD", base_ccy:"UAH", buy:"25.90000", sale:"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: Создадете Телеграм Бот со @BotFather

Можете да креирате програма за примање пораки и одговарање на нив користејќи ја услугата @BotFather. Одете на неговата страница Телеграма и внесете ја командата /newbot. Во разговорот ќе се појават инструкции според кои прво треба да го запишете името на ботот, а потоа и неговата адреса. Кога ќе се креира сметката за бот, на екранот ќе се појави порака за добредојде што содржи токен. За понатамошна конфигурација, користете ги овие команди:

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

На последниот чекор за конфигурација, ги опишуваме /help и /exchange. Кога ќе се завршат сите чекори, време е да преминете на кодирање.

Чекор 3: Поставување и стартување на ботот

Ајде да создадеме датотека config.py. Во него, треба да го наведете уникатниот бот код и временската зона во која програмата ќе најде информации.

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

Следно, креираме друга датотека со увоз на претходно напишаното pb.py, библиотеки и други потребни компоненти. Библиотеките што недостасуваат се инсталирани од системот за управување со пакети (pip).

увези telebotimport конфигуримпорт pbimport датумвремеувоз pytzimport jsonimport следење P_TIMEZONE = pytz.timezone(config.TIMEZONE) TIMEZONE_COMMON_NAME = конфиг.TIMEZONE_COMMON_NAME

Ајде да ја искористиме содржината на pyTelegramBotApi за да создадеме бот. Го испраќаме примениот токен користејќи го следниов код:

бот = телебот ТелеБот (конфиг. ТОКЕН) бот. анкета (не_стоп = Точно)

Параметарот none_stop гарантира дека барањата постојано се испраќаат. Работењето на параметарот нема да биде под влијание на грешки во методот.

Чекор 4: Напишете го управувачот со команди /start

Ако сите претходни чекори се направени правилно, ботот почна да работи. Програмата редовно генерира барања бидејќи го користи методот getUpdates. Пред линијата со елементот none_stop, ни треба парче код што ја обработува командата /start:

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

RџSЂRё команди=['почеток'] еднакво на Точно се повикува start_command. Содржината на пораката оди таму. Следно, треба да ја имплементирате функцијата за испраќање_порака во однос на одредена порака.

Чекор 5: Креирајте /help Ракувач со команди

Командата /help може да се имплементира како копче. Со кликнување на него, корисникот ќе биде однесен на сметката на Telegram на развивачот. Дајте му име на копчето, како на пример „Прашајте го развивачот“. Поставете го параметарот reply_markup, кој го пренасочува корисникот на врска, за методот send_message. Да го напишеме во кодот параметарот што ја креира тастатурата (InlineKeyboardMarkup). Потребно ви е само едно копче (InlineKeyboardButton).

Конечниот код на управувачот со команди изгледа вака:

@bot.message_handler(commands=['помош']) def help_command(порака): тастатура = 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=keyboard )

Дејство на кодот во разговорот на Телеграма:

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Чекор 6: Додавање на управувачот со команди /exchange

Овој чекор е потребен за прикажување копчиња со симболи на достапни валути во разговорот. Тастатурата на екранот со опции ќе ви помогне да избегнете грешки. PrivatBank обезбедува информации за рубљата, доларот и еврото. Опцијата InlineKeyboardButton работи вака:

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

/шифра на ракувач за размена:

@bot.message_handler(commands=['exchange']) def exchange_command(порака): тастатура = 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=тастатура )

Резултатот од кодот во Телеграма:

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Чекор 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 (прашање)

Ајде да го напишеме и методот get_ex_callback:

def get_ex_callback(прашање): 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(порака, 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=getboard_exdate_ ), 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 ('Сподели', switch_inline_query=ex['ccy']) ) тастатура за враќање

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

Разликата помеѓу девизните курсеви се пренесува до серијализаторот преку параметарот diff.

Пропишаните методи работат само по ажурирањето на податоците, тие нема да влијаат на првото прикажување на курсот.

def serialize_ex(ex_json, diff=Никој): резултат = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Купи: ' + ex_json['купи'] ако се разликува: резултат += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Продава: ' + ex_json['продажба'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' other: result += 'nSell: ' + ex_json['sale'] + 'n' врати резултат def serialize_exchange_diff(diff): резултат = '' ако се разликува > 0: резултат = '(' + str(разлика) + ' " 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: result = '(' + str( разлика)[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 во пораката:

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Чекор 8: Имплементирање на управувачот со копчињата за ажурирање

Ајде да го напишеме кодот за ракување со дејствата со копчето Update и да го додадеме делот iq_callback_method на него. Кога ставките на програмата започнуваат со параметарот get, мора да напишете get_ex_callback. Во други ситуации, го анализираме JSON и се обидуваме да го добиеме клучот t.

@bot.callback_query_handler(func=lambda повик: Точно) def iq_callback(query): data = query.data if data.startswith('get-'): get_ex_callback(прашање) друго: обидете се: ако json.loads(податоци)[ 't'] == 'u': edit_message_callback(прашање) освен ValueError: помине

Ако t е еднакво на u, ќе треба да напишете програма за методот edit_message_callback. Ајде да го разложиме овој процес чекор по чекор:

  1. Преземање ажурирани информации за состојбата на девизниот пазар (exchange_now = pb.get_exchange(data['c']).
  1. Пишување нова порака преку серијализатор со diff.
  2. Додавање потпис (get_edited_signature).

Ако почетната порака не се промени, повикајте го методот edit_message_text.

def edit_message_callback(query): data = json.loads(query.data)['e'] exchange_now = pb.get_exchange(податоци['c']) text = serialize_ex( exchange_now, get_exchange_diff( get_ex_from_iq_data (owda)), размена на_) + 'n' + get_edited_signature() ако query.порака: bot.edit_message_text(текст, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTMLidsage. : 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): врати { 'купи': exc_json['b'], 'продажба': exc_json['s'] }

Ќе ви требаат уште неколку методи: на пример, get_exchange_diff, кој ги чита старите и новите информации за цената на валутите и ја прикажува разликата.

def get_exchange_diff(последно, сега): врати { 'sale_diff': float("%.6f" % (float(now['sale']) - float(last['sale']))), 'buy_diff': float ("%.6f" % (float(сега['купи']) - float(последно['купи']))) }

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

def get_edited_signature(): врати 'Ажурирано ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

Како резултат на тоа, ажурираната порака од ботот со стабилен девизен курс изгледа вака:

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Кога курсот се менува, разликите помеѓу вредностите се прикажуваат во пораката поради пропишаните параметри.

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Чекор 9: Имплементација на вграден режим

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

InlineQuery се пренесува на query_text преку библиотеката. Кодот ја користи функцијата answer_line за да ги врати резултатите од пребарувањето како низа од податоци и елементот inline_query_id. Ние користиме get_exchanges така што ботот наоѓа неколку валути на барање.

@bot.inline_handler(func=lambda барање: Точно) 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 = [] за exc во размена: result.append( telebot.types.InlineQueryResultArticle( id=exc['ccy'], title=exc['ccy'], input_message_content=telebot.types.InputContents ( serialize_ex(exc), parse_mode='HTML' ), reply_markup=get_update_keyboard(exc), description='Конвертирај ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) повратен резултат

Сега, ако напишете @ и празно место во линијата, на екранот ќе се појават резултатите од пребарувањето – опции за конвертирање во три достапни валути.

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Корисниците можат да ги филтрираат резултатите со внесување на саканата валута.

Откако ќе кликнете на саканата валута од списокот, разговорот ја добива истата порака што ја добиваат корисниците на бот. Можете исто така да го користите копчето Ажурирај. Сликата подолу ја прикажува ажурираната порака испратена преку ботот:

Телеграма бот во Пајтон. Комплетен водич за пишување бот со девизни курсеви од нула

Заклучок

Сега знаете како да креирате бот за Telegram. Можете да додадете корисни алатки во вашата програма: копчиња за ажурирање и испраќање на резултатот до други корисници на гласникот и вграден режим што ви овозможува да ги користите функциите на ботот надвор од разговорот со него. Врз основа на оваа инструкција, можете да креирате кој било едноставен бот со други функции - не само оној што ќе ги прикажува девизните курсеви. Не плашете се да експериментирате со библиотеки, API и кодови за да создадете автоматизиран асистент кој ќе разговара со клиентите на Telegram и ќе ја зајакне врската на заинтересираните луѓе со компанијата.

1 коментар

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

Оставете Одговор