Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Boty w Telegramie to programy, które pomagają nawiązać kontakt z odbiorcami lub uprościć czynności, które wcześniej musiały być wykonywane ręcznie. Te programy są napisane specjalnie dla platformy komunikatora. Boty działają w ten sposób: użytkownik wysyła polecenie poprzez linię wejściową, a system odpowiada tekstem lub interaktywną wiadomością. Czasami program imituje nawet działania realnej osoby – taki bot wzbudza większe zaufanie wśród klientów.

Istnieje kilka rodzajów systemów automatycznej pomocy użytkownikom. Niektóre boty po prostu komunikują się z klientami, inne regularnie dostarczają informacji. Nie da się jednoznacznie podzielić programów na typy – programiści często łączą kilka funkcji w jednym bocie.

Możesz napisać prostego bota dla Telegrama z interaktywnymi elementami w postaci przycisków ekranowych w 9 krokach. Przyjrzyjmy się każdemu z nich szczegółowo i odpowiedzmy na kilka pytań:

  • jak uruchomić bota;
  • jak zarejestrować wbudowaną klawiaturę z jednego lub więcej przycisków;
  • jak zaprogramować przyciski dla żądanych funkcji;
  • co to jest tryb inline i jak go skonfigurować dla istniejącego bota.

Krok 0: teoretyczne podstawy interfejsu API botów Telegram

Głównym narzędziem używanym do tworzenia botów Telegram jest interfejs programowania aplikacji HTML lub API HTML. Ten element akceptuje prośby odwiedzających i wysyła odpowiedzi w formie informacji. Gotowe projekty ułatwiają pracę nad programem. Aby napisać bota dla Telegrama, musisz użyć tego adresu e-mail: https://api.telegram.org/bot/NAZWA_METODY

Do prawidłowego działania bota potrzebny jest również token – kombinacja znaków, która chroni program i otwiera do niego dostęp zaufanym programistom. Każdy token jest unikalny. Ciąg jest przypisywany do bota podczas tworzenia. Metody mogą być różne: getUpdates, getChat i inne. Wybór metody zależy od tego, jakiego algorytmu programiści oczekują od bota. Przykład tokena:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Boty używają żądań GET i POST. Często parametry metody wymagają uzupełnienia – np. gdy metoda sendMessage ma wysyłać identyfikator czatu i tekst. Parametry doprecyzowania metody można przekazać jako ciąg zapytania adresu URL przy użyciu aplikacji/x-www-form-urlencoded lub za pośrednictwem aplikacji-json. Te metody nie nadają się do pobierania plików. Wymagane jest również kodowanie UTF-8. Wysyłając żądanie do API, możesz otrzymać wynik w formacie JSON. Spójrz na reakcję programu na pobieranie informacji za pomocą metody getME:

POBIERZ https://api.telegram.org/bot/getMe{ ok: true, wynik: { id: 231757398, first_name: "bot kursu wymiany", nazwa użytkownika: "exchangetestbot" } }

Wynik zostanie uzyskany, jeśli ok równa się prawdziwy. W przeciwnym razie system wskaże błąd.

Istnieją dwa sposoby na otrzymywanie niestandardowych wiadomości w botach. Obie metody są skuteczne, ale są odpowiednie w różnych przypadkach. Aby otrzymać komunikaty, możesz ręcznie napisać żądanie za pomocą metody getUpdates – program wyświetli na ekranie tablicę danych Update. Żądania należy wysyłać regularnie, po przeanalizowaniu każdej tablicy wysyłanie jest powtarzane. Przesunięcie to parametr określający liczbę pominiętych rekordów przed załadowaniem nowego wyniku, aby uniknąć ponownego pojawienia się zaznaczonych obiektów. Korzyści z metody getUpdates wejdą w życie, jeśli:

  • nie ma możliwości skonfigurowania HTTPS;
  • stosowane są złożone języki skryptowe;
  • serwer bota zmienia się od czasu do czasu;
  • bot jest załadowany użytkownikami.

Drugą metodą, którą można napisać w celu odbierania wiadomości użytkownika, jest setWebhook. Jest używany jednorazowo, nie ma potrzeby ciągłego wysyłania nowych żądań. Element webhook wysyła aktualizacje danych na określony adres URL. Ta metoda wymaga certyfikatu SSL. Webhook przyda się w takich przypadkach:

  • stosowane są języki programowania internetowego;
  • bot nie jest przeciążony, nie ma zbyt wielu użytkowników;
  • serwer się nie zmienia, program pozostaje na tym samym serwerze przez długi czas.

