Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Bots in Telegram is programme wat help om kontak met die gehoor te bewerkstellig of aksies wat voorheen met die hand uitgevoer moes word, te vereenvoudig. Hierdie programme is spesifiek vir die messenger-platform geskryf. Bots werk op hierdie manier: die gebruiker stuur 'n opdrag deur die invoerlyn, en die stelsel reageer met 'n teks of interaktiewe boodskap. Soms boots die program selfs die optrede van 'n regte persoon na - so 'n bot wek meer vertroue onder kliënte.

Daar is verskeie tipes stelsels vir outomatiese bystand aan gebruikers. Sommige bots kommunikeer net met kliënte, ander verskaf gereeld inligting. Dit is onmoontlik om programme duidelik in tipes te verdeel - ontwikkelaars kombineer dikwels verskeie funksies in een bot.

Jy kan 'n eenvoudige bot vir Telegram skryf met interaktiewe elemente in die vorm van knoppies op die skerm in 9 stappe. Kom ons kyk na elkeen van hulle in detail en beantwoord 'n paar vrae:

  • hoe om 'n bot te begin;
  • hoe om 'n ingeboude sleutelbord vanaf een of meer knoppies te registreer;
  • hoe om die knoppies vir die verlangde funksies te programmeer;
  • wat is inlynmodus en hoe om dit op te stel vir 'n bestaande bot.

Stap 0: teoretiese agtergrond oor die Telegram bots API

Die hoofinstrument wat gebruik word om Telegram-bots te skep, is die HTML-toepassingsprogrammeringskoppelvlak, of HTML API. Hierdie element aanvaar besoekersversoeke en stuur antwoorde in die vorm van inligting. Klaargemaakte ontwerpe vereenvoudig die werk aan die program. Om 'n bot vir Telegram te skryf, moet jy hierdie e-posadres gebruik: https://api.telegram.org/bot/METHOD_NAME

Vir die korrekte funksionering van die bot is 'n teken ook nodig - 'n kombinasie van karakters wat die program beskerm en toegang daartoe vir vertroude ontwikkelaars oopmaak. Elke teken is uniek. Die string word aan die bot toegewys wanneer dit geskep word. Metodes kan anders wees: getUpdates, getChat en ander. Die keuse van metode hang af van watter algoritme die ontwikkelaars van die bot verwag. Token voorbeeld:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots gebruik GET- en POST-versoeke. Metodeparameters moet dikwels aangevul word – byvoorbeeld wanneer die sendMessage-metode veronderstel is om die klets-ID en 'n bietjie teks te stuur. Parameters vir metodeverfyning kan as 'n URL-navraagstring deurgegee word deur application/x-www-form-urlencoded of via application-json te gebruik. Hierdie metodes is nie geskik vir die aflaai van lêers nie. UTF-8-kodering word ook vereis. Deur 'n versoek na die API te stuur, kan jy die resultaat in JSON-formaat kry. Kyk na die program se reaksie op die herwinning van inligting via die getME-metode:

KRY https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Exchange Rate Bot", gebruikernaam: "exchangetestbot" } }

Die resultaat sal verkry word as ok gelyk waar. Andersins sal die stelsel 'n fout aandui.

Daar is twee maniere om persoonlike boodskappe in bots te kry. Beide metodes is effektief, maar is geskik in verskillende gevalle. Om boodskappe te kry, kan jy met die hand 'n versoek skryf met die getUpdates-metode - die program sal die Update-dataskikking op die skerm vertoon. Versoeke moet gereeld gestuur word, na die ontleding van elke skikking, word versending herhaal. Offset is 'n parameter wat die aantal oorgeslaande rekords bepaal voordat 'n nuwe resultaat gelaai word om die herverskyning van gemerkte voorwerpe te vermy. Die voordele van die getUpdates-metode sal ter sprake kom as:

  • daar is geen manier om HTTPS op te stel nie;
  • komplekse skriftale word gebruik;
  • die botbediener verander van tyd tot tyd;
  • die bot is gelaai met gebruikers.

