Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Bots i Telegram er programmer som bidrar til å etablere kontakt med publikum eller forenkle handlinger som tidligere måtte utføres manuelt. Disse programmene er skrevet spesielt for messenger-plattformen. Bots fungerer på denne måten: brukeren sender en kommando gjennom inndatalinjen, og systemet svarer med en tekst eller interaktiv melding. Noen ganger imiterer programmet til og med handlingene til en ekte person - en slik bot inspirerer mer tillit blant kundene.

Det finnes flere typer systemer for automatisk assistanse til brukere. Noen roboter kommuniserer bare med kunder, andre gir regelmessig informasjon. Det er umulig å tydelig dele programmer inn i typer - utviklere kombinerer ofte flere funksjoner i en bot.

Du kan skrive en enkel bot for Telegram med interaktive elementer i form av skjermknapper i 9 trinn. La oss se på hver av dem i detalj og svare på noen spørsmål:

  • hvordan starte en bot;
  • hvordan registrere et innebygd tastatur fra en eller flere knapper;
  • hvordan du programmerer knappene for de ønskede funksjonene;
  • hva er innebygd modus og hvordan sette den opp for en eksisterende bot.

Trinn 0: teoretisk bakgrunn om Telegram bots API

Hovedverktøyet som brukes til å lage Telegram-roboter er HTML Application Programming Interface, eller HTML API. Dette elementet godtar besøksforespørsler og sender svar i form av informasjon. Ferdige design forenkler arbeidet med programmet. For å skrive en bot for Telegram, må du bruke denne e-postadressen: https://api.telegram.org/bot/METHOD_NAME

For at boten skal fungere riktig, er det også nødvendig med et token – en kombinasjon av tegn som beskytter programmet og åpner tilgang til det for pålitelige utviklere. Hvert token er unikt. Strengen tildeles boten ved opprettelse. Metoder kan være forskjellige: getUpdates, getChat og andre. Valget av metode avhenger av hvilken algoritme utviklerne forventer av boten. Token eksempel:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots bruker GET- og POST-forespørsler. Metodeparametere må ofte suppleres – for eksempel når sendMessage-metoden skal sende chat-ID og litt tekst. Parametere for metodeavgrensning kan sendes som en URL-spørringsstreng ved å bruke application/x-www-form-urlencoded eller via application-json. Disse metodene er ikke egnet for nedlasting av filer. UTF-8-koding er også nødvendig. Ved å sende en forespørsel til API-en kan du få resultatet i JSON-format. Ta en titt på programmets svar på å hente informasjon via getME-metoden:

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

Resultatet vil bli oppnådd hvis ok er lik sant. Ellers vil systemet indikere en feil.

Det er to måter å få tilpassede meldinger i roboter. Begge metodene er effektive, men egner seg i forskjellige tilfeller. For å få meldinger kan du manuelt skrive en forespørsel med getUpdates-metoden – programmet vil vise oppdateringsdatamatrisen på skjermen. Forespørsler må sendes regelmessig, etter å ha analysert hver array gjentas sendingen. Offset er en parameter som bestemmer antall hoppede poster før lasting av et nytt resultat for å unngå at sjekkede objekter dukker opp igjen. Fordelene med getUpdates-metoden vil spille inn hvis:

  • det er ingen måte å konfigurere HTTPS på;
  • komplekse skriptspråk brukes;
  • bot-serveren endres fra tid til annen;
  • boten er lastet med brukere.

Den andre metoden som kan skrives for å motta brukermeldinger er setWebhook. Den brukes én gang, du trenger ikke å sende nye forespørsler hele tiden. Webhook sender dataoppdateringer til den angitte URL-en. Denne metoden krever et SSL-sertifikat. Webhook vil være nyttig i disse tilfellene:

  • webprogrammeringsspråk brukes;
  • boten er ikke overbelastet, det er ikke for mange brukere;
  • serveren endres ikke, programmet forblir på samme server i lang tid.

