Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Bots in Telegram zijn programma's die helpen om contact te leggen met het publiek of handelingen te vereenvoudigen die voorheen handmatig moesten worden uitgevoerd. Deze programma's zijn speciaal geschreven voor het messenger-platform. Bots werken op deze manier: de gebruiker stuurt een commando via de invoerregel en het systeem reageert met een tekst of interactief bericht. Soms imiteert het programma zelfs de acties van een echt persoon - zo'n bot wekt meer vertrouwen bij klanten.

Er zijn verschillende soorten systemen voor automatische assistentie aan gebruikers. Sommige bots communiceren gewoon met klanten, andere geven regelmatig informatie. Het is onmogelijk om programma's duidelijk in typen te verdelen – ontwikkelaars combineren vaak meerdere functies in één bot.

U kunt in 9 stappen een eenvoudige bot voor Telegram schrijven met interactieve elementen in de vorm van knoppen op het scherm. Laten we elk van hen in detail bekijken en een paar vragen beantwoorden:

  • hoe een bot te starten;
  • hoe u een ingebouwd toetsenbord registreert met een of meer knoppen;
  • hoe de knoppen voor de gewenste functies te programmeren;
  • wat is de inline-modus en hoe u deze instelt voor een bestaande bot.

Stap 0: theoretische achtergrond over de Telegram bots API

De belangrijkste tool die wordt gebruikt om Telegram-bots te maken, is de HTML Application Programming Interface of HTML API. Dit element accepteert verzoeken van bezoekers en stuurt antwoorden in de vorm van informatie. Kant-en-klare ontwerpen vereenvoudigen het werk aan het programma. Om een ​​bot voor Telegram te schrijven, moet je dit e-mailadres gebruiken: https://api.telegram.org/bot/METHOD_NAME

Voor het correct functioneren van de bot is ook een token nodig - een combinatie van karakters die het programma beschermt en de toegang ertoe opent voor vertrouwde ontwikkelaars. Elke token is uniek. De tekenreeks wordt bij het maken aan de bot toegewezen. Methoden kunnen verschillen: getUpdates, getChat en anderen. De keuze van de methode hangt af van welk algoritme de ontwikkelaars van de bot verwachten. Tokenvoorbeeld:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots gebruiken GET- en POST-verzoeken. Methodeparameters moeten vaak worden aangevuld, bijvoorbeeld wanneer de methode sendMessage de chat-ID en wat tekst moet verzenden. Parameters voor methodeverfijning kunnen worden doorgegeven als een URL-querystring met application/x-www-form-urlencoded of via application-json. Deze methoden zijn niet geschikt voor het downloaden van bestanden. UTF-8-codering is ook vereist. Door een verzoek naar de API te sturen, kunt u het resultaat in JSON-indeling krijgen. Bekijk de reactie van het programma op het ophalen van informatie via de getME-methode:

KRIJG https://api.telegram.org/bot/getMe{ ok: true, resultaat: { id: 231757398, first_name: "Exchange Rate Bot", gebruikersnaam: "exchangetestbot" } }

Het resultaat wordt verkregen als: ok is gelijk aan waar. Anders geeft het systeem een ​​fout aan.

Er zijn twee manieren om aangepaste berichten in bots te krijgen. Beide methoden zijn effectief, maar zijn geschikt in verschillende gevallen. Om berichten te ontvangen, kunt u handmatig een verzoek schrijven met de getUpdates-methode - het programma zal de Update-gegevensarray op het scherm weergeven. Verzoeken moeten regelmatig worden verzonden, na analyse van elke array wordt het verzenden herhaald. Offset is een parameter die het aantal overgeslagen records bepaalt voordat een nieuw resultaat wordt geladen om te voorkomen dat aangevinkte objecten opnieuw verschijnen. De voordelen van de getUpdates-methode spelen een rol als:

  • er is geen manier om HTTPS te configureren;
  • complexe scripttalen worden gebruikt;
  • de botserver verandert van tijd tot tijd;
  • de bot is geladen met gebruikers.

