Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Bot dalam Telegram ialah program yang membantu menjalin hubungan dengan penonton atau memudahkan tindakan yang sebelum ini perlu dilakukan secara manual. Program ini ditulis khusus untuk platform messenger. Bot berfungsi dengan cara ini: pengguna menghantar arahan melalui baris input, dan sistem bertindak balas dengan teks atau mesej interaktif. Kadangkala program ini juga meniru tindakan orang sebenar - bot sebegitu memberi inspirasi kepada lebih kepercayaan di kalangan pelanggan.

Terdapat beberapa jenis sistem untuk bantuan automatik kepada pengguna. Sesetengah bot hanya berkomunikasi dengan pelanggan, yang lain kerap memberikan maklumat. Adalah mustahil untuk membahagikan program dengan jelas kepada jenis – pembangun selalunya menggabungkan beberapa fungsi dalam satu bot.

Anda boleh menulis bot mudah untuk Telegram dengan elemen interaktif dalam bentuk butang pada skrin dalam 9 langkah. Mari kita lihat setiap daripada mereka secara terperinci dan jawab beberapa soalan:

  • bagaimana untuk memulakan bot;
  • cara mendaftar papan kekunci terbina dalam daripada satu atau lebih butang;
  • cara memprogramkan butang untuk fungsi yang diingini;
  • apakah mod sebaris dan cara menyediakannya untuk bot sedia ada.

Langkah 0: latar belakang teori tentang API bot Telegram

Alat utama yang digunakan untuk membuat bot Telegram ialah Antara Muka Pengaturcaraan Aplikasi HTML, atau API HTML. Elemen ini menerima permintaan pelawat dan menghantar respons dalam bentuk maklumat. Reka bentuk siap sedia memudahkan kerja pada program. Untuk menulis bot untuk Telegram, anda perlu menggunakan alamat e-mel ini: https://api.telegram.org/bot/METHOD_NAME

Untuk fungsi bot yang betul, token juga diperlukan – gabungan aksara yang melindungi program dan membuka akses kepadanya kepada pembangun yang dipercayai. Setiap token adalah unik. Rentetan diberikan kepada bot apabila dibuat. Kaedah boleh berbeza: getUpdates, getChat dan lain-lain. Pilihan kaedah bergantung pada algoritma yang diharapkan oleh pembangun daripada bot. Contoh token:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

Bot menggunakan permintaan GET dan POST. Parameter kaedah selalunya perlu ditambah – contohnya, apabila kaedah sendMessage sepatutnya menghantar id sembang dan beberapa teks. Parameter untuk penghalusan kaedah boleh dihantar sebagai rentetan pertanyaan URL menggunakan application/x-www-form-urlencoded atau melalui application-json. Kaedah ini tidak sesuai untuk memuat turun fail. Pengekodan UTF-8 juga diperlukan. Dengan menghantar permintaan kepada API, anda boleh mendapatkan hasil dalam format JSON. Lihat respons program untuk mendapatkan maklumat melalui kaedah getME:

DAPATKAN https://api.telegram.org/bot/getMe{ ok: true, result: { id: 231757398, first_name: "Bot Kadar Pertukaran", nama pengguna: "exchangetestbot" } }

Hasilnya akan diperolehi sekiranya ok sama dengan benar. Jika tidak, sistem akan menunjukkan ralat.

Terdapat dua cara untuk mendapatkan mesej tersuai dalam bot. Kedua-dua kaedah adalah berkesan, tetapi sesuai dalam kes yang berbeza. Untuk mendapatkan mesej, anda boleh menulis permintaan secara manual dengan kaedah getUpdates – program akan memaparkan tatasusunan data Kemas kini pada skrin. Permintaan mesti dihantar dengan kerap, selepas menganalisis setiap tatasusunan, penghantaran diulang. Offset ialah parameter yang menentukan bilangan rekod yang dilangkau sebelum memuatkan hasil baharu untuk mengelakkan kemunculan semula objek yang diperiksa. Faedah kaedah getUpdates akan digunakan jika:

  • tiada cara untuk mengkonfigurasi HTTPS;
  • bahasa skrip kompleks digunakan;
  • pelayan bot berubah dari semasa ke semasa;
  • bot dimuatkan dengan pengguna.

Kaedah kedua yang boleh ditulis untuk menerima mesej pengguna ialah setWebhook. Ia digunakan sekali, tidak perlu sentiasa menghantar permintaan baharu. Webhook menghantar kemas kini data ke URL yang ditentukan. Kaedah ini memerlukan sijil SSL. Webhook akan berguna dalam kes ini:

  • bahasa pengaturcaraan web digunakan;
  • bot tidak terlebih beban, tidak terlalu ramai pengguna;
  • pelayan tidak berubah, program kekal pada pelayan yang sama untuk masa yang lama.

