Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Bots i Telegram er programmer, der hjælper med at etablere kontakt til publikum eller forenkle handlinger, der tidligere skulle udføres manuelt. Disse programmer er skrevet specifikt til messenger-platformen. Bots fungerer på denne måde: Brugeren sender en kommando gennem inputlinjen, og systemet svarer med en tekst eller interaktiv besked. Nogle gange efterligner programmet endda handlingerne fra en rigtig person - sådan en bot inspirerer mere tillid blandt kunderne.

Der findes flere typer systemer til automatisk assistance til brugere. Nogle bots kommunikerer bare med kunder, andre giver regelmæssigt information. Det er umuligt klart at opdele programmer i typer - udviklere kombinerer ofte flere funktioner i en bot.

Du kan skrive en simpel bot til Telegram med interaktive elementer i form af knapper på skærmen i 9 trin. Lad os se på hver af dem i detaljer og besvare et par spørgsmål:

  • hvordan man starter en bot;
  • hvordan man registrerer et indbygget tastatur fra en eller flere knapper;
  • hvordan man programmerer knapperne til de ønskede funktioner;
  • hvad er inline-tilstand, og hvordan man sætter det op for en eksisterende bot.

Trin 0: teoretisk baggrund om Telegram bots API

Det vigtigste værktøj, der bruges til at oprette Telegram-bots, er HTML Application Programming Interface eller HTML API. Dette element accepterer besøgendes anmodninger og sender svar i form af information. Færdiglavede designs forenkler arbejdet med programmet. For at skrive en bot til Telegram skal du bruge denne e-mailadresse: https://api.telegram.org/bot/METHOD_NAME

For at botten skal fungere korrekt, er der også brug for et token - en kombination af tegn, der beskytter programmet og åbner adgang til det for betroede udviklere. Hvert token er unikt. Strengen tildeles botten ved oprettelse. Metoder kan være forskellige: getUpdates, getChat og andre. Valget af metode afhænger af, hvilken algoritme udviklerne forventer af botten. Token eksempel:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots bruger GET- og POST-anmodninger. Metodeparametre skal ofte suppleres – for eksempel når sendMessage-metoden skal sende chat-id'et og noget tekst. Parametre for metodeforfining kan sendes som en URL-forespørgselsstreng ved hjælp af application/x-www-form-urlencoded eller via application-json. Disse metoder er ikke egnede til at downloade filer. UTF-8-kodning er også påkrævet. Ved at sende en anmodning til API'et kan du få resultatet i JSON-format. Tag et kig på programmets svar på at hente information via getME-metoden:

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

Resultatet vil blive opnået, hvis ok lige med sand. Ellers vil systemet indikere en fejl.

Der er to måder at få tilpassede beskeder i bots. Begge metoder er effektive, men er velegnede i forskellige tilfælde. For at få beskeder kan du manuelt skrive en anmodning med getUpdates-metoden – programmet viser opdateringsdataarrayet på skærmen. Forespørgsler skal sendes regelmæssigt, efter at have analyseret hvert array gentages afsendelsen. Offset er en parameter, der bestemmer antallet af oversprungne poster, før et nyt resultat indlæses for at undgå, at kontrollerede objekter dukker op igen. Fordelene ved getUpdates-metoden kommer i spil, hvis:

  • der er ingen måde at konfigurere HTTPS på;
  • komplekse scriptsprog bruges;
  • bot-serveren ændrer sig fra tid til anden;
  • botten er indlæst med brugere.

Den anden metode, der kan skrives til at modtage brugermeddelelser, er setWebhook. Det bruges én gang, ingen grund til konstant at sende nye anmodninger. Webhook'en sender dataopdateringer til den angivne URL. Denne metode kræver et SSL-certifikat. Webhook vil være nyttig i disse tilfælde:

  • der bruges webprogrammeringssprog;
  • botten er ikke overbelastet, der er ikke for mange brugere;
  • serveren ændres ikke, programmet forbliver på den samme server i lang tid.

I yderligere instruktioner vil vi bruge getUpdates.

