Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

I bot in Telegram sono programmi che aiutano a stabilire un contatto con il pubblico o a semplificare le azioni che in precedenza dovevano essere eseguite manualmente. Questi programmi sono scritti specificamente per la piattaforma di messaggistica. I bot funzionano in questo modo: l'utente invia un comando attraverso la riga di input e il sistema risponde con un testo o un messaggio interattivo. A volte il programma imita persino le azioni di una persona reale: un tale bot ispira più fiducia tra i clienti.

Esistono diversi tipi di sistemi per l'assistenza automatica agli utenti. Alcuni bot comunicano semplicemente con i clienti, altri forniscono regolarmente informazioni. È impossibile dividere chiaramente i programmi in tipi: gli sviluppatori spesso combinano diverse funzioni in un bot.

Puoi scrivere un semplice bot per Telegram con elementi interattivi sotto forma di pulsanti sullo schermo in 9 passaggi. Diamo un'occhiata a ciascuno di essi in dettaglio e rispondiamo ad alcune domande:

  • come avviare un bot;
  • come registrare una tastiera integrata da uno o più pulsanti;
  • come programmare i pulsanti per le funzioni desiderate;
  • cos'è la modalità inline e come configurarla per un bot esistente.

Passaggio 0: background teorico sull'API dei bot di Telegram

Lo strumento principale utilizzato per creare i bot di Telegram è l'interfaccia di programmazione dell'applicazione HTML o API HTML. Questo elemento accetta le richieste dei visitatori e invia le risposte sotto forma di informazioni. I progetti già pronti semplificano il lavoro sul programma. Per scrivere un bot per Telegram, devi utilizzare questo indirizzo email: https://api.telegram.org/bot/NOME_METODO

Per il corretto funzionamento del bot è necessario anche un token, una combinazione di caratteri che protegga il programma e ne apra l'accesso a sviluppatori fidati. Ogni token è unico. La stringa viene assegnata al bot al momento della creazione. I metodi possono essere diversi: getUpdates, getChat e altri. La scelta del metodo dipende dall'algoritmo che gli sviluppatori si aspettano dal bot. Esempio di token:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

I bot utilizzano le richieste GET e POST. I parametri del metodo spesso devono essere integrati, ad esempio quando si suppone che il metodo sendMessage invii l'id della chat e del testo. I parametri per il perfezionamento del metodo possono essere passati come stringa di query URL utilizzando application/x-www-form-urlencoded o tramite application-json. Questi metodi non sono adatti per il download di file. È richiesta anche la codifica UTF-8. Inviando una richiesta all'API, puoi ottenere il risultato in formato JSON. Dai un'occhiata alla risposta del programma al recupero delle informazioni tramite il metodo getME:

OTTIENI https://api.telegram.org/bot/getMe{ ok: true, risultato: { id: 231757398, first_name: "Exchange Rate Bot", nome utente: "exchangetestbot" } }

Il risultato si otterrà se ok uguale vero. In caso contrario, il sistema indicherà un errore.

Esistono due modi per ottenere messaggi personalizzati nei bot. Entrambi i metodi sono efficaci, ma sono adatti in casi diversi. Per ricevere messaggi, puoi scrivere manualmente una richiesta con il metodo getUpdates: il programma visualizzerà l'array di dati di aggiornamento sullo schermo. Le richieste devono essere inviate regolarmente, dopo aver analizzato ogni array, l'invio viene ripetuto. Offset è un parametro che determina il numero di record ignorati prima di caricare un nuovo risultato per evitare la ricomparsa degli oggetti selezionati. I vantaggi del metodo getUpdates entreranno in gioco se:

  • non c'è modo di configurare HTTPS;
  • vengono utilizzati linguaggi di scripting complessi;
  • il bot server cambia di volta in volta;
  • il bot viene caricato con gli utenti.

Il secondo metodo che può essere scritto per ricevere i messaggi degli utenti è setWebhook. Viene utilizzato una sola volta, non è necessario inviare continuamente nuove richieste. Il webhook invia gli aggiornamenti dei dati all'URL specificato. Questo metodo richiede un certificato SSL. Webhook sarà utile in questi casi:

  • vengono utilizzati linguaggi di programmazione web;
  • il bot non è sovraccarico, non ci sono troppi utenti;
  • il server non cambia, il programma rimane a lungo sullo stesso server.

