Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

„Telegram“ robotai yra programos, padedančios užmegzti ryšį su auditorija arba supaprastinti veiksmus, kuriuos anksčiau reikėjo atlikti rankiniu būdu. Šios programos sukurtos specialiai „Messenger“ platformai. Botai veikia taip: vartotojas siunčia komandą per įvesties eilutę, o sistema atsako tekstiniu arba interaktyviu pranešimu. Kartais programa netgi imituoja tikro žmogaus veiksmus – toks botas įkvepia didesnį klientų pasitikėjimą.

Yra kelių tipų automatinės pagalbos vartotojams sistemos. Vieni botai tiesiog bendrauja su klientais, kiti nuolat teikia informaciją. Aiškiai suskirstyti programas į tipus neįmanoma – kūrėjai dažnai viename bote sujungia kelias funkcijas.

9 žingsniais galite parašyti paprastą „Telegram“ robotą su interaktyviais elementais ekrano mygtukais. Pažvelkime į kiekvieną iš jų išsamiai ir atsakykime į keletą klausimų:

  • kaip paleisti robotą;
  • kaip užregistruoti integruotą klaviatūrą iš vieno ar kelių mygtukų;
  • kaip užprogramuoti norimų funkcijų mygtukus;
  • kas yra tiesioginis režimas ir kaip jį nustatyti esamam robotui.

0 veiksmas: teorinis pagrindas apie „Telegram“ robotų API

Pagrindinis įrankis, naudojamas kuriant „Telegram“ robotus, yra HTML programų programavimo sąsaja arba HTML API. Šis elementas priima lankytojų užklausas ir siunčia atsakymus informacijos forma. Paruošti dizainai supaprastina darbą su programa. Norėdami parašyti „Telegram“ robotą, turite naudoti šį el. pašto adresą: https://api.telegram.org/bot/METHOD_NAME

Kad robotas tinkamai veiktų, reikalingas ir tokenas – simbolių kombinacija, kuri apsaugo programą ir atveria prieigą prie jos patikimiems kūrėjams. Kiekvienas žetonas yra unikalus. Eilutė priskiriama robotui jį sukūrus. Metodai gali būti skirtingi: getUpdates, getChat ir kt. Metodo pasirinkimas priklauso nuo to, kokio algoritmo kūrėjai tikisi iš roboto. Ženklo pavyzdys:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Botai naudoja GET ir POST užklausas. Metodo parametrus dažnai tenka papildyti – pavyzdžiui, kai sendMessage metodas turėtų išsiųsti pokalbio ID ir šiek tiek teksto. Metodo patikslinimo parametrus galima perduoti kaip URL užklausos eilutę naudojant application/x-www-form-urlencoded arba application-json. Šie metodai netinka failams atsisiųsti. Taip pat reikalingas UTF-8 kodavimas. Išsiųsdami užklausą į API, galite gauti rezultatą JSON formatu. Pažiūrėkite į programos atsaką į informacijos gavimą naudojant getME metodą:

GAUTI https://api.telegram.org/bot/getMe{ ok: tiesa, rezultatas: { id: 231757398, vardas: "Exchange Rate Bot", vartotojo vardas: "exchangetestbot" } }

Rezultatas bus gautas, jei ok lygus tiesa. Priešingu atveju sistema parodys klaidą.

Yra du būdai gauti pasirinktinius pranešimus robotuose. Abu metodai yra veiksmingi, tačiau tinka įvairiais atvejais. Norėdami gauti pranešimus, galite rankiniu būdu parašyti užklausą getUpdates metodu – programa ekrane parodys duomenų masyvą Atnaujinti. Prašymai turi būti siunčiami reguliariai, išanalizavus kiekvieną masyvą, siuntimas kartojamas. Poslinkis yra parametras, kuris nustato praleistų įrašų skaičių prieš įkeliant naują rezultatą, kad būtų išvengta pakartotinio patikrintų objektų pasirodymo. GetUpdates metodo pranašumai pasireikš, jei:

  • nėra galimybės sukonfigūruoti HTTPS;
  • naudojamos sudėtingos scenarijų kalbos;
  • bot serveris laikas nuo laiko keičiasi;
  • botas yra prikrautas vartotojų.