@BotFather Telegram-tjenesten er designet til at oprette chatbots. Grundlæggende indstillinger indstilles også gennem dette system - BotFather hjælper dig med at lave en beskrivelse, sætte et profilbillede, tilføje supportværktøjer. Biblioteker - sæt HTML-anmodninger til Telegram-bots - er tilgængelige på internettet, der er en hel del af dem. Ved oprettelse af eksempelprogrammet blev pyTelegramBotApi brugt.

Trin 1: Implementering af valutakursanmodninger

Først skal du skrive koden, der udfører forespørgsler. Vi vil bruge, når vi skriver PrivatBank API, nedenfor er et link til det: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Du skal bruge disse metoder i din kode:

  • load_exchange – finder valutakurser og viser kodet information;
  • get_exchange – viser data om en bestemt valuta;
  • get_exchanges – viser listen over valutaer i henhold til prøven.

Som et resultat ser koden i filen pb.py sådan ud:

import re import requests import json URL = 'https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5' def load_exchange(): returner json.loads(requests.get(URL).text) def get_exchange(ccy_key) ): for exc i load_exchange(): hvis ccy_key == exc['ccy']: returner exc return False def get_exchanges(ccy_pattern): resultat = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc i load_exchange(): hvis re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) ikke er Ingen: result.append(exc) returnerer resultat

Programmet kan udstede følgende svar på de angivne anmodninger:

[ { ccy:"USD", base_ccy:"UAH", buy:"25.90000", sale:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", buy:"29.10000", sale:"29.85000 " }, { ccy:"RUR", base_ccy:"UAH", buy:"0.37800", sale:"0.41800" }, { ccy:"BTC", base_ccy:"USD", buy:"11220.0384", udsalg: "12401.0950" } ]

Trin 2: Opret en Telegram Bot med @BotFather

Du kan oprette et program til at modtage beskeder og svare på dem ved hjælp af @BotFather-tjenesten. Gå til hans Telegram-side og indtast kommandoen /newbot. Instruktioner vises i chatten, ifølge hvilke du først skal skrive navnet på botten ned og derefter dens adresse. Når bot-kontoen er oprettet, vises en velkomstbesked indeholdende et token på skærmen. For yderligere konfiguration, brug disse kommandoer:

  • /setbeskrivelse – beskrivelse;
  • /setabouttext – information om den nye bot;
  • /setuserpic – profilbillede;
  • /setinline – inline-tilstand;
  • /setcommands – beskrivelse af kommandoer.

Ved det sidste konfigurationstrin beskriver vi /help og /exchange. Når alle trin er gennemført, er det tid til at gå videre til kodning.

Trin 3: Opsætning og start af bot

Lad os oprette en config.py-fil. I den skal du angive den unikke bot-kode og den tidszone, hvor programmet vil finde information.

TOKEN = '' # erstat med din bots tokenTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Dernæst opretter vi en anden fil med import af den tidligere skrevne pb.py, biblioteker og andre nødvendige komponenter. De manglende biblioteker installeres fra pakkehåndteringssystemet (pip).

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

Lad os bruge indholdet af pyTelegramBotApi til at oprette en bot. Vi sender det modtagne token ved hjælp af følgende kode:

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

None_stop-parameteren sikrer, at anmodninger konstant sendes. Funktionen af ​​parameteren vil ikke blive påvirket af metodefejl.

Trin 4: Skriv /start Command Handler

Hvis alle de foregående trin er udført korrekt, er botten begyndt at fungere. Programmet genererer anmodninger regelmæssigt, fordi det bruger metoden getUpdates. Før linjen med none_stop-elementet har vi brug for et stykke kode, der behandler /start-kommandoen:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Hilsen! Jeg kan vise dig valutakurser.n' + 'For at få valutakurserne tryk på / exchange.n' + 'Tryk på /help for at få hjælp.')

RџСўРё commands=['start'] lig med Sand start_command kaldes. Indholdet af beskeden går der. Dernæst skal du implementere sendefunktionen_besked i forhold til et bestemt budskab.

Trin 5: Opret en /help Command Handler

Kommandoen /help kan implementeres som en knap. Ved at klikke på det, vil brugeren blive ført til udviklerens Telegram-konto. Giv knappen et navn, såsom "Spørg udvikleren". Indstil parameteren reply_markup, som omdirigerer brugeren til et link, for send_message-metoden. Lad os i koden skrive den parameter, der skaber tastaturet (InlineKeyboardMarkup). Du behøver kun én knap (InlineKeyboardButton).

Den endelige kommandohåndteringskode ser sådan ud:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Spørg udvikleren', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) For at modtage en liste over tilgængelige valutaer tryk /exchange.n' + '2) Klik på den valuta, du er interesseret i.n' + '3) Du vil modtage en besked, der indeholder information om kilden og målvalutaerne, ' + 'købskurser og salgskurser.n' + '4) Klik på "Opdater" for at modtage den aktuelle information vedrørende anmodningen. ' + 'Botten vil også vise forskellen mellem den tidligere og den nuværende valutakurs.n' + '5) Botten understøtter inline. Skriv @ i enhver chat og de første bogstaver i en valuta.', reply_markup=keyboard )

Kodehandling i Telegram-chat:

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Trin 6: Tilføjelse af /exchange Command Handler

Dette trin er nødvendigt for at vise knapper med symboler for tilgængelige valutaer i chatten. Et skærmtastatur med muligheder hjælper dig med at undgå fejl. PrivatBank giver oplysninger om rubler, dollar og euro. Indstillingen InlineKeyboardButton fungerer sådan her:

  1. Brugeren klikker på knappen med den ønskede betegnelse.
  2. getUpdates modtager et tilbagekald (CallbackQuery).
  3. Det bliver kendt, hvordan man håndterer at trykke på tastaturet - information om den trykket knap sendes.

/exchange handler kode:

@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, 'Klik på den valgte valuta:', reply_markup=keyboard )

