Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Bot nan Telegram yo se pwogram ki ede etabli kontak ak odyans lan oswa senplifye aksyon ki te deja fèt manyèlman. Pwogram sa yo ekri espesyalman pou platfòm mesaje a. Bots travay nan fason sa a: itilizatè a voye yon kòmand nan liy lan opinyon, ak sistèm nan reponn ak yon tèks oswa mesaj entèaktif. Pafwa pwogram nan menm imite aksyon yon moun reyèl - tankou yon bot enspire plis konfyans nan mitan kliyan yo.

Gen plizyè kalite sistèm pou asistans otomatik pou itilizatè yo. Gen kèk robo jis kominike ak kliyan, lòt moun regilyèman bay enfòmasyon. Li enposib byen klè divize pwogram yo an kalite - devlopè souvan konbine plizyè fonksyon nan yon sèl bot.

Ou ka ekri yon bot senp pou Telegram ak eleman entèaktif nan fòm bouton sou ekran nan 9 etap. Ann gade nan chak nan yo an detay epi reponn kèk kesyon:

  • ki jan yo kòmanse yon bot;
  • ki jan yo anrejistre yon klavye bati nan youn oswa plis bouton;
  • ki jan yo pwograme bouton yo pou fonksyon yo vle;
  • ki sa ki mòd inline ak kouman yo mete l kanpe pou yon bot ki egziste deja.

Etap 0: background teyorik sou Telegram bots API a

Zouti prensipal yo itilize pou kreye telegram bots se HTML Application Programming Interface, oswa HTML API. Eleman sa a aksepte demann vizitè yo epi voye repons sou fòm enfòmasyon. Desen ki pare yo senplifye travay la sou pwogram nan. Pou ekri yon bot pou Telegram, ou bezwen sèvi ak adrès imel sa a: https://api.telegram.org/bot/METHOD_NAME

Pou fonksyone kòrèk la nan bot la, yon siy nesesè tou - yon konbinezon de karaktè ki pwoteje pwogram nan epi ouvè aksè a li nan devlopè ou fè konfyans. Chak siy inik. Se fisèl la asiyen nan bot la lè kreyasyon an. Metòd yo ka diferan: getUpdates, getChat ak lòt moun. Chwa a nan metòd depann sou ki algorithm devlopè yo atann de bot la. Egzanp siy:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bots itilize demann GET ak POST. Paramèt Metòd yo souvan dwe konplete - pou egzanp, lè metòd sendMessage sipoze voye id chat la ak kèk tèks. Paramèt pou rafineman metòd yo ka pase kòm yon kòd rechèch URL lè l sèvi avèk aplikasyon/x-www-form-urlencoded oswa atravè aplikasyon-json. Metòd sa yo pa apwopriye pou telechaje dosye. UTF-8 kodaj tou obligatwa. Lè w voye yon demann nan API a, ou ka jwenn rezilta a nan fòma JSON. Gade repons pwogram nan pou jwenn enfòmasyon atravè metòd getME:

JWENN https://api.telegram.org/bot/getMe{ ok: vre, rezilta: { id: 231757398, first_name: "Echanj to bot", non itilizatè: "exchangetestbot"} }

Rezilta a ap jwenn si ok egal vrè. Sinon, sistèm lan pral endike yon erè.

Gen de fason pou jwenn mesaj koutim nan bots. Tou de metòd yo efikas, men yo apwopriye nan diferan ka. Pou jwenn mesaj, ou ka manyèlman ekri yon demann ak metòd getUpdates la - pwogram nan pral montre etalaj la Mizajou done sou ekran an. Demann yo dwe voye regilyèman, apre yo fin analize chak etalaj, voye yo repete. Offset se yon paramèt ki detèmine kantite dosye sote anvan ou chaje yon nouvo rezilta pou evite objè tcheke yo parèt. Benefis metòd getUpdates yo ap antre nan jwèt si:

  • pa gen okenn fason yo konfigirasyon HTTPS;
  • yo itilize langaj scripting konplèks;
  • sèvè bot la chanje de tan zan tan;
  • bot la chaje ak itilizatè yo.