De tweede methode die kan worden geschreven om gebruikersberichten te ontvangen, is setWebhook. Het wordt eenmalig gebruikt, het is niet nodig om voortdurend nieuwe verzoeken te verzenden. De webhook stuurt gegevensupdates naar de opgegeven URL. Voor deze methode is een SSL-certificaat vereist. Webhook is handig in deze gevallen:

  • webprogrammeertalen worden gebruikt;
  • de bot is niet overbelast, er zijn niet te veel gebruikers;
  • de server verandert niet, het programma blijft lange tijd op dezelfde server staan.

In verdere instructies gebruiken we getUpdates.

De @BotFather Telegram-service is ontworpen om chatbots te maken. Basisinstellingen worden ook via dit systeem ingesteld - BotFather helpt u bij het maken van een beschrijving, het plaatsen van een profielfoto, het toevoegen van ondersteuningstools. Bibliotheken - sets HTML-verzoeken voor Telegram-bots - zijn beschikbaar op internet, er zijn er nogal wat. Bij het maken van het voorbeeldprogramma werd pyTelegramBotApi gebruikt.

Stap 1: Wisselkoersverzoeken implementeren

Eerst moet u de code schrijven die query's uitvoert. We zullen gebruiken bij het schrijven van de PrivatBank API, hieronder is een link ernaar: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. U moet deze methoden in uw code gebruiken:

  • load_exchange – vindt wisselkoersen en geeft gecodeerde informatie weer;
  • get_exchange – geeft gegevens weer over een specifieke valuta;
  • get_exchanges - toont de lijst van valuta's volgens het voorbeeld.

Als resultaat ziet de code in het pb.py-bestand er als volgt uit:

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 in load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' voor exc in load_exchange(): als re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) niet Geen is: resultaat.append(exc) resultaat retourneren

Het programma kan het volgende antwoord geven op de gespecificeerde verzoeken:

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

Stap 2: Maak een Telegram Bot met @BotFather

U kunt een programma maken om berichten te ontvangen en erop te reageren met behulp van de @BotFather-service. Ga naar zijn Telegram-pagina en voer het /newbot-commando in. Er verschijnen instructies in de chat, volgens welke u eerst de naam van de bot moet opschrijven en vervolgens het adres. Wanneer het bot-account is aangemaakt, verschijnt er een welkomstbericht met een token op het scherm. Gebruik deze commando's voor verdere configuratie:

  • /setbeschrijving – beschrijving;
  • /setabouttext – informatie over de nieuwe bot;
  • /setuserpic – profielfoto;
  • /setinline – inline-modus;
  • /setcommands - beschrijving van commando's.

Bij de laatste configuratiestap beschrijven we /help en /exchange. Wanneer alle stappen zijn voltooid, is het tijd om verder te gaan met coderen.

Stap 3: De Bot instellen en starten

Laten we een config.py-bestand maken. Daarin moet u de unieke botcode opgeven en de tijdzone waarin het programma informatie zal vinden.

TOKEN = '' # vervang door de token van uw botTIMEZONE = 'Europe/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Vervolgens maken we een ander bestand met de import van de eerder geschreven pb.py, bibliotheken en andere noodzakelijke componenten. De ontbrekende bibliotheken worden geïnstalleerd vanuit het pakketbeheersysteem (pip).

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

Laten we de inhoud van pyTelegramBotApi gebruiken om een ​​bot te maken. We versturen de ontvangen token met de volgende code:

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

De parameter none_stop zorgt ervoor dat er constant verzoeken worden verzonden. De werking van de parameter wordt niet beïnvloed door methodefouten.

Stap 4: Schrijf de /start-opdrachthandler

Als alle voorgaande stappen correct zijn uitgevoerd, is de bot begonnen te werken. Het programma genereert regelmatig verzoeken omdat het de getUpdates-methode gebruikt. Voor de regel met het element none_stop hebben we een stukje code nodig dat de opdracht /start verwerkt:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Gegroet! Ik kan u wisselkoersen laten zien.n' + 'Om de wisselkoersen te krijgen, drukt u op / exchange.n' + 'Om hulp te krijgen, druk op /help.' )

RџСўРё commands=['start'] gelijk aan True start_command wordt aangeroepen. Daar gaat de inhoud van het bericht. Vervolgens moet u de verzendfunctie implementeren_bericht met betrekking tot een bepaald bericht.

Stap 5: Maak een /help-opdrachthandler