Resultatet af koden i Telegram:

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Trin 7: Skriv en handler til de indbyggede tastaturknapper

Pakken pyTelegramBot Api indeholder dekorationsfunktionen @bot.callback_query_handler. Denne komponent er designet til at oversætte tilbagekaldet til en funktion - API'en udpakker og genopretter opkaldet. Det staves sådan:

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

Lad os også skrive get_ex_callback-metoden:

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

Der er en anden nyttig metode – answer_callback_query. Det hjælper med at fjerne belastningen mellem tryk på knappen og visning af resultatet på skærmen. Du kan sende en besked til send_exchange_query ved at sende en valutakode og besked. Lad os skrive 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' )

Mens chatbotten modtager resultatet af anmodningen fra banken API, ser den besøgende inskriptionen "at skrive en besked". Det ser ud som om en rigtig person svarer. For at vise en sådan indikator på skærmen skal du tilføje inputstatuslinjer. Dernæst vil vi bruge get_exchange - med dets hjælp vil programmet modtage valutabetegnelsen (rubler, euro eller dollars). send_message bruger yderligere metoder: serialize_ex konverterer valutaen til et andet format, og get_update_keyboard opsætter softkeys, der opdaterer information og sender valutamarkedsdata til andre chats.

Lad os skrive koden til get_update_keyboard. To knapper skal nævnes – t og e står for type og bytte. Elementet switch_inline_query til Share-knappen er nødvendig, så brugeren kan vælge mellem flere chats. Den besøgende vil være i stand til at vælge, hvem han vil sende den aktuelle valutakurs på dollar, rubel eller euro til.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Update', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['køb'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Del', switch_inline_query=ex['ccy']) ) returner tastaturet

Nogle gange har du brug for at se, hvor meget kursen har ændret sig på kort tid. Lad os skrive to metoder til knappen Opdater, så brugerne kan se kurser i sammenligning.

Forskellen mellem valutakurserne overføres til serializeren via diff-parameteren.

De foreskrevne metoder virker kun efter at data er opdateret, de vil ikke påvirke den første visning af kurset.