W dalszych instrukcjach użyjemy getUpdates.

Usługa @BotFather Telegram jest przeznaczona do tworzenia botów czatowych. Za pomocą tego systemu ustalane są również podstawowe ustawienia – BotFather pomoże Ci zrobić opis, wstawić zdjęcie profilowe, dodać narzędzia wsparcia. Biblioteki – zestawy żądań HTML dla botów Telegram – są dostępne w Internecie, jest ich całkiem sporo. Podczas tworzenia przykładowego programu wykorzystano pyTelegramBotApi.

Krok 1: Wdrażanie żądań kursów wymiany

Najpierw musisz napisać kod, który wykonuje zapytania. Użyjemy podczas pisania API PrivatBank, poniżej znajduje się link do niego: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Musisz użyć tych metod w swoim kodzie:

  • load_exchange – wyszukuje kursy walut i wyświetla zakodowane informacje;
  • get_exchange – wyświetla dane o konkretnej walucie;
  • get_exchanges – pokazuje listę walut według próbki.

W rezultacie kod w pliku pb.py wygląda tak:

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(): jeśli re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nie jest Brak: result.append(exc) zwraca wynik

Program może wydać następującą odpowiedź na określone żądania:

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

Krok 2: Utwórz bota Telegrama za pomocą @BotFather

Możesz stworzyć program do odbierania wiadomości i odpowiadania na nie za pomocą usługi @BotFather. Przejdź do jego strony Telegram i wprowadź polecenie /newbot. Na czacie pojawią się instrukcje, zgodnie z którymi należy najpierw wpisać nazwę bota, a następnie jego adres. Po utworzeniu konta bota na ekranie pojawi się wiadomość powitalna zawierająca token. Do dalszej konfiguracji użyj tych poleceń:

  • /setdescription – opis;
  • /setabouttext – informacje o nowym bocie;
  • /setuserpic – zdjęcie profilowe;
  • /setinline – tryb wbudowany;
  • /setcommands – opis poleceń.

W ostatnim kroku konfiguracji opisujemy /help i /exchange. Po wykonaniu wszystkich kroków nadszedł czas, aby przejść do kodowania.

Krok 3: Konfiguracja i uruchomienie bota

Stwórzmy plik config.py. W nim musisz określić unikalny kod bota oraz strefę czasową, w której program znajdzie informacje.

TOKEN = '' # zastąp tokenem swojego botaTIMEZONE = 'Europa/Kijów' TIMEZONE_COMMON_NAME = 'Kijów'

Następnie tworzymy kolejny plik z importem wcześniej napisanego pb.py, bibliotek i innych niezbędnych komponentów. Brakujące biblioteki są instalowane z systemu zarządzania pakietami (pip).

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

Wykorzystajmy zawartość pyTelegramBotApi do stworzenia bota. Otrzymany token wysyłamy za pomocą następującego kodu:

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

Parametr none_stop zapewnia ciągłe wysyłanie żądań. Na działanie parametru nie będą miały wpływu błędy metody.

Krok 4: Napisz /start Command Handler

Jeśli wszystkie poprzednie kroki zostały wykonane poprawnie, bot zaczął działać. Program regularnie generuje żądania, ponieważ wykorzystuje metodę getUpdates. Przed linią z elementem none_stop potrzebujemy fragmentu kodu, który przetwarza polecenie /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Pozdrowienia! Mogę pokazać kursy walut.n' + 'Aby uzyskać kursy walut naciśnij / exchange.n' + 'Aby uzyskać pomoc, naciśnij /help.' )

RџСўРё command=['start'] równy Prawdzie start_command jest wywoływana. Tam trafia treść wiadomości. Następnie musisz zaimplementować funkcję wysyłania_wiadomość w odniesieniu do konkretnego przekazu.

Krok 5: Utwórz /help Command Handler

Komenda /help może być zaimplementowana jako przycisk. Klikając na niego, użytkownik zostanie przeniesiony na konto Telegrama programisty. Nadaj przyciskowi nazwę, na przykład „Zapytaj programistę”. Ustaw parametr reply_markup, który przekierowuje użytkownika do odnośnika, dla metody send_message. Napiszmy w kodzie parametr tworzący klawiaturę (InlineKeyboardMarkup). Potrzebujesz tylko jednego przycisku (InlineKeyboardButton).