Antrasis būdas, kurį galima parašyti norint gauti vartotojo pranešimus, yra setWebhook. Jis naudojamas vieną kartą, nereikia nuolat siųsti naujų užklausų. Webhook siunčia duomenų atnaujinimus nurodytu URL. Šis metodas reikalauja SSL sertifikato. Webhook bus naudingas šiais atvejais:

  • naudojamos žiniatinklio programavimo kalbos;
  • botas nėra perkrautas, nėra per daug vartotojų;
  • serveris nesikeičia, programa išlieka tame pačiame serveryje ilgą laiką.

Tolesnėse instrukcijose naudosime getUpdates.

@BotFather Telegram paslauga skirta kurti pokalbių robotus. Per šią sistemą nustatomi ir pagrindiniai nustatymai – BotFather padės padaryti aprašymą, įdės profilio nuotrauką, pridės palaikymo įrankius. Bibliotekos – HTML užklausų rinkiniai Telegram robotams – yra internete, jų yra gana daug. Kuriant pavyzdinę programą buvo naudojama pyTelegramBotApi.

1 veiksmas: valiutos kurso užklausų įgyvendinimas

Pirmiausia turite parašyti kodą, kuris atlieka užklausas. Rašydami PrivatBank API naudosime, žemiau yra nuoroda į ją: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Kode turite naudoti šiuos metodus:

  • load_exchange – suranda valiutų kursus ir rodo užkoduotą informaciją;
  • get_exchange – rodo duomenis apie konkrečią valiutą;
  • get_exchanges – rodo valiutų sąrašą pagal pavyzdį.

Dėl to kodas pb.py faile atrodo taip:

importuoti pakartotinai importuoti užklausas importuoti 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) ): exc in load_exchange(): if ccy_key == exc['ccy']: return exc return Klaidingas def get_exchanges(ccy_pattern): rezultatas = [] ccy_pattern = re.escape(ccy_pattern) + '.*' exc in load_exchange(): jei re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) nėra Nėra: result.append(exc) grąžina rezultatą

Programa gali pateikti tokį atsakymą į nurodytas užklausas:

[ { ccy:"USD", base_ccy:"UAH", pirk:"25.90000", pardavimas:"26.25000" }, { ccy:"EUR", base_ccy:"UAH", pirk:"29.10000", pardavimas:"29.85000" " }, { ccy:"RUR", base_ccy:"UAH", pirkti:"0.37800", išpardavimas:"0.41800" }, { ccy:"BTC", base_ccy:"USD", pirkti:"11220.0384", išpardavimas: "12401.0950" } ]

2 veiksmas: sukurkite „Telegram Bot“ naudodami @BotFather

Galite sukurti programą, skirtą žinutėms priimti ir į juos atsakyti, naudodami @BotFather paslaugą. Eikite į jo „Telegram“ puslapį ir įveskite komandą /newbot. Pokalbyje pasirodys instrukcijos, pagal kurias pirmiausia turite užsirašyti boto pavadinimą, o tada adresą. Kai bus sukurta roboto paskyra, ekrane pasirodys pasveikinimo pranešimas su prieigos raktu. Norėdami atlikti tolesnę konfigūraciją, naudokite šias komandas:

  • /setdescription – aprašymas;
  • /setabouttext – informacija apie naują robotą;
  • /setuserpic – profilio nuotrauka;
  • /setinline – eilutinis režimas;
  • /setcommands – komandų aprašymas.

Paskutiniame konfigūracijos etape aprašome /help ir /exchange. Kai visi veiksmai bus atlikti, laikas pereiti prie kodavimo.

3 veiksmas: nustatykite ir paleiskite robotą

Sukurkime config.py failą. Jame reikia nurodyti unikalų boto kodą ir laiko juostą, kurioje programa ras informaciją.

TOKEN = '' # pakeisti savo roboto prieigos raktuTIMEZONE = 'Europa/Kijevas' TIMEZONE_COMMON_NAME = 'Kijevas'

Toliau sukuriame kitą failą su importuotu anksčiau parašytu pb.py, bibliotekomis ir kitais reikalingais komponentais. Trūkstamos bibliotekos įdiegiamos iš paketų valdymo sistemos (pip).

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

Norėdami sukurti robotą, naudokime pyTelegramBotApi turinį. Išsiunčiame gautą žetoną naudodami šį kodą:

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

Parametras none_stop užtikrina, kad užklausos būtų siunčiamos nuolat. Metodo klaidos parametro veikimui įtakos neturės.

4 veiksmas: parašykite /start komandų tvarkyklę

Jei visi ankstesni veiksmai atliekami teisingai, robotas pradėjo veikti. Programa reguliariai generuoja užklausas, nes naudoja getUpdates metodą. Prieš eilutę su elementu none_stop mums reikia kodo, kuris apdoroja komandą /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Sveiki! Galiu parodyti valiutų kursus.n' + 'Norėdami sužinoti valiutų kursus paspauskite / exchange.n' + 'Jei norite gauti pagalbos, paspauskite /help.')

RџSЂRё commands=['pradėti'] lygus Tiesa iškviečiama start_command. Pranešimo turinys eina ten. Tada turite įdiegti siuntimo funkciją_pranešimas tam tikros žinutės atžvilgiu.

5 veiksmas: sukurkite /help komandų tvarkyklę

Komanda /help gali būti įgyvendinta kaip mygtukas. Paspaudus ant jo, vartotojas bus nukreiptas į kūrėjo „Telegram“ paskyrą. Suteikite mygtukui pavadinimą, pvz., „Klauskite kūrėjo“. Metodui send_message nustatykite parametrą reply_markup, kuris nukreipia vartotoją į nuorodą. Kode įrašykime parametrą, kuris sukuria klaviatūrą (InlineKeyboardMarkup). Jums reikia tik vieno mygtuko (InlineKeyboardButton).

Galutinis komandų tvarkyklės kodas atrodo taip:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Klauskite kūrėjo', url='валкаа насы профиль' ) ) bot.send_message( message.chat.id, '1) Norėdami gauti galimų valiutų sąrašą, paspauskite /exchange.n' + '2) Spustelėkite jus dominančią valiutą.n' + '3) Jūs gaus pranešimą su informacija apie šaltinį ir tikslines valiutas, ' + 'pirkimo kursai ir pardavimo kursai.n' + '4) Spustelėkite "Atnaujinti", kad gautumėte naujausią informaciją apie užklausą. ' + 'Bot taip pat parodys skirtumą tarp ankstesnio ir dabartinio valiutų kursų.n' + '5) Botas palaiko tiesioginį. Įveskite @ bet kuriame pokalbyje ir pirmosios valiutos raidės.', reply_markup=keyboard )

Kodo veiksmas „Telegram“ pokalbyje:

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

6 veiksmas: pridėkite /exchange komandų tvarkyklę

Šis veiksmas reikalingas norint pokalbyje rodyti mygtukus su galimų valiutų simboliais. Ekrano klaviatūra su parinktimis padės išvengti klaidų. „PrivatBank“ teikia informaciją apie rublį, dolerį ir eurą. InlineKeyboardButton parinktis veikia taip:

  1. Vartotojas spusteli mygtuką su norimu pavadinimu.
  2. getUpdates gauna atgalinį skambutį (CallbackQuery).
  3. Tampa žinoma, kaip elgtis paspaudus klaviatūrą – perduodama informacija apie paspaustą mygtuką.

/keitimo tvarkyklės kodas:

@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, 'Spustelėkite pasirinktą valiutą:', reply_markup=keyboard )

Kodo rezultatas „Telegram“:

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

7 veiksmas: parašykite įtaisytųjų klaviatūros mygtukų tvarkyklę

PyTelegramBot Api pakete yra @bot.callback_query_handler dekoratoriaus funkcija. Šis komponentas skirtas atgalinį skambutį paversti funkcija – API išskleidžia ir iš naujo sukuria skambutį. Jis rašomas taip:

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

Taip pat parašykime metodą get_ex_callback:

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

Yra dar vienas naudingas metodas – atsakymo_atskambinimo_užklausa. Tai padeda pašalinti apkrovą nuo mygtuko paspaudimo iki rezultato rodymo ekrane. Galite išsiųsti pranešimą į send_exchange_query, perduodami tam tikrą valiutos kodą ir pranešimą. Parašykime 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_up ), parse_mode='HTML')

Kol pokalbių robotas gauna užklausos rezultatą iš banko API, lankytojas mato užrašą „rašant žinutę“. Atrodo, kad atsako tikras žmogus. Kad toks indikatorius būtų rodomas ekrane, turėsite pridėti įvesties būsenos eilutes. Toliau naudosime get_exchange – jos pagalba programa gaus valiutos žymėjimą (rubliai, eurai arba doleriai). send_message naudoja papildomus metodus: serialize_ex konvertuoja valiutą į kitą formatą, o get_update_keyboard nustato programinius klavišus, kurie atnaujina informaciją ir siunčia valiutos rinkos duomenis į kitus pokalbius.

Parašykime get_update_keyboard kodą. Reikia paminėti du mygtukus – t ir e žymi tipą ir keitimą. Mygtuko „Bendrinti“ elementas „Switch_inline_query“ reikalingas, kad vartotojas galėtų rinktis iš kelių pokalbių. Lankytojas galės pasirinkti, kam siųsti einamąjį dolerio, rublio ar euro kursą.