Dalam arahan selanjutnya, kami akan menggunakan getUpdates.

Perkhidmatan @BotFather Telegram direka untuk membuat bot sembang. Tetapan asas juga ditetapkan melalui sistem ini - BotFather akan membantu anda membuat penerangan, meletakkan foto profil, menambah alat sokongan. Perpustakaan – set permintaan HTML untuk bot Telegram – tersedia di Internet, terdapat banyak daripadanya. Semasa mencipta program contoh, pyTelegramBotApi telah digunakan.

Langkah 1: Melaksanakan Permintaan Kadar Pertukaran

Mula-mula anda perlu menulis kod yang melakukan pertanyaan. Kami akan gunakan semasa menulis API PrivatBank, di bawah ialah pautan kepadanya: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. Anda perlu menggunakan kaedah ini dalam kod anda:

  • load_exchange – mencari kadar pertukaran dan memaparkan maklumat yang dikodkan;
  • get_exchange – memaparkan data tentang mata wang tertentu;
  • get_exchanges – menunjukkan penyenaraian mata wang mengikut sampel.

Akibatnya, kod dalam fail pb.py kelihatan seperti ini:

import semula import permintaan 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 ): untuk exc dalam load_exchange(): if ccy_key == exc['ccy']: return exc return Palsu def get_exchanges(ccy_pattern): result = [] ccy_pattern = re.escape(ccy_pattern) + '.*' untuk exc in load_exchange(): jika re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) bukan Tiada: result.append(exc) kembalikan hasil

Program ini boleh mengeluarkan respons berikut kepada permintaan yang ditentukan:

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

Langkah 2: Buat Bot Telegram dengan @BotFather

Anda boleh mencipta program untuk menerima mesej dan membalasnya menggunakan perkhidmatan @BotFather. Pergi ke halaman Telegramnya dan masukkan arahan /newbot. Arahan akan muncul dalam sembang, mengikut mana anda perlu menulis nama bot terlebih dahulu, dan kemudian alamatnya. Apabila akaun bot dibuat, mesej alu-aluan yang mengandungi token akan muncul pada skrin. Untuk konfigurasi lanjut, gunakan arahan ini:

  • /setdescription – penerangan;
  • /setaouttext – maklumat tentang bot baharu;
  • /setuserpic – foto profil;
  • /setinline – mod sebaris;
  • /setcommands – perihalan arahan.

Pada langkah konfigurasi terakhir, kami menerangkan /help dan /exchange. Apabila semua langkah telah selesai, sudah tiba masanya untuk beralih kepada pengekodan.

Langkah 3: Menyediakan dan Melancarkan Bot

Mari buat fail config.py. Di dalamnya, anda perlu menentukan kod bot unik dan zon waktu di mana program akan mencari maklumat.

TOKEN = '' # gantikan dengan token bot andaTIMEZONE = 'Eropah/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

Seterusnya, kami mencipta fail lain dengan import pb.py yang ditulis sebelum ini, perpustakaan dan komponen lain yang diperlukan. Perpustakaan yang hilang dipasang daripada sistem pengurusan pakej (pip).

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

Mari gunakan kandungan pyTelegramBotApi untuk mencipta bot. Kami menghantar token yang diterima menggunakan kod berikut:

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

Parameter none_stop memastikan permintaan sentiasa dihantar. Pengendalian parameter tidak akan terjejas oleh ralat kaedah.

Langkah 4: Tulis Pengendali Perintah /start

Jika semua langkah sebelumnya dilakukan dengan betul, bot telah mula berfungsi. Program ini menjana permintaan dengan kerap kerana ia menggunakan kaedah getUpdates. Sebelum baris dengan elemen none_stop, kita memerlukan sekeping kod yang memproses arahan /start:

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'Salam! Saya boleh tunjukkan kadar pertukaran.n' + 'Untuk mendapatkan kadar pertukaran tekan / exchange.n' + 'Untuk mendapatkan bantuan tekan /help.' )

RџСўРё commands=['start'] sama dengan Benar start_command dipanggil. Kandungan mesej pergi ke sana. Seterusnya, anda perlu melaksanakan fungsi hantar_mesej berhubung dengan mesej tertentu.

Langkah 5: Buat Pengendali Perintah /help

Perintah /help boleh dilaksanakan sebagai butang. Dengan mengklik padanya, pengguna akan dibawa ke akaun Telegram pembangun. Beri butang nama, seperti "Tanya pembangun". Tetapkan parameter reply_markup, yang mengubah hala pengguna ke pautan, untuk kaedah send_message. Mari tulis dalam kod parameter yang mencipta papan kekunci (InlineKeyboardMarkup). Anda hanya memerlukan satu butang (InlineKeyboardButton).