Die tweede metode wat geskryf kan word om gebruikersboodskappe te ontvang, is setWebhook. Dit word een keer gebruik, nie nodig om voortdurend nuwe versoeke te stuur nie. Die webhook stuur data-opdaterings na die gespesifiseerde URL. Hierdie metode vereis 'n SSL-sertifikaat. Webhook sal nuttig wees in hierdie gevalle:

  • webprogrammeertale word gebruik;
  • die bot is nie oorlaai nie, daar is nie te veel gebruikers nie;
  • die bediener verander nie, die program bly vir 'n lang tyd op dieselfde bediener.

In verdere instruksies sal ons getUpdates gebruik.

Die @BotFather Telegram-diens is ontwerp om kletsbots te skep. Basiese instellings word ook deur hierdie stelsel gestel – BotFather sal jou help om 'n beskrywing te maak, 'n profielfoto te plaas, ondersteuningsnutsgoed by te voeg. Biblioteke – stelle HTML-versoeke vir Telegram-bots – is op die internet beskikbaar, daar is nogal baie van hulle. By die skep van die voorbeeldprogram is pyTelegramBotApi gebruik.

Stap 1: Implementering van Wisselkoersversoeke

Eerstens moet jy die kode skryf wat navrae uitvoer. Ons sal gebruik wanneer ons die PrivatBank API skryf, hieronder is 'n skakel daarna: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Jy moet hierdie metodes in jou kode gebruik:

  • load_exchange – vind wisselkoerse en vertoon geënkodeerde inligting;
  • get_exchange - vertoon data oor 'n spesifieke geldeenheid;
  • get_exchanges – toon die lys van geldeenhede volgens die monster.

As gevolg hiervan lyk die kode in die pb.py-lêer so:

invoer her invoerversoeke invoer json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): gee terug json.loads(requests.get(URL).text) def get_exchange(ccy_key) ): vir exc in load_exchange(): as ccy_key == exc['ccy']: gee terug exc return Onwaar def get_exchanges(ccy_pattern): resultaat = [] ccy_pattern = re.escape(ccy_pattern) + '.*' vir exc in load_exchange(): as re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nie Geen is nie: result.append(exc) gee resultaat terug

Die program kan die volgende antwoord op die gespesifiseerde versoeke uitreik:

[ { ccy:"USD", base_ccy:"UAH", koop:"25.90000", uitverkoping:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", koop:"29.10000", uitverkoping:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", koop:"0.37800", koop:"0.41800" }, {ccy:"BTC", base_ccy:"USD", koop:"11220.0384", verkoop: "12401.0950" } ]

Stap 2: Skep 'n Telegram Bot met @BotFather

Jy kan 'n program skep om boodskappe te ontvang en daarop te reageer deur die @BotFather-diens te gebruik. Gaan na sy Telegram-bladsy en voer die /newbot-opdrag in. Instruksies sal in die klets verskyn, waarvolgens jy eers die naam van die bot moet neerskryf, en dan sy adres. Wanneer die bot-rekening geskep word, sal 'n welkome boodskap met 'n teken op die skerm verskyn. Vir verdere konfigurasie, gebruik hierdie opdragte:

  • /setbeskrywing – beskrywing;
  • /setabouttext – inligting oor die nuwe bot;
  • /setuserpic – profielfoto;
  • /setinline – inlynmodus;
  • /setcommands – beskrywing van opdragte.

By die laaste konfigurasiestap beskryf ons /help en /exchange. Wanneer al die stappe voltooi is, is dit tyd om aan te gaan na kodering.

Stap 3: Stel die bot op en begin

Kom ons skep 'n config.py-lêer. Daarin moet u die unieke bot-kode en die tydsone spesifiseer waarin die program inligting sal vind.