I videre instruksjoner vil vi bruke getUpdates.

@BotFather Telegram-tjenesten er designet for å lage chat-bots. Grunnleggende innstillinger er også satt gjennom dette systemet – BotFather hjelper deg med å lage en beskrivelse, legge inn et profilbilde, legge til støtteverktøy. Biblioteker – sett med HTML-forespørsler for Telegram-roboter – er tilgjengelig på Internett, det er ganske mange av dem. Når du opprettet eksempelprogrammet, ble pyTelegramBotApi brukt.

Trinn 1: Implementering av valutakursforespørsler

Først må du skrive koden som utfører spørringer. Vi vil bruke når vi skriver PrivatBank API, nedenfor er en lenke til den: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Du må bruke disse metodene i koden din:

  • load_exchange – finner valutakurser og viser kodet informasjon;
  • 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 pb.py-filen slik ut:

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) ): for exc i load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): resultat = [] ccy_pattern = re.escape(ccy_pattern) + '.*' for exc in load_exchange(): hvis re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) ikke er Ingen: result.append(exc) returner resultatet

Programmet kan gi følgende svar på de angitte forespørslene:

[ { 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", salg: "12401.0950" } ]

Trinn 2: Lag en Telegram Bot med @BotFather

Du kan lage et program for å motta meldinger og svare på dem ved å bruke @BotFather-tjenesten. Gå til Telegram-siden hans og skriv inn /newbot-kommandoen. Instruksjoner vil vises i chatten, i henhold til hvilke du må skrive ned navnet på boten først, og deretter adressen. Når bot-kontoen er opprettet, vil en velkomstmelding som inneholder et token vises på skjermen. For ytterligere konfigurasjon, bruk disse kommandoene:

  • /settbeskrivelse – beskrivelse;
  • /setabouttext – informasjon om den nye boten;
  • /setuserpic – profilbilde;
  • /setinline – innebygd modus;
  • /setcommands – beskrivelse av kommandoer.

På det siste konfigurasjonstrinnet beskriver vi /help og /exchange. Når alle trinnene er fullført, er det på tide å gå videre til koding.

Trinn 3: Sette opp og starte boten

La oss lage en config.py-fil. I den må du spesifisere den unike bot-koden og tidssonen der programmet vil finne informasjon.

TOKEN = '' # erstatt med botens tokenTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Deretter oppretter vi en annen fil med import av tidligere skrevet pb.py, biblioteker og andre nødvendige komponenter. De manglende bibliotekene 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

La oss bruke innholdet i pyTelegramBotApi til å lage en bot. Vi sender det mottatte tokenet med følgende kode:

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

None_stop-parameteren sikrer at forespørsler hele tiden sendes. Operasjonen av parameteren vil ikke bli påvirket av metodefeil.

Trinn 4: Skriv kommandobehandleren /start

Hvis alle de foregående trinnene er utført riktig, har boten begynt å fungere. Programmet genererer forespørsler regelmessig fordi det bruker getUpdates-metoden. Før linjen med none_stop-elementet, trenger vi et stykke kode som behandler /start-kommandoen:

@bot.message_handler(commands=['start']) def start_command(melding): bot.send_message( message.chat.id, 'Hilsen! Jeg kan vise deg valutakurser.n' + 'For å få valutakursene trykk / exchange.n' + 'For å få hjelp, trykk /help.')

RџСўРё commands=['start'] lik Sant start_command kalles. Innholdet i meldingen går der. Deretter må du implementere sendefunksjonen_beskjed i forhold til et bestemt budskap.

Trinn 5: Opprett en /help Command Handler

/help-kommandoen kan implementeres som en knapp. Ved å klikke på den, vil brukeren bli ført til utviklerens Telegram-konto. Gi knappen et navn, for eksempel "Spør utvikleren". Angi reply_markup-parameteren, som omdirigerer brukeren til en lenke, for send_message-metoden. La oss skrive i koden parameteren som lager tastaturet (InlineKeyboardMarkup). Du trenger bare én knapp (InlineKeyboardButton).

Den endelige kommandobehandlerkoden ser slik ut:

@bot.message_handler(commands=['hjelp']) def help_command(melding): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Spør utvikleren', url='ваша ссылка профиль' ) ) bot.send_message( message.chat.id, '1) For å motta en liste over tilgjengelige valutaer trykk /exchange.n' + '2) Klikk på valutaen du er interessert i.n' + '3) Du vil motta en melding som inneholder informasjon om kilden og målvalutaene, ' + 'kjøpskurser og salgspriser.n' + '4) Klikk "Oppdater" for å motta gjeldende informasjon om forespørselen. ' + 'Boten vil også vise forskjellen mellom forrige og gjeldende valutakurs.n' + '5) Boten støtter inline. Skriv @ i enhver chat og de første bokstavene i en valuta.', reply_markup=keyboard )