Kod pengendali arahan terakhir kelihatan seperti ini:

@bot.message_handler(commands=['help']) def help_command(message): keyboard = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( 'Tanya pembangun', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) Untuk menerima senarai mata wang yang tersedia tekan /exchange.n' + '2) Klik pada mata wang yang anda minati.n' + '3) Anda akan menerima mesej yang mengandungi maklumat mengenai sumber dan mata wang sasaran, ' + 'kadar belian dan kadar jualan.n' + '4) Klik “Kemas kini” untuk menerima maklumat semasa berkenaan permintaan. ' + 'Bot juga akan menunjukkan perbezaan antara kadar pertukaran sebelumnya dan semasa.n' + '5) Bot menyokong sebaris. Taip @ dalam sebarang sembang dan huruf pertama mata wang.', reply_markup=keyboard )

Tindakan kod dalam sembang Telegram:

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Langkah 6: Menambah Pengendali Perintah /exchange

Langkah ini diperlukan untuk memaparkan butang dengan simbol mata wang yang tersedia dalam sembang. Papan kekunci pada skrin dengan pilihan akan membantu anda mengelakkan kesilapan. PrivatBank menyediakan maklumat mengenai ruble, dolar dan euro. Pilihan InlineKeyboardButton berfungsi seperti ini:

  1. Pengguna mengklik pada butang dengan sebutan yang dikehendaki.
  2. getUpdates menerima panggilan balik (CallbackQuery).
  3. Ia menjadi diketahui cara mengendalikan menekan papan kekunci - maklumat tentang butang yang ditekan dihantar.

/tukar kod pengendali:

@bot.message_handler(commands=['exchange']) def exchange_command(message): papan kekunci = 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, 'Klik pada mata wang pilihan:', reply_markup=keyboard )

Hasil kod dalam Telegram:

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Langkah 7: Menulis pengendali untuk butang papan kekunci terbina dalam

Pakej pyTelegramBot Api mengandungi fungsi penghias @bot.callback_query_handler. Komponen ini direka bentuk untuk menterjemah panggilan balik ke dalam fungsi - API membuka dan mencipta semula panggilan. Ia dieja seperti ini:

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

Mari kita tulis juga kaedah get_ex_callback:

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

Terdapat satu lagi kaedah yang berguna – answer_callback_query. Ia membantu untuk mengeluarkan beban antara menekan butang dan memaparkan hasilnya pada skrin. Anda boleh menghantar mesej ke send_exchange_query dengan menghantar beberapa kod mata wang dan Mesej. Mari tulis send_exchange_result:

def hantar_pertukaran_hasil(mesej, 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' )

Manakala chatbot menerima hasil permintaan daripada pihak bank API, pelawat melihat tulisan "menaip mesej". Nampaknya orang sebenar sedang menjawab. Untuk memaparkan penunjuk sedemikian pada skrin, anda perlu menambah baris status input. Seterusnya, kami akan menggunakan get_exchange – dengan bantuannya, program ini akan menerima penetapan mata wang (rubel, euro atau dolar). send_message menggunakan kaedah tambahan: serialize_ex menukar mata wang kepada format lain dan get_update_keyboard menyediakan kekunci lembut yang mengemas kini maklumat dan menghantar data pasaran mata wang ke sembang lain.

Mari tulis kod untuk get_update_keyboard. Dua butang perlu disebut - t dan e berdiri untuk jenis dan pertukaran. Item switch_inline_query untuk butang Kongsi diperlukan supaya pengguna boleh memilih daripada beberapa sembang. Pelawat akan dapat memilih kepada siapa untuk menghantar kadar pertukaran semasa dolar, ruble atau euro.

def get_update_keyboard(ex): papan kekunci = telebot.types.InlineKeyboardMarkup() keyboard.row( telebot.types.InlineKeyboardButton( 'Kemas kini', callback_data=json.dumps({ 't': 'u', 'e': { ' b': ex['beli'], 's': ex['sale'], 'c': ex['ccy'] } }).ganti(' ', '') ), telebot.types.InlineKeyboardButton ('Share', switch_inline_query=ex['ccy']) ) kembali papan kekunci

Kadangkala anda perlu melihat berapa banyak kadar pertukaran telah berubah dalam masa yang singkat. Mari kita tulis dua kaedah untuk butang Kemas kini supaya pengguna boleh melihat kursus dalam perbandingan.

Perbezaan antara kadar pertukaran dihantar kepada penyeri melalui parameter perbezaan.

Kaedah yang ditetapkan hanya berfungsi selepas data dikemas kini, ia tidak akan menjejaskan paparan pertama kursus.

def serialize_ex(ex_json, diff=None): result = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Beli: ' + ex_json['beli'] jika diff: hasil += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Jual: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: result += 'nJual: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: result = '(' + 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: result = '(' + str( perbezaan)[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">)' hasil pulangan

Bayangkan bahawa pengunjung ingin mengetahui kadar pertukaran dolar. Inilah yang berlaku jika anda memilih USD dalam mesej:

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Langkah 8: Melaksanakan Pengendali Butang Kemas Kini

Mari tulis kod untuk mengendalikan tindakan dengan butang Kemas Kini dan tambahkan bahagian iq_callback_method padanya. Apabila item program bermula dengan parameter get, anda mesti menulis get_ex_callback. Dalam situasi lain, kami menghuraikan JSON dan cuba mendapatkan kunci 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) kecuali ValueError: pass

Jika t sama dengan u, anda perlu menulis program untuk kaedah edit_message_callback. Mari kita pecahkan proses ini langkah demi langkah:

  1. Memuat turun maklumat terkini tentang keadaan pasaran mata wang (exchange_now = pb.get_exchange(data['c']).
  1. Menulis mesej baharu melalui penyeri bersiri dengan perbezaan.
  2. Menambah tandatangan (get_edited_signature).

Jika mesej awal tidak berubah, panggil kaedah 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() jika 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.id_line_message : bot.edit_message_text( text, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

Mari tulis kaedah get_ex_from_iq_data untuk menghuraikan JSON:

def get_ex_from_iq_data(exc_json): pulangkan { 'beli': exc_json['b'], 'jualan': exc_json['s'] }

Anda memerlukan beberapa kaedah lagi: contohnya, get_exchange_diff, yang membaca maklumat lama dan baharu tentang kos mata wang dan memaparkan perbezaannya.

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

Yang terakhir, get_edited_signature, menunjukkan masa kursus terakhir dikemas kini.

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

Akibatnya, mesej yang dikemas kini daripada bot dengan kadar pertukaran yang stabil kelihatan seperti ini:

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Apabila kursus berubah, perbezaan antara nilai dipaparkan dalam mesej disebabkan oleh parameter yang ditetapkan.

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Langkah 9: Pelaksanaan Mod Terbenam

Mod terbina dalam diperlukan untuk menghantar maklumat dengan cepat daripada program ke mana-mana sembang – kini anda tidak perlu menambah bot pada perbualan sebagai peserta. Apabila pengguna Telegram memasukkan nama bot dengan tanda @ di hadapannya, pilihan penukaran harus muncul di atas baris input. Jika anda mengklik pada salah satu item, bot akan menghantar mesej kepada perbualan dengan keputusan dan butang untuk mengemas kini dan menghantar data. Nama pengirim akan mengandungi kapsyen “melalui ".

InlineQuery dihantar ke query_text melalui perpustakaan. Kod menggunakan fungsi answer_line untuk mendapatkan semula hasil carian sebagai tatasusunan data dan elemen inline_query_id. Kami menggunakan get_exchanges supaya bot menemui beberapa mata wang atas permintaan.

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

Kami menghantar tatasusunan data kepada get_iq_articles untuk mengembalikan objek daripada InlineQueryResultArticle melalui kaedah ini.

def get_iq_articles(exchanges): result = [] untuk exc dalam pertukaran: 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 ) ) pulangan hasil

Sekarang, jika anda menulis @ dan ruang dalam baris, hasil carian akan muncul pada skrin – pilihan untuk menukar kepada tiga mata wang yang tersedia.

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Pengguna boleh menapis keputusan dengan memasukkan mata wang yang dikehendaki.

Selepas mengklik pada mata wang yang dikehendaki daripada senarai, sembang menerima mesej yang sama yang diterima pengguna bot. Anda juga boleh menggunakan butang Kemas Kini. Imej di bawah menunjukkan mesej dikemas kini yang dihantar melalui bot:

Bot Telegram dalam Python. Panduan lengkap untuk menulis bot dengan kadar pertukaran dari awal

Kesimpulan

Sekarang anda tahu cara membuat bot untuk Telegram. Anda boleh menambah alat berguna pada program anda: butang untuk mengemas kini dan menghantar hasil kepada pengguna lain utusan dan mod terbina dalam yang membolehkan anda menggunakan fungsi bot di luar sembang dengannya. Berdasarkan arahan ini, anda boleh mencipta sebarang bot mudah dengan fungsi lain – bukan sahaja yang akan menunjukkan kadar pertukaran. Jangan takut untuk bereksperimen dengan perpustakaan, API dan kod untuk mencipta pembantu automatik yang akan bersembang dengan pelanggan di Telegram dan mengukuhkan hubungan orang yang berminat dengan syarikat itu.

1 Komen

  1. Fatástica publicación

Sila tinggalkan balasan anda