def get_update_keyboard(ex): klaviatūra = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('Atnaujinti', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['pirkti'], 's': ex['išpardavimas'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton („Bendrinti“, switch_inline_query=ex['ccy']) ) grąžinti klaviatūrą

Kartais reikia pamatyti, kiek pasikeitė valiutos kursas per trumpą laiką. Parašykime du mygtuko Atnaujinti metodus, kad vartotojai galėtų palyginti kursus.

Valiutų kursų skirtumas perduodamas serializatoriui per skirtumo parametrą.

Nustatyti metodai veikia tik atnaujinus duomenis, jie neturės įtakos pirmajam kurso atvaizdavimui.

def serialize_ex(ex_json, diff=nėra): rezultatas = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Pirkti: ' + ex_json['pirkti'], jei skirtumas: rezultatas += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Parduoti: ' + ex_json['išpardavimas'] +' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: rezultatas += 'nPardavimas: ' + ex_json['pardavimas'] + 'n' grąžina rezultatą def serialize_exchange_diff(diff): rezultatas = '' if diff > 0: rezultatas = '(' + 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 skirtumas < 0: rezultatas = '(' + 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">)" grąžinimo rezultatas

Įsivaizduokite, kad lankytojas norėjo sužinoti dolerio kursą. Štai kas atsitiks, jei pranešime pasirinksite USD:

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

8 veiksmas: naujinimo mygtuko tvarkyklės įdiegimas

Parašykime kodą veiksmų tvarkymui mygtuku Atnaujinti ir prie jo pridėkime iq_callback_method dalį. Kai programos elementai prasideda parametru get, turite parašyti get_ex_callback. Kitose situacijose analizuojame JSON ir bandome gauti raktą 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) išskyrus ValueError: perduoti

Jei t lygus u, turėsite parašyti programą, skirtą edit_message_callback metodui. Išskaidykime šį procesą žingsnis po žingsnio:

  1. Atsisiunčiama naujausia informacija apie valiutų rinkos būklę (exchange_now = pb.get_exchange(data['c']).
  1. Naujos žinutės rašymas per serializatorių su dif.
  2. Parašo pridėjimas (get_edited_signature).

Jei pradinis pranešimas nesikeičia, iškvieskite 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)), mainai + 'n' + get_edited_signature(), jei query.message: bot.edit_message_text( text, query.message.chat.id, query.message.message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode_el_query'ssage. : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Parašykime metodą get_ex_from_iq_data JSON analizei:

def get_ex_from_iq_data(exc_json): return { 'pirkti': exc_json['b'], 'išpardavimas': exc_json['s'] }

Jums reikės dar kelių metodų: pavyzdžiui, get_exchange_diff, kuris nuskaito seną ir naują informaciją apie valiutų kainą ir parodo skirtumą.

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

Paskutinis, get_edited_signature, rodo laiką, kada kursas buvo paskutinį kartą atnaujintas.

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

Dėl to atnaujintas pranešimas iš roboto su stabiliu valiutos kursu atrodo taip:

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

Pasikeitus kursui, skirtumai tarp reikšmių rodomi pranešime dėl nustatytų parametrų.

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

9 veiksmas: įterptojo režimo diegimas

Integruotas režimas reikalingas norint greitai siųsti informaciją iš programos į bet kurį pokalbį – dabar jums nereikia pridėti boto prie pokalbio kaip dalyvio. Kai „Telegram“ vartotojas įveda roboto pavadinimą su @ ženklu priešais jį, konversijos parinktys turėtų būti rodomos virš įvesties eilutės. Jei spustelėsite vieną iš elementų, robotas išsiųs pranešimą į pokalbį su rezultatais ir duomenų atnaujinimo bei siuntimo mygtukais. Siuntėjo varde bus antraštė „per ".

InlineQuery perduodama į query_text per biblioteką. Kodas naudoja funkciją answer_line, kad gautų paieškos rezultatus kaip duomenų masyvą ir elementą inline_query_id. Naudojame get_exchanges, kad robotas pagal pageidavimą rastų kelias valiutas.

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

Duomenų masyvą perduodame get_iq_articles, kad šiuo metodu grąžintume objektus iš InlineQueryResultArticle.

def get_iq_articles(exchanges): result = [] exc biržose: 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='Konvertuoti ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) grąžinti rezultatą

Dabar, jei parašysite @ ir tarpas eilutėje, ekrane pasirodys paieškos rezultatai – parinktys konvertuoti į tris galimas valiutas.

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

Vartotojai gali filtruoti rezultatus įvesdami norimą valiutą.

Sąraše paspaudus norimą valiutą, pokalbis gauna tą patį pranešimą, kurį gauna botų vartotojai. Taip pat galite naudoti mygtuką Atnaujinti. Žemiau esančiame paveikslėlyje parodytas atnaujintas pranešimas, išsiųstas per robotą:

Telegramos robotas Python. Išsamus vadovas, kaip parašyti robotą su valiutų kursais nuo nulio

Išvada

Dabar jūs žinote, kaip sukurti „Telegram“ robotą. Prie savo programos galite pridėti naudingų įrankių: mygtukų, skirtų atnaujinti ir siųsti rezultatą kitiems „Messenger“ vartotojams, ir įtaisytąjį režimą, leidžiantį naudoti roboto funkcijas ne pokalbyje su juo. Remdamiesi šia instrukcija, galite sukurti bet kokį paprastą robotą su kitomis funkcijomis – ne tik tą, kuris rodys valiutų kursus. Nebijokite eksperimentuoti su bibliotekomis, API ir kodu, kad sukurtumėte automatizuotą asistentą, kuris bendraus su klientais per „Telegram“ ir sustiprins susidomėjusių žmonių ryšį su įmone.

1 Komentuoti

Palikti atsakymą