Kodehandling i Telegram-chat:

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Trinn 6: Legge til /exchange Command Handler

Dette trinnet er nødvendig for å vise knapper med symboler for tilgjengelige valutaer i chatten. Et skjermtastatur med alternativer vil hjelpe deg å unngå feil. PrivatBank gir informasjon om rubelen, dollaren og euroen. Alternativet InlineKeyboardButton fungerer slik:

  1. Brukeren klikker på knappen med ønsket betegnelse.
  2. getUpdates mottar en tilbakeringing (CallbackQuery).
  3. Det blir kjent hvordan man håndterer å trykke på tastaturet – informasjon om den trykkede knappen overføres.

/exchange behandlerkode:

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

Resultatet av koden i Telegram:

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Trinn 7: Skrive en behandler for de innebygde tastaturknappene

pyTelegramBot Api-pakken inneholder dekorasjonsfunksjonen @bot.callback_query_handler. Denne komponenten er designet for å oversette tilbakeringingen til en funksjon – API-en pakker ut og gjenoppretter kallet. Det staves slik:

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

La oss 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:])

Det er en annen nyttig metode – answer_callback_query. Det hjelper å fjerne belastningen mellom å trykke på knappen og vise resultatet på skjermen. Du kan sende en melding til send_exchange_query ved å sende en valutakode og melding. La oss skrive send_exchange_result:

def send_exchange_result(message, ex_code): bot.send_chat_action(message.chat.id, 'skriving') 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 chatboten mottar resultatet av forespørselen fra banken API, ser den besøkende inskripsjonen "skriver en melding". Det ser ut som en ekte person svarer. For å vise en slik indikator på skjermen, må du legge til inndatastatuslinjer. Deretter vil vi bruke get_exchange – med hjelpen vil programmet motta valutabetegnelsen (rubler, euro eller dollar). send_message bruker flere metoder: serialize_ex konverterer valutaen til et annet format, og get_update_keyboard setter opp funksjonstaster som oppdaterer informasjon og sender valutamarkedsdata til andre chatter.

La oss skrive koden for get_update_keyboard. To knapper må nevnes – t og e står for type og bytte. Elementet switch_inline_query for Del-knappen er nødvendig slik at brukeren kan velge mellom flere chatter. Den besøkende vil kunne velge hvem han vil sende gjeldende 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['kjøp'], 's': ex['salg'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) returner tastaturet

Noen ganger må du se hvor mye valutakursen har endret seg på kort tid. La oss skrive to metoder for Oppdater-knappen slik at brukere kan se kurs i sammenligning.

Differansen mellom valutakursene overføres til serializeren via diff-parameteren.

De foreskrevne metodene fungerer først etter at dataene er oppdatert, de vil ikke påvirke den første visningen av kurset.

def serialize_ex(ex_json, diff=Ingen): resultat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Kjøp: ' + ex_json['buy'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sell: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: resultat += 'nSell: ' + ex_json['sale'] + 'n' returner resultat def serialize_exchange_diff(diff): resultat = '' 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