TOKEN = '' # vervang met jou bot se tokenTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Vervolgens skep ons nog 'n lêer met die invoer van die voorheen geskrewe pb.py, biblioteke en ander nodige komponente. Die ontbrekende biblioteke word vanaf die pakketbestuurstelsel (pip) geïnstalleer.

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

Kom ons gebruik die inhoud van pyTelegramBotApi om 'n bot te skep. Ons stuur die ontvangde token deur die volgende kode te gebruik:

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

Die none_stop-parameter verseker dat versoeke voortdurend gestuur word. Die werking van die parameter sal nie deur metodefoute beïnvloed word nie.

Stap 4: Skryf die /start Command Handler

As al die vorige stappe korrek gedoen is, het die bot begin werk. Die program genereer gereeld versoeke omdat dit die getUpdates-metode gebruik. Voor die reël met die none_stop-element, benodig ons 'n stukkie kode wat die /start-opdrag verwerk:

@bot.message_handler(commands=['begin']) def start_command(boodskap): bot.send_message( message.chat.id, 'Groete! Ek kan jou wisselkoerse wys.n' + 'Om die wisselkoerse te kry, druk / exchange.n' + 'Om hulp te kry, druk /help.')

RџSЂRё commands=['begin'] gelyk aan Waar start_command word genoem. Die inhoud van die boodskap gaan daarheen. Vervolgens moet u die stuurfunksie implementeer_boodskap met betrekking tot 'n bepaalde boodskap.

Stap 5: Skep 'n /help Command Handler

Die /help-opdrag kan as 'n knoppie geïmplementeer word. Deur daarop te klik, sal die gebruiker na die ontwikkelaar se Telegram-rekening geneem word. Gee die knoppie 'n naam, soos "Vra die ontwikkelaar". Stel die reply_markup-parameter, wat die gebruiker na 'n skakel herlei, vir die send_message-metode. Kom ons skryf in die kode die parameter wat die sleutelbord skep (InlineKeyboardMarkup). Jy benodig net een knoppie (InlineKeyboardButton).

Die finale opdrag hanteerder kode lyk soos volg:

@bot.message_handler(commands=['help']) def help_command(boodskap): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Vra die ontwikkelaar', url='ваша ссылка профиль' ) ) bot.send_message( message.chat.id, '1) Om 'n lys van beskikbare geldeenhede te ontvang, druk /exchange.n' + '2) Klik op die geldeenheid waarin jy belangstel.n' + '3) Jy sal 'n boodskap ontvang wat inligting bevat rakende die bron en die teikengeldeenhede, ' + 'koopkoerse en verkoopkoerse.n' + '4) Klik "Update" om die huidige inligting rakende die versoek te ontvang. ' + 'Die bot sal ook die verskil tussen die vorige en die huidige wisselkoerse wys.n' + '5) Die bot ondersteun inlyn. Tik @ in enige klets en die eerste letters van 'n geldeenheid.', reply_markup=sleutelbord )

Kode-aksie in Telegram-klets:

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Stap 6: Voeg die /exchange Command Handler by

Hierdie stap is nodig om knoppies met simbole van beskikbare geldeenhede in die klets te vertoon. ’n Sleutelbord op die skerm met opsies sal jou help om foute te vermy. PrivatBank verskaf inligting oor die roebel, dollar en euro. Die InlineKeyboardButton-opsie werk soos volg:

  1. Die gebruiker klik op die knoppie met die verlangde benaming.
  2. getUpdates ontvang 'n terugbel (CallbackQuery).
  3. Dit word bekend hoe om die druk van die sleutelbord te hanteer - inligting oor die gedrukte knoppie word versend.

/exchange hanteerder kode:

@bot.message_handler(commands=['exchange']) def exchange_command(boodskap): sleutelbord = 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, 'Klik op die geldeenheid van keuse:', reply_markup=sleutelbord )