Ostateczny kod obsługi poleceń wygląda tak:

@bot.message_handler(commands=['help']) def help_command(wiadomość): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Zapytaj programistę', url='ваша ссылка на профиль' ) ) bot.send_message( wiadomość.chat.id, '1) Aby otrzymać listę dostępnych walut naciśnij /exchange.n' + '2) Kliknij na walutę, która Cię interesuje.n' + '3) Ty otrzyma wiadomość zawierającą informacje dotyczące waluty źródłowej i docelowej, ' + 'kursy kupna i ceny sprzedaży.n' + '4) Kliknij „Aktualizuj”, aby otrzymać aktualne informacje dotyczące zapytania. ' + 'Bot pokaże również różnicę między poprzednim a obecnym kursem wymiany.n' + '5) Bot obsługuje inline. Rodzaj @ na dowolnym czacie i pierwszych liter waluty.', reply_markup=keyboard )

Akcja kodu w czacie Telegrama:

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Krok 6: Dodawanie obsługi poleceń /exchange

Ten krok jest potrzebny do wyświetlenia na czacie przycisków z symbolami dostępnych walut. Klawiatura ekranowa z opcjami pomoże Ci uniknąć błędów. PrivatBank dostarcza informacji na temat rubla, dolara i euro. Opcja InlineKeyboardButton działa w następujący sposób:

  1. Użytkownik klika przycisk z żądanym oznaczeniem.
  2. getUpdates odbiera wywołanie zwrotne (CallbackQuery).
  3. Staje się wiadome, jak obsługiwać naciśnięcie klawiatury – przekazywana jest informacja o wciśniętym przycisku.

/kod obsługi wymiany:

@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, 'Kliknij wybraną walutę:', reply_markup=keyboard )

Wynik kodu w Telegramie:

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Krok 7: Pisanie obsługi wbudowanych przycisków klawiatury

Pakiet pyTelegramBot Api zawiera funkcję dekoratora @bot.callback_query_handler. Ten komponent ma na celu przetłumaczenie wywołania zwrotnego na funkcję – API rozpakowuje i ponownie tworzy wywołanie. Pisze się tak:

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

Napiszmy też metodę get_ex_callback:

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

Jest jeszcze jedna przydatna metoda – answer_callback_query. Pomaga usunąć obciążenie między naciśnięciem przycisku a wyświetleniem wyniku na ekranie. Możesz wysłać wiadomość do send_exchange_query, podając kod waluty i wiadomość. Napiszmy send_exchange_result:

def send_exchange_result(wiadomość, 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' )

Gdy chatbot otrzymuje wynik zapytania z banku API, odwiedzający widzi napis „wpisywanie wiadomości”. Wygląda na to, że odpowiada prawdziwa osoba. Aby wyświetlić taki wskaźnik na ekranie, musisz dodać linie stanu wejścia. Następnie użyjemy get_exchange – z jego pomocą program otrzyma oznaczenie waluty (ruble, euro lub dolary). send_message używa dodatkowych metod: serialize_ex konwertuje walutę na inny format, a get_update_keyboard ustawia klawisze programowe, które aktualizują informacje i wysyłają dane rynku walutowego do innych czatów.

Napiszmy kod dla get_update_keyboard. Należy wspomnieć o dwóch przyciskach – t i e oznaczają typ i wymianę. Element switch_inline_query dla przycisku Udostępnij jest potrzebny, aby użytkownik mógł wybierać spośród kilku czatów. Odwiedzający będzie mógł wybrać, do kogo przesłać aktualny kurs dolara, rubla lub euro.

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 ('Udostępnij', switch_inline_query=ex['ccy']) ) powróć klawiatura

Czasami trzeba zobaczyć, jak bardzo zmienił się kurs wymiany w krótkim czasie. Napiszmy dwie metody dla przycisku Aktualizuj, aby użytkownicy mogli zobaczyć kursy w porównaniu.

Różnica między kursami wymiany jest przekazywana do serializatora za pomocą parametru diff.

Zalecone metody działają dopiero po aktualizacji danych, nie będą miały wpływu na pierwsze wyświetlenie kursu.

def serialize_ex(ex_json, diff=Brak): wynik = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Kup: ' + ex_json['kup'] if diff: wynik += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sprzedaj: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: wynik += 'nSell: ' + ex_json['sale'] + 'n' zwróć wynik def serialize_exchange_diff(diff): wynik = '' if diff > 0: wynik = '(' + str(różnic) + ' " 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: wynik = '(' + 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">)' zwraca wynik