Dezyèm metòd ki ka ekri pou resevwa mesaj itilizatè se setWebhook. Li se itilize yon fwa, pa bezwen toujou ap voye nouvo demann. Webhook la voye mizajou done nan URL espesifye a. Metòd sa a mande pou yon sètifika SSL. Webhook ap itil nan ka sa yo:

  • yo itilize langaj pwogramasyon entènèt;
  • bot la pa twò chaje, pa gen twòp itilizatè;
  • sèvè a pa chanje, pwogram nan rete sou menm sèvè a pou yon tan long.

Nan plis enstriksyon, nou pral itilize getUpdates.

Sèvis @BotFather Telegram la fèt pou kreye chat bots. Anviwònman debaz yo tou mete nan sistèm sa a - BotFather pral ede w fè yon deskripsyon, mete yon foto pwofil, ajoute zouti sipò. Bibliyotèk - ansanm demann HTML pou robo Telegram - yo disponib sou entènèt la, gen anpil nan yo. Lè w ap kreye pwogram egzanp lan, yo te itilize pyTelegramBotApi.

Etap 1: Aplike Demann Pousantaj Dechanj

Premye ou bezwen ekri kòd ki fè demann. Nou pral sèvi ak lè w ap ekri API PrivatBank la, anba a se yon lyen pou li: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Ou bezwen sèvi ak metòd sa yo nan kòd ou a:

  • load_exchange - jwenn pousantaj dechanj epi montre enfòmasyon ki kode;
  • get_exchange - montre done sou yon lajan espesifik;
  • get_exchanges - montre lis lajan yo dapre echantiyon an.

Kòm yon rezilta, kòd la nan dosye a pb.py sanble sa a:

enpòte re enpòte demann enpòte 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 Fo def get_exchanges(ccy_pattern): rezilta = [] ccy_pattern = re.escape(ccy_pattern) + '.*' pou exc nan load_exchange(): si re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) pa Okenn: result.append(exc) retounen rezilta

Pwogram nan ka bay repons sa a nan demann yo espesifye:

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

Etap 2: Kreye yon Bot Telegram ak @BotFather

Ou ka kreye yon pwogram pou resevwa mesaj ak reponn yo lè l sèvi avèk sèvis @BotFather. Ale nan paj Telegram li a epi antre nan lòd / newbot la. Enstriksyon yo ap parèt nan chat la, dapre sa ou bezwen ekri non bot la an premye, ak Lè sa a, adrès li yo. Lè yo kreye kont bot la, yon mesaj akeyi ki gen yon siy ap parèt sou ekran an. Pou plis konfigirasyon, sèvi ak kòmandman sa yo:

  • /setdescription - deskripsyon;
  • /setbouttext - enfòmasyon sou nouvo bot la;
  • /setuserpic – foto pwofil;
  • /setinline - mòd inline;
  • /setcommands - deskripsyon kòmandman yo.

Nan dènye etap konfigirasyon an, nou dekri /help ak /echanj. Lè tout etap yo te konplete, li lè pou avanse pou pi sou kodaj.

Etap 3: Mete kanpe ak lanse bot la

Ann kreye yon fichye config.py. Nan li, ou bezwen presize kòd la bot inik ak zòn nan tan nan ki pwogram nan ap jwenn enfòmasyon.

JETON = '' # ranplase token bot ou a TIMEZONE = 'Ewòp/Kyèv' TIMEZONE_COMMON_NAME = 'Kyèv'

Apre sa, nou kreye yon lòt dosye ak enpòte pb.py a deja ekri, bibliyotèk ak lòt konpozan nesesè. Bibliyotèk ki manke yo enstale nan sistèm jesyon pake (pip).

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

Ann sèvi ak kontni pyTelegramBotApi pou kreye yon bot. Nou voye siy resevwa a lè l sèvi avèk kòd sa a:

bot = telebot.TeleBot (config.TOKEN) bot.polling (none_stop = Vrè)

Paramèt none_stop la asire ke demann yo toujou ap voye. Operasyon an nan paramèt la pa pral afekte pa erè metòd.

Etap 4: Ekri Manadjè Kòmandman /start la

Si tout etap anvan yo fè kòrèkteman, bot la te kòmanse travay. Pwogram nan jenere demann regilyèman paske li itilize metòd getUpdates la. Anvan liy lan ak eleman none_stop, nou bezwen yon moso kòd ki trete lòd /start la:

@bot.message_handler(commands=['kòmanse']) def start_command(mesaj): bot.send_message( message.chat.id, 'Bonjou! Mwen ka montre w echanj rates.n' + 'Pou jwenn pousantaj dechanj yo peze / exchange.n' + 'Pou jwenn èd peze /help.' )

RџSЂRё komand=['kòmanse'] egal a Vrè start_command yo rele. Kontni mesaj la ale la. Apre sa, ou bezwen aplike fonksyon voye a_mesaj an relasyon ak yon mesaj patikilye.

Etap 5: Kreye yon Manadjè Kòmand /help

Kòmandman /help la ka aplike kòm yon bouton. Lè w klike sou li, itilizatè a pral mennen nan kont Telegram pwomotè a. Bay bouton an yon non, tankou "Mande pwomotè a". Mete paramèt reply_markup la, ki redireksyon itilizatè a nan yon lyen, pou metòd send_message. Ann ekri nan kòd la paramèt ki kreye klavye a (InlineKeyboardMarkup). Ou bezwen sèlman yon bouton (InlineKeyboardButton).

Kòd finalman kòmandman an sanble sa a:

@bot.message_handler(commands=['èd']) def help_command(mesaj): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton('Mande devlopè a', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Pou resevwa yon lis lajan ki disponib peze /exchange.n' + '2) Klike sou lajan ou enterese a.n' + '3) Ou pral resevwa yon mesaj ki gen enfòmasyon konsènan sous la ak lajan sib yo, ' + 'achte pousantaj ak vann pousantaj.n' + '4) Klike "Mizajou" pou resevwa enfòmasyon aktyèl la konsènan demann lan. ' + 'Bot la pral montre tou diferans ki genyen ant to echanj anvan yo ak aktyèl yo.n' + '5) Bot la sipòte enline. Tape @ nan nenpòt chat ak premye lèt yo nan yon lajan.', reply_markup=keyboard )

Kòd aksyon nan chat Telegram:

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Etap 6: Ajoute Manadjè Kòmandman /exchange la

Etap sa a nesesè pou montre bouton ki gen senbòl lajan ki disponib nan chat la. Yon klavye sou ekran ak opsyon ap ede ou evite erè. PrivatBank bay enfòmasyon sou Ruble, dola ak euro. Opsyon InlineKeyboardButton la ap travay konsa:

  1. Itilizatè a klike sou bouton an ak deziyasyon an vle.
  2. getUpdates resevwa yon callback (CallbackQuery).
  3. Li vin konnen ki jan yo okipe peze klavye a - enfòmasyon sou bouton an bourade transmèt.

/echanj manadjè kòd:

@bot.message_handler(commands=['echanj']) def exchange_command(mesaj): klavye = 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, 'Klike sou lajan chwa a:', reply_markup=klavye )

Rezilta kòd la nan Telegram:

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Etap 7: Ekri yon moun k ap okipe bouton klavye entegre yo

Pake pyTelegramBot Api a gen fonksyon dekoratè @bot.callback_query_handler. Eleman sa a fèt pou tradui apèl la nan yon fonksyon - API a dewoule epi re-kreye apèl la. Li eple konsa:

@bot.callback_query_handler(func=lambda apèl: Vrè) def iq_callback(rekèt): done = query.data if data.startswith('get-'): get_ex_callback (rekèt)

Ann ekri tou metòd get_ex_callback:

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