Die resultaat van die kode in Telegram:

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Stap 7: Skryf 'n hanteerder vir die ingeboude sleutelbordknoppies

Die pyTelegramBot Api-pakket bevat die @bot.callback_query_handler-versierderfunksie. Hierdie komponent is ontwerp om die terugbel in 'n funksie te vertaal - die API ontvou en herskep die oproep. Dit word so gespel:

@bot.callback_query_handler(func=lambda-oproep: Waar) def iq_callback(navraag): data = query.data as data.startswith('get-'): get_ex_callback(navraag)

Kom ons skryf ook die get_ex_callback metode:

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

Daar is nog 'n nuttige metode - answer_callback_query. Dit help om die las te verwyder tussen die druk van die knoppie en die vertoon van die resultaat op die skerm. Jy kan 'n boodskap stuur na send_exchange_query deur 'n geldeenheidkode en Boodskap deur te gee. Kom ons skryf send_exchange_result:

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

Terwyl die kletsbot die resultaat van die versoek van die bank ontvang API, sien die besoeker die inskripsie "tik 'n boodskap". Dit lyk of 'n regte persoon antwoord. Om so 'n aanwyser op die skerm te vertoon, sal jy invoerstatuslyne moet byvoeg. Vervolgens sal ons get_exchange gebruik - met sy hulp sal die program die geldeenheid-benaming (roebels, euro's of dollars) ontvang. send_message gebruik bykomende metodes: serialize_ex skakel die geldeenheid om na 'n ander formaat, en get_update_keyboard stel sagtesleutels op wat inligting opdateer en valutamarkdata na ander geselsies stuur.

Kom ons skryf die kode vir get_update_keyboard. Twee knoppies moet genoem word – t en e staan ​​vir tik en ruil. Die switch_inline_query-item vir die Deel-knoppie is nodig sodat die gebruiker uit verskeie kletse kan kies. Die besoeker sal kan kies aan wie om die huidige wisselkoers van die dollar, roebel of euro te stuur.

def get_update_keyboard(ex): sleutelbord = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['koop'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Deel', switch_inline_query=ex['ccy']) ) sleutelbord terug

Soms moet jy sien hoeveel die wisselkoers in 'n kort tyd verander het. Kom ons skryf twee metodes vir die Update-knoppie sodat gebruikers kursusse in vergelyking kan sien.

Die verskil tussen die wisselkoerse word deur die diff-parameter na die serializer deurgegee.

Die voorgeskrewe metodes werk slegs nadat die data opgedateer is, dit sal nie die eerste vertoning van die kursus beïnvloed nie.

def serialize_ex(ex_json, diff=Geen): resultaat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Koop: ' + ex_json['koop'] as verskil: resultaat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Verkoop: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: resultaat += 'nSell: ' + ex_json['sale'] + 'n' gee resultaat def serialize_exchange_diff(diff): resultaat = '' as verskil > 0: resultaat = '(' + 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: resultaat = '(' + str( verskil)[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">)' terugkeerresultaat

Stel jou voor dat die besoeker die dollarwisselkoers wou weet. Hier is wat gebeur as jy USD in die boodskap kies:

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Stap 8: Implementering van die Update Button Manager

Kom ons skryf die kode vir die hantering van aksies met die Update-knoppie en voeg die iq_callback_method-deel daarby. Wanneer programitems met die get-parameter begin, moet jy get_ex_callback skryf. In ander situasies ontleed ons JSON en probeer om die sleutel t te kry.

@bot.callback_query_handler(func=lambda-oproep: Waar) def iq_callback(navraag): data = query.data if data.startswith('get-'): get_ex_callback(query) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback (navraag) behalwe ValueError: slaag

As t gelyk is aan u, sal jy 'n program moet skryf vir die edit_message_callback metode. Kom ons breek hierdie proses stap vir stap af:

  1. Laai van bygewerkte inligting oor die stand van die valutamark af (exchange_now = pb.get_exchange(data['c']).
  1. Skryf 'n nuwe boodskap deur 'n serializer met verskil.
  2. Voeg 'n handtekening by (get_edited_signature).

As die aanvanklike boodskap nie verander nie, roep die edit_message_text metode.

def edit_message_callback(navraag): 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() as query.message: bot.edit_message_text(text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='line_HTML'query.inlif : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Kom ons skryf die get_ex_from_iq_data metode om JSON te ontleed:

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

Jy sal nog 'n paar metodes nodig hê: byvoorbeeld get_exchange_diff, wat die ou en nuwe inligting oor die koste van geldeenhede lees en die verskil vertoon.

def get_exchange_diff(laaste, nou): return { 'sale_diff': float("%.6f" % (float(nou['sale']) - float(laaste['sale']))), 'buy_diff': float ("%.6f" % (float(nou['koop']) - float(laaste['koop']))) }

Die laaste een, get_edited_signature, wys die tyd waarop die kursus laas opgedateer is.

def get_edited_signature(): gee terug 'Opgedateer ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

As gevolg hiervan lyk die opgedateerde boodskap van die bot met 'n stabiele wisselkoers soos volg:

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Wanneer die kursus verander, word die verskille tussen die waardes in die boodskap vertoon as gevolg van die voorgeskrewe parameters.

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Stap 9: Embedded Mode Implementering

Die ingeboude modus is nodig om inligting vinnig vanaf die program na enige klets te stuur – nou hoef jy nie 'n bot by die gesprek as deelnemer te voeg nie. Wanneer 'n Telegram-gebruiker 'n botnaam met 'n @-teken voor dit invoer, moet omskakelingsopsies bo die invoerlyn verskyn. As jy op een van die items klik, sal die bot 'n boodskap na die gesprek stuur met die resultate en knoppies vir die opdatering en stuur van data. Die sender se naam sal die byskrif "via ".

InlineQuery word deur die biblioteek na query_text gestuur. Die kode gebruik die antwoordlyn-funksie om die soekresultate as 'n verskeidenheid data en die inline_query_id-element te herwin. Ons gebruik get_exchanges sodat die bot verskeie geldeenhede op versoek vind.

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

Ons gee 'n verskeidenheid data deur na get_iq_articles om voorwerpe van InlineQueryResultArticle deur hierdie metode terug te stuur.

def get_iq_articles(exchanges): resultaat = [] vir exc in ruilings: 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='Skakel ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) resultaat gee

Nou, as jy @ skryf en 'n spasie in die reël, sal die soekresultate op die skerm verskyn – opsies vir omskakeling in drie beskikbare geldeenhede.

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Gebruikers kan die resultate filter deur die gewenste geldeenheid in te voer.

Nadat u op die verlangde geldeenheid uit die lys geklik het, ontvang die klets dieselfde boodskap wat botgebruikers ontvang. Jy kan ook die Update-knoppie gebruik. Die prent hieronder toon die opgedateerde boodskap wat via die bot gestuur is:

Telegram bot in Python. 'N Volledige gids vir die skryf van 'n bot met wisselkoerse van nuuts af

Gevolgtrekking

Nou weet jy hoe om 'n bot vir Telegram te skep. U kan nuttige gereedskap by u program voeg: knoppies om die resultaat op te dateer en na ander gebruikers van die boodskapper te stuur en 'n ingeboude modus waarmee u die funksies van die bot buite die klets daarmee kan gebruik. Op grond van hierdie instruksie kan jy enige eenvoudige bot met ander funksies skep - nie net die een wat wisselkoerse sal wys nie. Moenie bang wees om met biblioteke, API's en kode te eksperimenteer om 'n outomatiese assistent te skep wat met kliënte op Telegram sal gesels en die verbinding van belangstellendes met die maatskappy sal versterk nie.

1 Kommentaar

  1. Fantastiese publikasie

Lewer Kommentaar