def serialize_ex(ex_json, diff=Ingen): resultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Køb: ' + ex_json['køb'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sælg: ' + ex_json['udsalg'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' returnerer resultat def serialize_exchange_diff(diff): result = '' if diff > 0: resultat = '(' + 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: result = '(' + 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">)' returresultat

Forestil dig, at den besøgende ønskede at kende dollarkursen. Her er, hvad der sker, hvis du vælger USD i meddelelsen:

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Trin 8: Implementering af Update Button Handler

Lad os skrive koden til håndtering af handlinger med knappen Opdater og tilføje delen iq_callback_method til den. Når programpunkter begynder med get-parameteren, skal du skrive get_ex_callback. I andre situationer analyserer vi JSON og forsøger at få nøglen 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(forespørgsel) undtagen ValueError: pass

Hvis t er lig med u, skal du skrive et program til metoden edit_message_callback. Lad os nedbryde denne proces trin for trin:

  1. Download af opdaterede oplysninger om valutamarkedets tilstand (exchange_now = pb.get_exchange(data['c']).
  1. Skrivning af en ny besked gennem en serializer med diff.
  2. Tilføjelse af en signatur (get_edited_signature).

Hvis den oprindelige besked ikke ændres, skal du kalde metoden 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='elif_message )_in : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Lad os skrive get_ex_from_iq_data metoden for at parse JSON:

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

Du skal bruge et par flere metoder: for eksempel get_exchange_diff, som læser de gamle og nye oplysninger om prisen på valutaer og viser forskellen.

def get_exchange_diff(sidste, nu): return { 'sale_diff': float("%.6f" % (float(nu['sale']) - float(sidste['sale']))), 'buy_diff': float ("%.6f" % (float(nu['køb']) - float(sidste['køb']))) }

Den sidste, get_edited_signature, viser det tidspunkt, hvor kurset sidst blev opdateret.

def get_edited_signature(): return 'Opdateret ' + str(datetime.datetime.now(P_TIMEZONE).strftime('%H:%M:%S')) + ' (' + TIMEZONE_COMMON_NAME + ')'

Som et resultat ser den opdaterede besked fra botten med en stabil valutakurs således ud:

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Når kursen ændres, vises forskellene mellem værdierne i meddelelsen på grund af de foreskrevne parametre.

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Trin 9: Implementering af indlejret tilstand

Den indbyggede tilstand er nødvendig for hurtigt at sende information fra programmet til enhver chat – nu behøver du ikke tilføje en bot til samtalen som deltager. Når en Telegram-bruger indtaster et botnavn med et @-tegn foran, bør konverteringsmuligheder vises over inputlinjen. Hvis du klikker på et af punkterne, vil botten sende en besked til samtalen med resultater og knapper til opdatering og afsendelse af data. Afsenderens navn vil indeholde billedteksten "via ".

InlineQuery sendes til query_text via biblioteket. Koden bruger funktionen answer_line til at hente søgeresultaterne som en række data og elementet inline_query_id. Vi bruger get_exchanges, så botten finder flere valutaer efter anmodning.

@bot.inline_handler(func=lambda-forespørgsel: Sand) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Vi sender en række data til get_iq_articles for at returnere objekter fra InlineQueryResultArticle gennem denne metode.

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='Konverter ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) returnere resultat

Hvis du nu skriver @ og et mellemrum i linjen, vises søgeresultaterne på skærmen – muligheder for omregning til tre tilgængelige valutaer.

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Brugere kan filtrere resultaterne ved at indtaste den ønskede valuta.

Efter at have klikket på den ønskede valuta fra listen, modtager chatten den samme besked, som botbrugere modtager. Du kan også bruge knappen Opdater. Billedet nedenfor viser den opdaterede besked sendt via botten:

Telegram-bot i Python. En komplet guide til at skrive en bot med valutakurser fra bunden

Konklusion

Nu ved du, hvordan du opretter en bot til Telegram. Du kan tilføje nyttige værktøjer til dit program: knapper til at opdatere og sende resultatet til andre brugere af messengeren og en indbygget tilstand, der giver dig mulighed for at bruge bottens funktioner uden for chatten med den. Baseret på denne instruktion kan du oprette en hvilken som helst simpel bot med andre funktioner - ikke kun den, der viser valutakurser. Vær ikke bange for at eksperimentere med biblioteker, API'er og kode for at skabe en automatiseret assistent, der vil chatte med kunder på Telegram og styrke interesserede personers forbindelse med virksomheden.

1 Kommentar

  1. Fantastisk publicación

Giv en kommentar