In ulteriori istruzioni, useremo getUpdates.

Il servizio @BotFather Telegram è progettato per creare chatbot. Anche le impostazioni di base sono impostate tramite questo sistema: BotFather ti aiuterà a fare una descrizione, inserire una foto del profilo, aggiungere strumenti di supporto. Le librerie – insiemi di richieste HTML per i bot di Telegram – sono disponibili su Internet, ce ne sono parecchie. Durante la creazione del programma di esempio, è stato utilizzato pyTelegramBotApi.

Passaggio 1: implementazione delle richieste di cambio

Per prima cosa devi scrivere il codice che esegue le query. Utilizzeremo durante la scrittura dell'API PrivatBank, di seguito è riportato un collegamento ad essa: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Devi usare questi metodi nel tuo codice:

  • load_exchange – trova i tassi di cambio e visualizza le informazioni codificate;
  • get_exchange: mostra i dati su una valuta specifica;
  • get_exchanges – mostra l'elenco delle valute in base al campione.

Di conseguenza, il codice nel file pb.py è simile al seguente:

import re import request 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) + '.*' for exc in load_exchange(): se re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) non è Nessuno: result.append(exc) restituisce il risultato

Il programma può emettere la seguente risposta alle richieste specificate:

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

Passaggio 2: crea un bot di Telegram con @BotFather

Puoi creare un programma per ricevere messaggi e rispondere ad essi utilizzando il servizio @BotFather. Vai alla sua pagina di Telegram e inserisci il comando /newbot. Nella chat appariranno le istruzioni, in base alle quali è necessario annotare prima il nome del bot e poi il suo indirizzo. Quando l'account del bot viene creato, sullo schermo apparirà un messaggio di benvenuto contenente un token. Per un'ulteriore configurazione, utilizzare questi comandi:

  • /setdescription – descrizione;
  • /setabouttext – informazioni sul nuovo bot;
  • /setuserpic – foto del profilo;
  • /setinline – modalità in linea;
  • /setcommands – descrizione dei comandi.

Nell'ultimo passaggio di configurazione, descriviamo /help e /exchange. Quando tutti i passaggi sono stati completati, è il momento di passare alla codifica.

Passaggio 3: configurazione e avvio del bot

Creiamo un file config.py. In esso, è necessario specificare il codice bot univoco e il fuso orario in cui il programma troverà le informazioni.

GETTONO = '' # sostituisci con il token del tuo botTIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Successivamente, creiamo un altro file con l'importazione del pb.py precedentemente scritto, delle librerie e degli altri componenti necessari. Le librerie mancanti vengono installate dal sistema di gestione dei pacchetti (pip).

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

Usiamo il contenuto di pyTelegramBotApi per creare un bot. Inviamo il token ricevuto utilizzando il seguente codice:

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

Il parametro none_stop garantisce che le richieste vengano inviate costantemente. Il funzionamento del parametro non sarà influenzato da errori di metodo.

Passaggio 4: scrivere il gestore dei comandi /start

Se tutti i passaggi precedenti sono stati eseguiti correttamente, il bot ha iniziato a funzionare. Il programma genera richieste regolarmente perché utilizza il metodo getUpdates. Prima della riga con l'elemento none_stop, abbiamo bisogno di un pezzo di codice che elabori il comando /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Saluti! Posso mostrarti tassi di cambio.n' + 'Per ottenere i tassi di cambio premere / exchange.n' + 'Per ricevere aiuto, premi /help.')

RџSЂRo comandi=['inizio'] uguale a Vero start_command viene chiamato. Il contenuto del messaggio va lì. Successivamente, è necessario implementare la funzione di invio_Messaggio in relazione a un messaggio particolare.

Passaggio 5: crea un gestore di comandi /help

Il comando /help può essere implementato come un pulsante. Facendo clic su di esso, l'utente verrà indirizzato all'account Telegram dello sviluppatore. Assegna un nome al pulsante, ad esempio "Chiedi allo sviluppatore". Impostare il parametro reply_markup, che reindirizza l'utente a un collegamento, per il metodo send_message. Scriviamo nel codice il parametro che crea la tastiera (InlineKeyboardMarkup). Hai solo bisogno di un pulsante (InlineKeyboardButton).

