Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

Telegram-eko bot-ak entzuleekin kontaktua ezartzen edo lehen eskuz egin behar ziren ekintzak errazten laguntzen duten programak dira. Programa hauek messenger plataformarako bereziki idatzita daude. Bot-ek horrela funtzionatzen dute: erabiltzaileak komando bat bidaltzen du sarrera-lerroaren bidez, eta sistemak testu edo mezu interaktibo batekin erantzuten du. Batzuetan, programak pertsona erreal baten ekintzak imitatzen ditu; hala nola, bot batek bezeroen artean konfiantza handiagoa sortzen du.

Erabiltzaileei automatikoki laguntzeko hainbat sistema mota daude. Bot batzuk bezeroekin soilik komunikatzen dira, beste batzuk aldizka informazioa ematen dute. Ezinezkoa da programak argi eta garbi motatan banatzea - ​​garatzaileek askotan hainbat funtzio konbinatzen dituzte bot batean.

Telegramerako bot soil bat idatz dezakezu pantailako botoien formako elementu interaktiboekin 9 urratsetan. Ikus ditzagun horietako bakoitza zehatz-mehatz eta erantzun diezaiogun galdera batzuei:

  • bot bat nola abiarazi;
  • nola erregistratu teklatu integratua botoi batetik edo gehiagotik;
  • nahi diren funtzioetarako botoiak nola programatu;
  • zer den lineako modua eta nola konfiguratu lehendik dagoen bot baterako.

0. urratsa: Telegram bots APIari buruzko aurrekari teorikoak

Telegram bot-ak sortzeko erabiltzen den tresna nagusia HTML Aplikazioen Programazio Interfazea edo HTML APIa da. Elementu honek bisitarien eskaerak onartzen ditu eta erantzunak bidaltzen ditu informazio moduan. Prestatutako diseinuek programaren lana errazten dute. Telegram-erako bot bat idazteko, helbide elektroniko hau erabili behar duzu: https://api.telegram.org/bot/METHOD_NAME

Botaren funtzionamendu zuzena izateko, token bat ere behar da: programa babesten duen eta garatzaile fidagarriei sarbidea irekitzen dien karaktereen konbinazioa. Token bakoitza bakarra da. Katea bot-ari esleitzen zaio sortzean. Metodoak desberdinak izan daitezke: getUpdates, getChat eta beste batzuk. Metodoaren aukeraketa garatzaileek botetik espero duten algoritmoaren araberakoa da. Token adibidea:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bot-ek GET eta POST eskaerak erabiltzen dituzte. Metodoaren parametroak osatu behar dira askotan, adibidez, sendMessage metodoak txataren IDa eta testu batzuk bidali behar dituenean. Metodoa finkatzeko parametroak URL kontsulta-kate gisa pasa daitezke application/x-www-form-urlencoded erabiliz edo application-json bidez. Metodo hauek ez dira egokiak fitxategiak deskargatzeko. UTF-8 kodeketa ere beharrezkoa da. APIra eskaera bat bidaliz gero, emaitza JSON formatuan lor dezakezu. Begiratu programaren erantzuna getME metodoaren bidez informazioa berreskuratzeko:

Lortu https://api.telegram.org/bot/getMe{ ok: egia, emaitza: { id: 231757398, first_name: "Truke-tasa Bot", erabiltzaile-izena: "exchangetestbot" } }

Emaitza lortuko da ok berdinen Egia. Bestela, sistemak errore bat adieraziko du.

Botetan mezu pertsonalizatuak lortzeko bi modu daude. Bi metodoak eraginkorrak dira, baina kasu desberdinetan egokiak dira. Mezuak jasotzeko, eskuz idatz dezakezu eskaera bat getUpdates metodoarekin - programak Eguneratu datu-matrizea bistaratuko du pantailan. Eskaerak aldizka bidali behar dira, array bakoitza aztertu ondoren, bidalketa errepikatzen da. Desplazamendua emaitza berri bat kargatu aurretik salatutako erregistro kopurua zehazten duen parametroa da, egiaztatutako objektuak berriro ager ez daitezen. getUpdates metodoaren onurak sartuko dira jokoan:

  • ez dago HTTPS konfiguratzeko modurik;
  • gidoi-lengoaia konplexuak erabiltzen dira;
  • bot zerbitzaria aldatzen da noizean behin;
  • bot-a erabiltzaileekin kargatuta dago.