Het /help-commando kan als een knop worden geïmplementeerd. Door erop te klikken, wordt de gebruiker naar het Telegram-account van de ontwikkelaar geleid. Geef de knop een naam, zoals "Vraag het de ontwikkelaar". Stel de parameter reply_markup, die de gebruiker omleidt naar een link, in voor de methode send_message. Laten we in de code de parameter schrijven die het toetsenbord maakt (InlineKeyboardMarkup). Je hebt maar één knop nodig (InlineKeyboardButton).

De uiteindelijke code voor het afhandelen van de opdracht ziet er als volgt uit:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Vraag het de ontwikkelaar', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Om een ​​lijst met beschikbare valuta's te ontvangen, drukt u op /exchange.n' + '2) Klik op de valuta waarin u geïnteresseerd bent.n' + '3) U ontvangt een bericht met informatie over de bron en de doelvaluta's, ' + 'aan- en verkoopkoersen.n' + '4) Klik op “Update” om de actuele informatie over de aanvraag te ontvangen. ' + 'De bot toont ook het verschil tussen de vorige en de huidige wisselkoersen.n' + '5) De bot ondersteunt inline. Typ @ in elke chat en de eerste letters van een valuta.', reply_markup=keyboard )

Codeactie in Telegram-chat:

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Stap 6: De /exchange-opdrachthandler toevoegen

Deze stap is nodig om knoppen met symbolen van beschikbare valuta in de chat weer te geven. Een schermtoetsenbord met opties helpt je om fouten te voorkomen. PrivatBank geeft informatie over de roebel, dollar en euro. De optie InlineKeyboardButton werkt als volgt:

  1. De gebruiker klikt op de knop met de gewenste aanduiding.
  2. getUpdates ontvangt een terugbelverzoek (CallbackQuery).
  3. Het wordt bekend hoe om te gaan met het indrukken van het toetsenbord - informatie over de ingedrukte knop wordt verzonden.

/uitwisselings-handlercode:

@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 op de valuta naar keuze:', reply_markup=keyboard )

Het resultaat van de code in Telegram:

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Stap 7: Een handler schrijven voor de ingebouwde toetsenbordknoppen

Het pyTelegramBot Api-pakket bevat de functie @bot.callback_query_handler decorateur. Dit onderdeel is ontworpen om de callback te vertalen in een functie - de API pakt de call uit en maakt deze opnieuw. Het is als volgt gespeld:

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

Laten we ook de methode get_ex_callback schrijven:

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

Er is nog een andere handige methode: answer_callback_query. Het helpt om de belasting te verwijderen tussen het indrukken van de knop en het weergeven van het resultaat op het scherm. U kunt een bericht sturen naar send_exchange_query door een valutacode en bericht door te geven. Laten we send_exchange_result schrijven:

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

Terwijl de chatbot het resultaat van het verzoek van de bank ontvangt API, ziet de bezoeker het opschrift “een bericht typen”. Het lijkt alsof een echt persoon antwoordt. Om een ​​dergelijke indicator op het scherm weer te geven, moet u invoerstatusregels toevoegen. Vervolgens zullen we get_exchange gebruiken - met zijn hulp zal het programma de valutaaanduiding (roebels, euro's of dollars) ontvangen. send_message gebruikt aanvullende methoden: serialize_ex converteert de valuta naar een ander formaat en get_update_keyboard stelt softkeys in die informatie bijwerken en valutamarktgegevens naar andere chats verzenden.

Laten we de code schrijven voor get_update_keyboard. Twee knoppen moeten worden genoemd - t en e staan ​​voor type en uitwisseling. Het item switch_inline_query voor de Share-knop is nodig zodat de gebruiker kan kiezen uit verschillende chats. De bezoeker kan kiezen naar wie hij de huidige wisselkoers van de dollar, roebel of euro wil sturen.

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 ('Delen', switch_inline_query=ex['ccy']) ) toetsenbord retourneren

Soms moet u zien hoeveel de wisselkoers in korte tijd is veranderd. Laten we twee methoden voor de knop Bijwerken schrijven, zodat gebruikers cursussen in vergelijking kunnen zien.

Het verschil tussen de wisselkoersen wordt via de diff-parameter doorgegeven aan de serializer.

De voorgeschreven methoden werken alleen nadat de gegevens zijn bijgewerkt, ze hebben geen invloed op de eerste weergave van de cursus.