Il codice del gestore del comando finale è simile al seguente:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Chiedi allo sviluppatore', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Per ricevere un elenco di valute disponibili premere /exchange.n' + '2) Clicca sulla valuta che ti interessa.n' + '3) Tu riceverà un messaggio contenente informazioni sulla valuta di origine e di destinazione, ' + 'tariffe di acquisto e di vendita.n' + '4) Fare clic su "Aggiorna" per ricevere le informazioni aggiornate sulla richiesta. ' + 'Il bot mostrerà anche la differenza tra il tasso di cambio precedente e quello attuale.n' + '5) Il bot supporta inline. Tipo @ in qualsiasi chat e le prime lettere di una valuta.', Reply_markup=keyboard )

Azione del codice nella chat di Telegram:

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Passaggio 6: aggiunta del gestore dei comandi /exchange

Questo passaggio è necessario per visualizzare i pulsanti con i simboli delle valute disponibili nella chat. Una tastiera su schermo con opzioni ti aiuterà a evitare errori. PrivatBank fornisce informazioni su rublo, dollaro ed euro. L'opzione InlineKeyboardButton funziona in questo modo:

  1. L'utente fa clic sul pulsante con la designazione desiderata.
  2. getUpdates riceve una richiamata (CallbackQuery).
  3. Diventa noto come gestire la pressione della tastiera: vengono trasmesse le informazioni sul pulsante premuto.

/codice gestore di scambio:

@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, 'Fai clic sulla valuta scelta:', Reply_markup=keyboard )

Il risultato del codice in Telegram:

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Passaggio 7: scrittura di un gestore per i pulsanti della tastiera incorporati

Il pacchetto pyTelegramBot Api contiene la funzione decoratore @bot.callback_query_handler. Questo componente è progettato per tradurre il callback in una funzione: l'API annulla il wrapping e ricrea la chiamata. Si scrive così:

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

Scriviamo anche il metodo get_ex_callback:

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

C'è un altro metodo utile: answer_callback_query. Aiuta a rimuovere il carico tra la pressione del pulsante e la visualizzazione del risultato sullo schermo. Puoi inviare un messaggio a send_exchange_query passando un codice valuta e un messaggio. Scriviamo send_exchange_result:

def send_exchange_result(messaggio, ex_code): bot.send_chat_action(message.chat.id, 'digitando') ex = pb.get_exchange(ex_code) bot.send_message( message.chat.id, serialize_ex(ex), Reply_markup=get_update_keyboard(ex ), parse_mode='HTML' )

Mentre il chatbot riceve l'esito della richiesta dalla banca API, il visitatore vede la scritta “digitando un messaggio”. Sembra che una persona reale stia rispondendo. Per visualizzare tale indicatore sullo schermo, sarà necessario aggiungere righe di stato dell'input. Successivamente, utilizzeremo get_exchange: con il suo aiuto, il programma riceverà la designazione della valuta (rubli, euro o dollari). send_message utilizza metodi aggiuntivi: serialize_ex converte la valuta in un altro formato e get_update_keyboard imposta softkey che aggiornano le informazioni e inviano i dati del mercato valutario ad altre chat.

Scriviamo il codice per get_update_keyboard. È necessario menzionare due pulsanti: t ed e stanno per tipo e scambio. L'elemento switch_inline_query per il pulsante Condividi è necessario affinché l'utente possa scegliere tra diverse chat. Il visitatore potrà scegliere a chi inviare il cambio attuale del dollaro, rublo o euro.

def get_update_keyboard(ex): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Aggiorna', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['buy'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Condividi', switch_inline_query=ex['ccy'])) restituisce la tastiera

A volte è necessario vedere quanto è cambiato il tasso di cambio in breve tempo. Scriviamo due metodi per il pulsante Aggiorna in modo che gli utenti possano vedere i corsi a confronto.

La differenza tra i tassi di cambio viene trasmessa al serializzatore tramite il parametro diff.

I metodi prescritti funzionano solo dopo l'aggiornamento dei dati, non influiranno sulla prima visualizzazione del corso.