Erabiltzaileen mezuak jasotzeko idatz daitekeen bigarren metodoa setWebhook da. Behin erabiltzen da, ez da etengabe eskaera berriak bidali beharrik. Webhook-ak datuen eguneraketak bidaltzen ditu zehaztutako URLra. Metodo honek SSL ziurtagiria behar du. Webhook erabilgarria izango da kasu hauetan:

  • web programazio lengoaiak erabiltzen dira;
  • bot-a ez dago gainkargatuta, ez dago erabiltzaile gehiegi;
  • zerbitzaria ez da aldatzen, programa denbora luzez zerbitzari berean jarraitzen du.

Argibide gehiagotan, getUpdates erabiliko dugu.

@BotFather Telegram zerbitzua txat bot-ak sortzeko diseinatuta dago. Oinarrizko ezarpenak ere sistema honen bidez ezartzen dira - BotFather-ek deskribapena egiten lagunduko dizu, profileko argazki bat jartzen, laguntza tresnak gehitzen lagunduko dizu. Liburutegiak – Telegram botentzako HTML eskaera multzoak – Interneten eskuragarri daude, asko daude. Adibideko programa sortzean, pyTelegramBotApi erabili zen.

1. urratsa: Kanbio-tasaren eskaerak ezartzea

Lehenik eta behin kontsultak egiten dituen kodea idatzi behar duzu. PrivatBank APIa idaztean erabiliko dugu, behean esteka bat dago: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Metodo hauek erabili behar dituzu zure kodean:

  • load_exchange - truke-tasak aurkitzen ditu eta kodetutako informazioa bistaratzen du;
  • get_exchange - moneta zehatz bati buruzko datuak bistaratzen ditu;
  • get_exchanges - laginaren araberako moneten zerrenda erakusten du.

Ondorioz, pb.py fitxategiko kodea honelakoa da:

inportatu berriro inportatzeko eskaerak inportatu 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-en load_exchange(): if ccy_key == exc['ccy']: return exc return False def get_exchanges(ccy_pattern): emaitza = [] ccy_pattern = re.escape(ccy_pattern) + '.*' exc-en load_exchange(): re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) ez bada None: result.append(exc) emaitza itzultzen du

Programak honako erantzuna eman diezaieke zehaztutako eskaerei:

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

2. urratsa: Sortu Telegram Bot bat @BotFather-rekin

Mezuak jaso eta haiei erantzuteko programa bat sor dezakezu @BotFather zerbitzua erabiliz. Joan bere Telegram orrira eta sartu /newbot komandoa. Argibideak txatean agertuko dira, eta horren arabera, bot-aren izena idatzi behar duzu lehenik eta gero bere helbidea. Bot kontua sortzen denean, token bat duen ongietorri mezu bat agertuko da pantailan. Konfigurazio gehiagorako, erabili komando hauek:

  • /setdescription – deskribapena;
  • /setbouttext – bot berriari buruzko informazioa;
  • /setuserpic – profileko argazkia;
  • /setinline – lineako modua;
  • /setcommands – komandoen deskribapena.

Azken konfigurazio-urratsean, /help eta /exchange deskribatzen ditugu. Urrats guztiak amaitutakoan, kodeketara pasatzeko garaia da.

3. urratsa: Bot-a konfiguratu eta abiarazi

Sortu dezagun config.py fitxategia. Bertan, bot-kode bakarra eta programak informazioa aurkituko duen ordu-eremua zehaztu behar dituzu.

TOKENA = '' # ordez zure bot-aren token TIMEZONE = 'Europa/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Ondoren, beste fitxategi bat sortuko dugu aurretik idatzitako pb.py, liburutegiak eta beharrezko beste osagai batzuen inportazioarekin. Falta diren liburutegiak paketeak kudeatzeko sistematik (pip) instalatzen dira.

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

Erabili dezagun pyTelegramBotApi-ren edukia bot bat sortzeko. Jasotako tokena kode hau erabiliz bidaltzen dugu:

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