Wyobraź sobie, że odwiedzający chciał poznać kurs dolara. Oto, co się stanie, jeśli w wiadomości wybierzesz USD:

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Krok 8: Implementacja obsługi przycisku aktualizacji

Napiszmy kod do obsługi akcji za pomocą przycisku Aktualizuj i dodajmy do niego część iq_callback_method. Gdy pozycje programu zaczynają się od parametru get, musisz napisać get_ex_callback. W innych sytuacjach parsujemy JSON i próbujemy uzyskać klucz 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(zapytanie) z wyjątkiem ValueError: pass

Jeśli t jest równe u, będziesz musiał napisać program dla metody edit_message_callback. Podzielmy ten proces krok po kroku:

  1. Pobieranie aktualnych informacji o stanie rynku walutowego (exchange_now = pb.get_exchange(data['c']).
  1. Pisanie nowej wiadomości przez serializator z diff.
  2. Dodanie podpisu (get_edited_signature).

Jeśli początkowa wiadomość się nie zmieni, wywołaj metodę 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_mes : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Napiszmy metodę get_ex_from_iq_data do parsowania JSON:

def get_ex_from_iq_data(exc_json): return { 'kup': exc_json['b'], 'sprzedaż': exc_json['s'] }

Potrzebujesz jeszcze kilku metod: na przykład get_exchange_diff, która odczytuje stare i nowe informacje o kosztach walut i wyświetla różnicę.

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

Ostatni, get_edited_signature, pokazuje czas ostatniej aktualizacji kursu.

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

W efekcie zaktualizowana wiadomość od bota ze stabilnym kursem walut wygląda tak:

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Gdy kurs się zmienia, w komunikacie wyświetlane są różnice między wartościami ze względu na zalecone parametry.

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Krok 9: Implementacja trybu osadzonego

Wbudowany tryb jest potrzebny do szybkiego przesyłania informacji z programu na dowolny czat – teraz nie musisz dodawać bota do rozmowy jako uczestnik. Gdy użytkownik Telegrama wprowadzi nazwę bota ze znakiem @ przed nim, opcje konwersji powinny pojawić się nad wierszem wprowadzania. Jeśli klikniesz na jeden z elementów, bot wyśle ​​wiadomość do konwersacji z wynikami i przyciskami do aktualizacji i wysyłania danych. Imię i nazwisko nadawcy będzie zawierać podpis „przez ".

InlineQuery jest przekazywane do query_text za pośrednictwem biblioteki. Kod używa funkcji answer_line do pobierania wyników wyszukiwania jako tablicy danych i elementu inline_query_id. Używamy get_exchanges, aby bot na żądanie znalazł kilka walut.

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

Przekazujemy tablicę danych do get_iq_articles, aby za pomocą tej metody zwrócić obiekty z InlineQueryResultArticle.

def get_iq_articles(giełdy): wynik = [] dla exc na giełdach: 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 ) ) zwróć wynik

Teraz, jeśli napiszesz @ oraz spację w wierszu, na ekranie pojawią się wyniki wyszukiwania – opcje przeliczenia na trzy dostępne waluty.

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Użytkownicy mogą filtrować wyniki, wprowadzając żądaną walutę.

Po kliknięciu na wybraną walutę z listy czat otrzymuje tę samą wiadomość, którą otrzymują użytkownicy bota. Możesz także użyć przycisku Aktualizuj. Poniższy obrazek pokazuje zaktualizowaną wiadomość wysłaną przez bota:

Bot telegramu w Pythonie. Kompletny przewodnik po pisaniu bota z kursami wymiany od podstaw

Wnioski

Teraz wiesz, jak stworzyć bota dla Telegrama. Możesz dodać do swojego programu przydatne narzędzia: przyciski do aktualizacji i wysyłania wyników innym użytkownikom komunikatora oraz wbudowany tryb, który pozwala korzystać z funkcji bota poza czatem z nim. Na podstawie tej instrukcji możesz stworzyć dowolnego prostego bota z innymi funkcjami – nie tylko tego, który będzie pokazywał kursy walut. Nie bój się eksperymentować z bibliotekami, interfejsami API i kodem, aby stworzyć zautomatyzowanego asystenta, który porozmawia z klientami na Telegramie i wzmocni połączenie zainteresowanych osób z firmą.

1 Komentarzy

  1. Fantastyczna publikacja

Dodaj komentarz