Gen yon lòt metòd itil - answer_callback_query. Li ede yo retire chaj la ant peze bouton an ak montre rezilta a sou ekran an. Ou ka voye yon mesaj bay send_exchange_query lè w pase kèk kòd lajan ak mesaj. Ann ekri send_exchange_result:

def send_exchange_result (mesaj, ex_code): bot.send_chat_action (message.chat.id, 'tape') ex = pb.get_exchange (ex_code) bot.send_message (message.chat.id, serialize_ex (ansyen), reply_markup = get_update_keyboard (ansyen) ), parse_mode = 'HTML' )

Pandan ke chatbot la resevwa rezilta demann lan nan men bank la API, vizitè a wè inscription "tape yon mesaj". Li sanble yon moun reyèl ap reponn. Pou montre yon endikatè konsa sou ekran an, w ap bezwen ajoute liy estati D '. Apre sa, nou pral sèvi ak get_exchange - avèk èd li yo, pwogram nan ap resevwa deziyasyon lajan an (rubles, ero oswa dola). send_message sèvi ak metòd adisyonèl: serialize_ex konvèti lajan an nan yon lòt fòma, epi get_update_keyboard mete sou pye softkeys ki mete enfòmasyon yo mete ajou epi voye done sou mache lajan nan lòt chat.

Ann ekri kòd pou get_update_keyboard. De bouton bezwen mansyone - t ak e kanpe pou kalite ak echanj. Atik switch_inline_query pou bouton pataje a nesesè pou itilizatè a ka chwazi nan plizyè chat. Vizitè a pral kapab chwazi ki moun yo voye echanj pousantaj lajan an dola, Ruble oswa euro.

def get_update_keyboard(eg): klavye = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Mizajou', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['achte'], 's': ex['sale'], 'c': ex['ccy'] } }).replace(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) retounen klavye

Pafwa ou bezwen wè ki kantite echanj pousantaj lajan an te chanje nan yon ti tan. Ann ekri de metòd pou bouton Mizajou pou itilizatè yo ka wè kou yo an konparezon.

Diferans ki genyen ant to echanj yo pase nan serilizer la atravè paramèt diff.

Metòd preskri yo travay sèlman apre yo fin mete ajou done yo, yo pa pral afekte premye ekspozisyon kou a.