None_stop parametroak eskaerak etengabe bidaltzen direla ziurtatzen du. Parametroaren funtzionamenduari ez diote eragingo metodo-erroreek.

4. urratsa: Idatzi /start Komando-kudeatzailea

Aurreko urrats guztiak behar bezala egiten badira, bot-a lanean hasi da. Programak eskaerak sortzen ditu aldizka getUpdates metodoa erabiltzen duelako. none_stop elementua duen lerroaren aurretik, /start komandoa prozesatzen duen kode zati bat behar dugu:

@bot.message_handler(commands=['hasi']) def start_command(message): bot.send_message( message.chat.id, 'Agur! Kanbio-tasak erakutsi dizkizut.n' + 'Tanbio-tasak lortzeko sakatu / exchange.n' + 'Laguntza lortzeko, sakatu /help.' )

RџСўРё komandoak=['hasi'] Egiaren berdina start_command deitzen da. Mezuaren edukia hor doa. Ondoren, bidali funtzioa ezarri behar duzu_mezua mezu jakin bati lotuta.

5. urratsa: Sortu /help komandoen kudeatzailea

/help komandoa botoi gisa inplementa daiteke. Bertan klik eginez gero, erabiltzailea garatzailearen Telegram kontura eramango da. Eman botoiari izena, adibidez, "Galdetu garatzaileari". Ezarri reply_markup parametroa, erabiltzailea esteka batera birbideratzen duena, send_message metodorako. Idatz dezagun kodean teklatua sortzen duen parametroa (InlineKeyboardMarkup). Botoi bakarra behar duzu (InlineKeyboardButton).

Azken komando-kudeatzailearen kodea honelakoa da:

@bot.message_handler(commands=['laguntza']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton('Galdetu garatzaileari', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Eskuragarri dauden dibisen zerrenda jasotzeko, sakatu /exchange.n' + '2) Egin klik interesatzen zaizun monetan.n' + '3) Zuk iturburuari eta xede-monetei buruzko informazioa jasotzen duen mezu bat jasoko du, ' + 'erosketa-tasak eta salmenta-tasak.n' + '4) Sakatu "Eguneratu" eskaerari buruzko uneko informazioa jasotzeko. ' + 'Bot-ak aurreko eta egungo truke-tasen arteko aldea ere erakutsiko du.n' + '5) Botak linean onartzen du. Idatzi @ edozein txatetan eta moneta baten lehen letrenetan.', reply_markup=keyboard )

Kode ekintza Telegram txatean:

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

6. urratsa: /exchange Komando-kudeatzailea gehitzea

Urrats hau beharrezkoa da txatean erabilgarri dauden moneten ikurrak dituzten botoiak bistaratzeko. Aukerak dituen pantailako teklatuak akatsak saihesten lagunduko dizu. PrivatBank-ek errubloari, dolarri eta euroari buruzko informazioa eskaintzen du. InlineKeyboardButton aukerak honela funtzionatzen du:

  1. Erabiltzaileak nahi duen izendapena duen botoian klik egiten du.
  2. getUpdates-ek dei bat jasotzen du (CallbackQuery).
  3. Teklatua sakatzea nola kudeatzen den ezagutzen da: sakatutako botoiari buruzko informazioa transmititzen da.

/truke kudeatzailearen kodea:

@bot.message_handler(commands=['truke']) 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, 'Egin klik aukeratutako monetan:', reply_markup=teklatua)

Telegram-en kodearen emaitza:

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

7. urratsa: teklatuko botoien kudeatzaile bat idaztea

PyTelegramBot Api paketeak @bot.callback_query_handler dekoratzaile funtzioa dauka. Osagai hau deia funtzio batean itzultzeko diseinatuta dago; APIak deia ireki eta berriro sortzen du. Honela idatzita dago:

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

Idatz dezagun get_ex_callback metodoa ere:

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

Badago beste metodo erabilgarria - answer_callback_query. Botoia sakatu eta emaitza pantailan bistaratu arteko karga kentzen laguntzen du. Send_exchange_query-ra mezu bat bidal diezaiokezu moneta-kode eta Mezua emanez. Idatz dezagun send_exchange_result:

def send_exchange_result (mezua, ex_code): bot.send_chat_action (message.chat.id, 'idazten') ex = pb.get_exchange (ex_code) bot.send_message (mezu.chat.id, serialize_ex (adib), reply_markup=get_update_keyboard (adib. ), parse_mode='HTML' )

Chatbot-ak bankuaren eskaeraren emaitza jasotzen duen bitartean API, bisitariak "mezu bat idazten" inskripzioa ikusten du. Benetako pertsona batek erantzuten duela dirudi. Adierazle hori pantailan bistaratzeko, sarrerako egoera lerroak gehitu beharko dituzu. Ondoren, get_exchange erabiliko dugu - bere laguntzarekin, programak moneta izendapena jasoko du (errubloak, euroak edo dolar). send_message-k metodo osagarriak erabiltzen ditu: serialize_ex-ek moneta beste formatu batera bihurtzen du, eta get_update_keyboard-ek informazioa eguneratzen duten eta moneta-merkatuko datuak beste txat batzuetara bidaltzen dituzten funtzio-teklak konfiguratzen ditu.

Idatz dezagun get_update_keyboard-erako kodea. Bi botoi aipatu behar dira - t eta e mota eta trukea adierazten dute. Partekatu botoirako switch_inline_query elementua behar da, erabiltzaileak hainbat txat aukeratu ahal izateko. Bisitariak dolarraren, errubloaren edo euroaren egungo truke-tasa nori bidali aukeratu ahal izango du.