def serialize_ex(ex_json, diff=Geen): resultaat = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Koop: ' + ex_json['buy'] if diff: resultaat += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Verkoop: ' + 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: 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( 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">)' retourresultaat

Stel je voor dat de bezoeker de koers van de dollar wilde weten. Dit gebeurt er als je USD selecteert in het bericht:

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Stap 8: De updateknop-handler implementeren

Laten we de code schrijven voor het afhandelen van acties met de Update-knop en het iq_callback_method-gedeelte eraan toevoegen. Wanneer programma-items beginnen met de get-parameter, moet u get_ex_callback schrijven. In andere situaties ontleden we JSON en proberen we de sleutel t te krijgen.

@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) behalve ValueError: pass

Als t gelijk is aan u, moet u een programma schrijven voor de methode edit_message_callback. Laten we dit proces stap voor stap afbreken:

  1. Het downloaden van up-to-date informatie over de toestand van de valutamarkt (exchange_now = pb.get_exchange(data['c']).
  1. Een nieuw bericht schrijven via een serializer met diff.
  2. Een handtekening toevoegen (get_edited_signature).

Als het oorspronkelijke bericht niet verandert, roept u de methode edit_message_text aan.

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_idline_message : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Laten we de methode get_ex_from_iq_data schrijven om JSON te ontleden:

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

U hebt nog een paar methoden nodig: bijvoorbeeld get_exchange_diff, dat de oude en nieuwe informatie over de kosten van valuta leest en het verschil weergeeft.

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

De laatste, get_edited_signature, toont de tijd dat de cursus voor het laatst is bijgewerkt.

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

Als gevolg hiervan ziet het bijgewerkte bericht van de bot met een stabiele wisselkoers er als volgt uit:

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Wanneer de koers verandert, worden de verschillen tussen de waarden weergegeven in het bericht vanwege de voorgeschreven parameters.

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Stap 9: Implementatie van Embedded Mode

De ingebouwde modus is nodig om snel informatie van het programma naar een chat te sturen - nu hoeft u als deelnemer geen bot aan het gesprek toe te voegen. Wanneer een Telegram-gebruiker een botnaam invoert met een @-teken ervoor, moeten conversie-opties boven de invoerregel verschijnen. Als u op een van de items klikt, stuurt de bot een bericht naar het gesprek met de resultaten en knoppen voor het bijwerken en verzenden van gegevens. De naam van de afzender bevat het bijschrift "via '.

InlineQuery wordt via de bibliotheek doorgegeven aan query_text. De code gebruikt de functie answer_line om de zoekresultaten op te halen als een reeks gegevens en het element inline_query_id. We gebruiken get_exchanges zodat de bot op verzoek verschillende valuta's vindt.

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

We geven een reeks gegevens door aan get_iq_articles om via deze methode objecten van InlineQueryResultArticle te retourneren.

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 ) ) resultaat retourneren

Als je nu @ schrijft en een spatie in de regel, de zoekresultaten verschijnen op het scherm - opties voor het converteren naar drie beschikbare valuta's.

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Gebruikers kunnen de resultaten filteren door de gewenste valuta in te voeren.

Na het klikken op de gewenste valuta uit de lijst, ontvangt de chat hetzelfde bericht dat botgebruikers ontvangen. U kunt ook de Update-knop gebruiken. De onderstaande afbeelding toont het bijgewerkte bericht dat via de bot is verzonden:

Telegram-bot in Python. Een complete gids voor het schrijven van een bot met wisselkoersen vanaf het begin

Conclusie

Nu weet je hoe je een bot voor Telegram kunt maken. U kunt handige tools aan uw programma toevoegen: knoppen voor het bijwerken en verzenden van het resultaat naar andere gebruikers van de messenger en een ingebouwde modus waarmee u de functies van de bot buiten de chat ermee kunt gebruiken. Op basis van deze instructie kunt u elke eenvoudige bot met andere functies maken - niet alleen degene die wisselkoersen laat zien. Wees niet bang om te experimenteren met bibliotheken, API's en code om een ​​geautomatiseerde assistent te creëren die met klanten op Telegram zal chatten en de band van geïnteresseerde mensen met het bedrijf zal versterken.

hoe 1

  1. Fantastische publicatie

Laat een reactie achter