def serialize_ex(ex_json, diff=Nessuno): risultato = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Acquista: ' + ex_json['acquista'] if diff: result += ' ' + serialize_exchange_diff(diff['acquista_diff']) + 'n' + 'Vendi: ' + 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: risultato = '(' + 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: risultato = '(' + 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">)' restituisce il risultato

Immagina che il visitatore volesse conoscere il tasso di cambio del dollaro. Ecco cosa succede se selezioni USD nel messaggio:

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Passaggio 8: implementazione del gestore del pulsante di aggiornamento

Scriviamo il codice per gestire le azioni con il pulsante Aggiorna e aggiungiamo la parte iq_callback_method ad esso. Quando gli elementi del programma iniziano con il parametro get, è necessario scrivere get_ex_callback. In altre situazioni, analizziamo JSON e proviamo a ottenere la chiave 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) eccetto ValueError: pass

Se t è uguale a u, dovrai scrivere un programma per il metodo edit_message_callback. Analizziamo passo dopo passo questo processo:

  1. Download di informazioni aggiornate sullo stato del mercato valutario (exchange_now = pb.get_exchange(data['c']).
  1. Scrivere un nuovo messaggio attraverso un serializzatore con diff.
  2. Aggiunta di una firma (get_edited_signature).

Se il messaggio iniziale non cambia, chiama il metodo 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='HTML' ) elif query.inline_message_id : bot.edit_message_text(testo, inline_message_id=query.inline_message_id, Reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML')

Scriviamo il metodo get_ex_from_iq_data per analizzare JSON:

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

Avrai bisogno di qualche altro metodo: ad esempio get_exchange_diff, che legge le vecchie e nuove informazioni sul costo delle valute e mostra la differenza.

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

L'ultimo, get_edited_signature, mostra l'ora dell'ultimo aggiornamento del corso.

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

Di conseguenza, il messaggio aggiornato dal bot con un tasso di cambio stabile si presenta così:

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Quando la rotta cambia, le differenze tra i valori vengono visualizzate nel messaggio a causa dei parametri prescritti.

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Passaggio 9: implementazione della modalità incorporata

La modalità integrata è necessaria per inviare rapidamente informazioni dal programma a qualsiasi chat: ora non è necessario aggiungere un bot alla conversazione come partecipante. Quando un utente di Telegram inserisce il nome di un bot con un segno @ davanti, le opzioni di conversione dovrebbero apparire sopra la riga di input. Se fai clic su uno degli elementi, il bot invierà un messaggio alla conversazione con i risultati e i pulsanti per l'aggiornamento e l'invio dei dati. Il nome del mittente conterrà la didascalia “via ".

InlineQuery viene passato a query_text tramite la libreria. Il codice usa la funzione answer_line per recuperare i risultati della ricerca come una matrice di dati e l'elemento inline_query_id. Usiamo get_exchanges in modo che il bot trovi diverse valute su richiesta.

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

Passiamo una matrice di dati a get_iq_articles per restituire oggetti da InlineQueryResultArticle tramite questo metodo.

def get_iq_articles(exchanges): result = [] for exc in exchange: 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 ) ) risultato di ritorno

Ora, se scrivi @ e uno spazio nella riga, i risultati della ricerca appariranno sullo schermo: opzioni per la conversione in tre valute disponibili.

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Gli utenti possono filtrare i risultati inserendo la valuta desiderata.

Dopo aver cliccato sulla valuta desiderata dall'elenco, la chat riceve lo stesso messaggio ricevuto dagli utenti del bot. Puoi anche usare il pulsante Aggiorna. L'immagine seguente mostra il messaggio aggiornato inviato tramite il bot:

Bot di Telegram in Python. Una guida completa per scrivere da zero un bot con tassi di cambio

Conclusione

Ora sai come creare un bot per Telegram. Puoi aggiungere strumenti utili al tuo programma: pulsanti per aggiornare e inviare il risultato ad altri utenti del messenger e una modalità integrata che ti consente di utilizzare le funzioni del bot al di fuori della chat con esso. Sulla base di questa istruzione, puoi creare qualsiasi semplice bot con altre funzioni, non solo quello che mostrerà i tassi di cambio. Non aver paura di sperimentare librerie, API e codice per creare un assistente automatizzato che chatterà con i clienti su Telegram e rafforzerà la connessione delle persone interessate con l'azienda.

1 Commenti

  1. Fantastica pubblicazione

Lascia un Commento