def get_update_keyboard(adibidez): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton('Eguneratu', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['erosi'], 's': ex['salmenta'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Partekatu', switch_inline_query=ex['ccy']) ) itzuli teklatua

Batzuetan, denbora gutxian truke-tasa zenbat aldatu den ikusi behar duzu. Idatzi ditzagun bi metodo Eguneratu botoirako, erabiltzaileek ikastaroak alderatuz ikus ditzaten.

Truke-tasen arteko aldea serializatzailera pasatzen da diff parametroaren bidez.

Agindutako metodoek datuak eguneratu ondoren bakarrik funtzionatzen dute, ez dute ikastaroaren lehenengo pantailan eragingo.

def serialize_ex (ex_json, diff=None): emaitza = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Erosi: ' + ex_json['erosi'] diff: emaitza += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Saldu: ' + ex_json['salmenta'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: emaitza += 'nSell: ' + ex_json['sale'] + 'n' emaitza itzultzen def serialize_exchange_diff (diff): emaitza = '' desberdina bada > 0: emaitza = '(' + 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: emaitza = '(' + 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">)' itzuliko emaitza

Imajinatu bisitariak dolarraren truke-tasa ezagutu nahi zuela. Hona hemen mezuan USD hautatzen baduzu zer gertatzen den:

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

8. urratsa: Eguneratze botoien kudeatzailea ezartzea

Idatzi dezagun ekintzak kudeatzeko kodea Eguneratu botoiarekin eta gehitu iq_callback_method zatia. Programaren elementuak get parametroarekin hasten direnean, get_ex_callback idatzi behar duzu. Beste egoera batzuetan, JSON analizatzen dugu eta t gakoa lortzen saiatzen gara.

@bot.callback_query_handler(func=lambda call: True) def iq_callback(kontsulta): data = query.data if data.startswith('get-'): get_ex_callback (kontsulta) else: try: if json.loads(data)[ 't'] == 'u': edit_message_callback (kontsulta) ValueError izan ezik: gainditu

t u berdina bada, edit_message_callback metodorako programa bat idatzi beharko duzu. Apurtu dezagun prozesu hau urratsez urrats:

  1. Moneta-merkatuaren egoerari buruzko informazio eguneratua deskargatzea (exchange_now = pb.get_exchange(data['c']).
  1. Mezu berri bat idazten diferentzia duen serializatzaile baten bidez.
  2. Sinadura bat gehitzea (get_edited_signature).

Hasierako mezua aldatzen ez bada, deitu edit_message_text metodora.

def edit_message_callback(kontsulta): 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( testua, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Idatz dezagun get_ex_from_iq_data metodoa JSON analizatzeko:

def get_ex_from_iq_data(exc_json): itzuli { 'erosi': exc_json['b'], 'salmenta': exc_json['s'] }

Metodo batzuk gehiago beharko dituzu: adibidez, get_exchange_diff, moneten kostuari buruzko informazio zaharra eta berria irakurtzen duena eta aldea bistaratzen duena.

def get_exchange_diff(azkena, orain): return { 'sale_diff': float("%.6f" % (float(orain['sale']) - float(azken['sale']))), 'buy_diff': float ("%.6f" % (float(orain['erosi']) - float(azken['erosi']))) }

Azkenean, get_edited_signature, ikastaroa azken aldiz eguneratu zen ordua erakusten du.

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

Ondorioz, bot-aren mezu eguneratuak truke-tasa egonkorra duen itxura hau du:

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

Ikastaroa aldatzen denean, balioen arteko desberdintasunak bistaratzen dira mezuan agindutako parametroen ondorioz.

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

9. urratsa: txertatutako modua ezartzea

Eraikitako modua beharrezkoa da programako informazioa edozein txatetara azkar bidaltzeko; orain ez duzu bot bat gehitu behar elkarrizketan parte-hartzaile gisa. Telegram-eko erabiltzaile batek bot-en izena sartzen duenean aurrean @ zeinua duela, bihurketa-aukerak sarrerako lerroaren gainean agertu behar dira. Elementuren batean klik egiten baduzu, bot-ak mezu bat bidaliko dio elkarrizketari emaitzak eta datuak eguneratzeko eta bidaltzeko botoiekin. Bidaltzailearen izenak “bide ".

InlineQuery liburutegiaren bidez query_text-era pasatzen da. Kodeak answer_line funtzioa erabiltzen du bilaketa-emaitzak datu-matrize gisa eta inline_query_id elementu gisa berreskuratzeko. Get_exchanges erabiltzen dugu, bot-ak eskatuz gero hainbat moneta aurki ditzan.

@bot.inline_handler(func=lambda kontsulta: Egia) def query_text(inline_query): bot.answer_inline_query( inline_query.id, get_iq_articles(pb.get_exchanges(inline_query.query)) )

Get_iq_articles datu-matrize bat pasatzen dugu metodo honen bidez InlineQueryResultArticle-tik objektuak itzultzeko.

def get_iq_articles(trukeak): emaitza = [] for exc trukeetan: 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='Bihurtu ' + exc['base_ccy'] + ' -> ' + exc['ccy'], thumb_height=1 ) ) emaitza itzuli

Orain, @ idazten baduzu eta lerroan zuriune bat, bilaketa-emaitzak pantailan agertuko dira - hiru moneta erabilgarri bihurtzeko aukerak.

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

Erabiltzaileek emaitzak iragazi ditzakete nahi den moneta sartuz.

Zerrendako nahi duzun monetan klik egin ondoren, txatak bot erabiltzaileek jasotzen duten mezu bera jasotzen du. Eguneratu botoia ere erabil dezakezu. Beheko irudiak bot bidez bidalitako mezu eguneratua erakusten du:

Telegram bot Python-en. Truke-tasekin bot bat idazteko gida osoa hutsetik

Ondorioa

Orain badakizu nola sortu Telegramerako bot bat. Tresna erabilgarriak gehi diezazkiokezu zure programari: mezulariaren beste erabiltzaile batzuei emaitza eguneratzeko eta bidaltzeko botoiak eta berarekin txatetik kanpo bot-aren funtzioak erabiltzeko aukera ematen duen modu integratua. Argibide honetan oinarrituta, edozein bot soil sor dezakezu beste funtzio batzuekin, ez bakarrik truke-tasak erakutsiko dituena. Ez izan beldurrik liburutegiekin, APIekin eta kodearekin esperimentatzeko, Telegram-en bezeroekin txateatzen duen laguntzaile automatizatu bat sortzeko eta interesa duten pertsonek enpresarekin duten konexioa sendotzeko.

1 Iruzkina

  1. Argitalpen fantastikoa

Utzi erantzun bat