Tenk deg at den besøkende ønsket å vite dollarkursen. Her er hva som skjer hvis du velger USD i meldingen:

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Trinn 8: Implementering av oppdateringsknappbehandleren

La oss skrive koden for håndtering av handlinger med Oppdater-knappen og legge til iq_callback_method-delen til den. Når programelementer begynner med get-parameteren, må du skrive get_ex_callback. I andre situasjoner analyserer vi JSON og prøver å få nøkkelen 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) bortsett fra ValueError: pass

Hvis t er lik u, må du skrive et program for metoden edit_message_callback. La oss bryte ned denne prosessen trinn for trinn:

  1. Laster ned oppdatert informasjon om tilstanden til valutamarkedet (exchange_now = pb.get_exchange(data['c']).
  1. Skrive en ny melding gjennom en serializer med diff.
  2. Legge til en signatur (get_edited_signature).

Hvis den første meldingen ikke endres, kaller du edit_message_text-metoden.

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' )

La oss skrive get_ex_from_iq_data-metoden for å analysere JSON:

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

Du trenger noen flere metoder: for eksempel get_exchange_diff, som leser den gamle og nye informasjonen om kostnadene for valutaer og viser forskjellen.

def get_exchange_diff(last, now): return { 'sale_diff': float("%.6f" % (float(now['sale']) - float(siste['sale']))), 'buy_diff': float ("%.6f" % (float(nå['kjøp']) - float(siste['kjøp']))) }

Den siste, get_edited_signature, viser tidspunktet kurset sist ble oppdatert.

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

Som et resultat ser den oppdaterte meldingen fra boten med en stabil valutakurs slik ut:

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Når kursen endres, vises forskjellene mellom verdiene i meldingen på grunn av de foreskrevne parameterne.

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Trinn 9: Implementering av innebygd modus

Den innebygde modusen er nødvendig for raskt å sende informasjon fra programmet til en hvilken som helst chat - nå trenger du ikke å legge til en bot i samtalen som deltaker. Når en Telegram-bruker skriver inn et botnavn med et @-tegn foran, bør konverteringsalternativer vises over inndatalinjen. Hvis du klikker på et av elementene, vil boten sende en melding til samtalen med resultater og knapper for oppdatering og sending av data. Avsenderens navn vil inneholde bildeteksten "via ".

InlineQuery sendes til query_text via biblioteket. Koden bruker answer_line-funksjonen for å hente søkeresultatene som en rekke data og inline_query_id-elementet. Vi bruker get_exchanges slik at boten finner flere valutaer på forespørsel.

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

Vi sender en rekke data til get_iq_articles for å returnere objekter fra InlineQueryResultArticle gjennom denne metoden.

def get_iq_articles(exchanges): resultat = [] 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

Nå, hvis du skriver @ og et mellomrom i linjen, vil søkeresultatene vises på skjermen – alternativer for å konvertere til tre tilgjengelige valutaer.

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

Brukere kan filtrere resultatene ved å angi ønsket valuta.

Etter å ha klikket på ønsket valuta fra listen, mottar chatten den samme meldingen som botbrukere mottar. Du kan også bruke Oppdater-knappen. Bildet nedenfor viser den oppdaterte meldingen sendt via boten:

Telegram-bot i Python. En komplett guide til å skrive en bot med valutakurser fra bunnen av

konklusjonen

Nå vet du hvordan du lager en bot for Telegram. Du kan legge til nyttige verktøy i programmet: knapper for å oppdatere og sende resultatet til andre brukere av messenger og en innebygd modus som lar deg bruke funksjonene til boten utenfor chatten med den. Basert på denne instruksjonen kan du lage en hvilken som helst enkel robot med andre funksjoner – ikke bare den som viser valutakurser. Ikke vær redd for å eksperimentere med biblioteker, APIer og kode for å lage en automatisert assistent som vil chatte med kunder på Telegram og styrke kontakten mellom interesserte personer med selskapet.

1 Kommentar

  1. Fantástica publicación

Legg igjen en kommentar