def serialize_ex(ex_json, diff=Okenn): rezilta = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Achte: ' + ex_json['achte'] si diff: rezilta += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Vann: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nSell: ' + ex_json['sale'] + 'n' retounen rezilta def serialize_exchange_diff (diff): rezilta = '' si dif > 0: rezilta = '(' + str(dif) + ' " 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: rezilta = '(' + 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">)' retounen rezilta

Imajine ke vizitè a te vle konnen to echanj dola a. Men sa k ap pase si w chwazi USD nan mesaj la:

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Etap 8: Enplemante Mizajou Button Handler la

Ann ekri kòd la pou manyen aksyon ak bouton Mizajou epi ajoute pati iq_callback_method la nan li. Lè atik pwogram yo kòmanse ak paramèt get la, ou dwe ekri get_ex_callback. Nan lòt sitiyasyon, nou analize JSON epi eseye jwenn kle t la.

@bot.callback_query_handler(func=lambda apèl: Vrè) def iq_callback(rekèt): done = query.data if data.startswith('get-'): get_ex_callback (rekèt) lòt bagay: eseye: if json.loads (done)[ 't'] == 'u': edit_message_callback (rekèt) eksepte ValueError: pase

Si t egal u, w ap bezwen ekri yon pwogram pou metòd edit_message_callback la. Ann kraze pwosesis sa a etap pa etap:

  1. Telechaje enfòmasyon ajou sou eta mache lajan an (exchange_now = pb.get_exchange(data['c']).
  1. Ekri yon nouvo mesaj atravè yon serilizer ak diff.
  2. Ajoute yon siyati (get_edited_signature).

Si premye mesaj la pa chanje, rele metòd edit_message_text.

def edit_message_callback (rekèt): done = json.loads (query.data) ['e'] exchange_now = pb.get_exchange (done ['c']) tèks = serialize_ex (change_now, get_exchange_diff (get_ex_from_iq_data (done), 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 (tèks, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML')

Ann ekri metòd get_ex_from_iq_data pou analize JSON:

def get_ex_from_iq_data (exc_json): retounen { 'achte': exc_json['b'], 'sale': exc_json['s'] }

Ou pral bezwen kèk lòt metòd: pou egzanp, get_exchange_diff, ki li ansyen ak nouvo enfòmasyon sou pri lajan yo epi montre diferans lan.

def get_exchange_diff(dènye, kounye a): retounen { 'sale_diff': float("%.6f" % (float(kounye a['sale']) - float(dènye['sale']))), 'buy_diff': float ("%.6f" % (flote(kounye a['achte']) - flote(dènye['achte']))) }

Dènye a, get_edited_signature, montre lè kou a te dènye mete ajou.

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

Kòm yon rezilta, mete ajou mesaj bot la ak yon pousantaj echanj ki estab sanble sa a:

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Lè kou a chanje, diferans ki genyen ant valè yo parèt nan mesaj la akòz paramèt yo preskri.

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Etap 9: Embedded Mode Aplikasyon

Mòd entegre a nesesè pou voye enfòmasyon ki soti nan pwogram nan nan nenpòt chat - kounye a ou pa bezwen ajoute yon bot nan konvèsasyon an kòm yon patisipan. Lè yon itilizatè Telegram antre yon non bot ak yon siy @ devan li, opsyon konvèsyon yo ta dwe parèt pi wo a liy opinyon an. Si ou klike sou youn nan atik yo, bot la pral voye yon mesaj nan konvèsasyon an ak rezilta yo ak bouton pou mete ajou ak voye done. Non moun k ap voye a ap genyen tit "via ".

InlineQuery pase nan query_text atravè bibliyotèk la. Kòd la sèvi ak fonksyon answer_line pou rekipere rezilta rechèch la kòm yon etalaj done ak eleman inline_query_id la. Nou itilize get_exchanges pou bot la jwenn plizyè lajan sou demann.

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

Nou pase yon etalaj de done nan get_iq_articles yo nan lòd yo retounen objè ki soti nan InlineQueryResultArticle atravè metòd sa a.

def get_iq_articles(echanj): rezilta = [] pou eksk nan echanj: 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='Konvèti ' + exc['base_ccy'] + '-> '+exc['ccy'], thumb_height=1) ) retounen rezilta

Koulye a, si ou ekri @ ak yon espas nan liy lan, rezilta rechèch yo ap parèt sou ekran an - opsyon pou konvèti nan twa lajan ki disponib.

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

Itilizatè yo ka filtre rezilta yo lè yo antre lajan an vle.

Apre klike sou lajan an vle nan lis la, chat la resevwa menm mesaj ke itilizatè bot yo resevwa. Ou kapab tou itilize bouton Mizajou. Imaj ki anba a montre mesaj aktyalizasyon ki voye atravè bot la:

Telegram bot nan Python. Yon gid konplè pou ekri yon bot ak to echanj soti nan grafouyen

konklizyon

Koulye a, ou konnen ki jan yo kreye yon bot pou Telegram. Ou ka ajoute zouti itil nan pwogram ou an: bouton pou mete ajou ak voye rezilta a bay lòt itilizatè nan mesaje a ak yon mòd bati-an ki pèmèt ou sèvi ak fonksyon yo nan bot la deyò chat la ak li. Dapre enstriksyon sa a, ou ka kreye nenpòt bot senp ak lòt fonksyon - pa sèlman youn nan ki pral montre pousantaj dechanj. Ou pa bezwen pè fè eksperyans ak bibliyotèk, API, ak kòd pou kreye yon asistan otomatik ki pral koze ak kliyan sou Telegram epi ranfòse koneksyon moun ki enterese ak konpayi an.

1 Kòmantè

  1. Fantastik piblikasyon

Kite yon Reply