Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

テレグラムのボットは、視聴者との連絡を確立したり、以前は手動で実行する必要があったアクションを簡素化したりするのに役立つプログラムです。 これらのプログラムは、メッセンジャー プラットフォーム専用に作成されています。 ボットは次のように機能します。ユーザーが入力ラインからコマンドを送信すると、システムがテキストまたはインタラクティブ メッセージで応答します。 場合によっては、プログラムが実在の人物の行動を模倣することさえあります。このようなボットは、顧客の信頼をさらに高めます。

ユーザーを自動的に支援するシステムには、いくつかの種類があります。 顧客と通信するだけのボットもあれば、定期的に情報を提供するボットもあります。 プログラムをタイプに明確に分類することは不可能です。開発者は、多くの場合、XNUMX つのボットで複数の機能を組み合わせます。

画面上のボタンの形でインタラクティブな要素を備えた Telegram 用のシンプルなボットを 9 ステップで作成できます。 それぞれを詳しく見て、いくつかの質問に答えてみましょう。

  • ボットの開始方法;
  • XNUMX つまたは複数のボタンから組み込みキーボードを登録する方法。
  • 必要な機能のボタンをプログラムする方法。
  • インライン モードとは何か、既存のボットに設定する方法。

ステップ 0: Telegram ボット API に関する理論的背景

Telegram ボットの作成に使用される主なツールは、HTML アプリケーション プログラミング インターフェイス (HTML API) です。 この要素は、訪問者の要求を受け入れ、情報の形式で応答を送信します。 既製のデザインにより、プログラムでの作業が簡素化されます。 Telegram のボットを作成するには、次のメール アドレスを使用する必要があります: https://api.telegram.org/bot/METHOD_NAME

ボットが正しく機能するには、トークンも必要です。これは、プログラムを保護し、信頼できる開発者がプロ​​グラムにアクセスできるようにする文字の組み合わせです。 各トークンは一意です。 文字列は作成時にボットに割り当てられます。 メソッドは異なる場合があります: getUpdates、getChat など。 メソッドの選択は、開発者がボットに期待するアルゴリズムによって異なります。 トークンの例:

123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11

ボットは GET および POST リクエストを使用します。 多くの場合、メソッド パラメーターを補足する必要があります。たとえば、sendMessage メソッドでチャット ID とテキストを送信する必要がある場合です。 メソッド絞り込みのパラメーターは、application/x-www-form-urlencoded または application-json を使用して URL クエリ文字列として渡すことができます。 これらの方法は、ファイルのダウンロードには適していません。 UTF-8 エンコーディングも必要です。 APIにリクエストを送信することで、結果をJSON形式で取得できます。 getME メソッドを介して情報を取得したときのプログラムの応答を見てみましょう。

https://api.telegram.org/bot を取得/getMe{ ok: true, result: { id: 231757398, first_name: "為替レート ボット", ユーザー名: "exchangetestbot" } }

次の場合に結果が得られます。 ok 等しい true. それ以外の場合、システムはエラーを示します。

ボットでカスタム メッセージを取得するには、XNUMX つの方法があります。 どちらの方法も効果的ですが、適しているケースは異なります。 メッセージを取得するには、getUpdates メソッドを使用して手動でリクエストを作成できます。プログラムは更新データ配列を画面に表示します。 リクエストは定期的に送信する必要があり、各配列を分析した後、送信を繰り返します。 オフセットは、チェックされたオブジェクトの再表示を避けるために、新しい結果をロードする前にスキップされたレコードの数を決定するパラメーターです。 getUpdates メソッドの利点は、次の場合に発揮されます。

  • HTTPS を構成する方法はありません。
  • 複雑なスクリプト言語が使用されています。
  • ボット サーバーは時々変更されます。
  • ボットにはユーザーがロードされています。

ユーザー メッセージを受信するために記述できる XNUMX 番目のメソッドは、setWebhook です。 一度使用するだけで、常に新しいリクエストを送信する必要はありません。 Webhook は、指定された URL にデータの更新を送信します。 この方法には SSL 証明書が必要です。 Webhook は次の場合に役立ちます。

  • ウェブプログラミング言語が使用されています。
  • ボットが過負荷になっておらず、ユーザーが多すぎない。
  • サーバーは変更されず、プログラムは同じサーバーに長期間残ります。

以降の手順では、getUpdates を使用します。

@BotFather Telegram サービスは、チャット ボットを作成するように設計されています。 基本的な設定もこのシステムを介して設定されます。BotFather は、説明の作成、プロフィール写真の挿入、サポート ツールの追加を支援します。 ライブラリー (Telegram ボット用の HTML 要求のセット) はインターネットで入手できます。かなりの量があります。 サンプルプログラムの作成時には、pyTelegramBotApi が使用されました。

ステップ 1: 為替レート リクエストの実装

最初に、クエリを実行するコードを記述する必要があります。 PrivatBank API を作成するときに使用します。以下はそのリンクです: https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5. コードでこれらのメソッドを使用する必要があります。

  • load_exchange – 為替レートを検索し、エンコードされた情報を表示します。
  • get_exchange – 特定の通貨に関するデータを表示します。
  • get_exchanges – サンプルに従って通貨のリストを表示します。

その結果、pb.py ファイルのコードは次のようになります。

import re import requests 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 exc in load_exchange(): re.match(ccy_pattern, exc['ccy'], re.IGNORECASE) が None でない場合: result.append(exc) 結果を返す

プログラムは、指定された要求に対して次の応答を発行できます。

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

ステップ 2: @BotFather を使用して電報ボットを作成する

@BotFather サービスを使用して、メッセージを受信して​​応答するためのプログラムを作成できます。 彼の Telegram ページに移動し、/newbot コマンドを入力します。 チャットに指示が表示されます。それに従って、最初にボットの名前を書き留め、次にそのアドレスを書き留める必要があります。 ボット アカウントが作成されると、トークンを含むウェルカム メッセージが画面に表示されます。 さらに設定するには、次のコマンドを使用します。

  • /setdescription – 説明;
  • /setabouttext – 新しいボットに関する情報。
  • /setuserpic – プロフィール写真;
  • /setinline – インライン モード。
  • /setcommands – コマンドの説明。

最後の構成ステップで、/help と /exchange について説明します。 すべてのステップが完了したら、コーディングに進みます。

ステップ 3: ボットのセットアップと起動

config.py ファイルを作成しましょう。 その中で、一意のボット コードと、プログラムが情報を検索するタイム ゾーンを指定する必要があります。

トークン = '' # ボットのトークンに置き換えますTIMEZONE = 'Europe/Kiev' TIMEZONE_COMMON_NAME = 'Kiev'

次に、以前に作成した pb.py、ライブラリ、およびその他の必要なコンポーネントをインポートして別のファイルを作成します。 不足しているライブラリは、パッケージ管理システム (pip) からインストールされます。

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

pyTelegramBotApi のコンテンツを使用してボットを作成しましょう。 次のコードを使用して、受信したトークンを送信します。

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

none_stop パラメーターは、要求が常に送信されるようにします。 パラメータの操作は、メソッド エラーの影響を受けません。

ステップ 4: /start コマンド ハンドラーを作成する

前の手順がすべて正しく行われていれば、ボットは機能し始めています。 プログラムは getUpdates メソッドを使用するため、定期的にリクエストを生成します。 none_stop 要素のある行の前に、/start コマンドを処理するコードが必要です。

@bot.message_handler(commands=['start']) def start_command(message): bot.send_message( message.chat.id, 'こんにちは! 為替レートを表示できます.n' + '為替レートを取得するには / を押しますexchange.n' + 'ヘルプを表示するには、/help を押してください。' )

R舞台舞台S収録<XNUMXxXNUMX>R コマンド=['開始'] 真に等しい start_command が呼び出されます。 そこにメッセージの内容が入ります。 次に、送信機能を実装する必要があります_メッセージ 特定のメッセージに関連して。

ステップ 5: /help コマンド ハンドラーを作成する

/help コマンドはボタンとして実装できます。 それをクリックすると、ユーザーは開発者の Telegram アカウントに移動します。 ボタンに「開発者に聞く」などの名前を付けます。 send_message メソッドに、ユーザーをリンクにリダイレクトする reply_markup パラメーターを設定します。 キーボードを作成するパラメータ(InlineKeyboardMarkup)をコードに書きましょう。 必要なボタンは XNUMX つだけです (InlineKeyboardButton)。

最終的なコマンド ハンドラー コードは次のようになります。

@bot.message_handler(commands=['help']) def help_command(message): キーボード = telebot.types.InlineKeyboardMarkup() keyboard.add( telebot.types.InlineKeyboardButton( '開発者に聞く', url='ваша ссылка на профиль' ) ) bot.send_message( message.chat.id, '1) 利用可能な通貨のリストを受け取るには、/exchange.n' + '2) 関心のある通貨をクリックします.n' + '3) あなたはソース通貨とターゲット通貨に関する情報を含むメッセージを受け取ります。' + '買いレートと売りレート.n' + '4) [更新] をクリックして、リクエストに関する現在の情報を受け取ります。 ' + 'ボットは以前と現在の為替レートの差も表示します.n' + '5) ボットはインラインをサポートしています. タイプ @ 任意のチャットと通貨の最初の文字。', reply_markup=keyboard )

Telegram チャットでのコード アクション:

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

ステップ 6: /exchange コマンド ハンドラーの追加

このステップは、チャットで使用可能な通貨の記号を含むボタンを表示するために必要です。 オプション付きのスクリーン キーボードは、間違いを避けるのに役立ちます。 PrivatBank は、ルーブル、ドル、ユーロに関する情報を提供しています。 InlineKeyboardButton オプションは次のように機能します。

  1. ユーザーは、目的の指定のボタンをクリックします。
  2. getUpdates はコールバック (CallbackQuery) を受け取ります。
  3. キーボードの押下を処理する方法が明らかになり、押下されたボタンに関する情報が送信されます。

/exchange ハンドラ コード:

@bot.message_handler(commands=['exchange']) def exchange_command(message): キーボード = 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, '選択した通貨をクリックしてください:', reply_markup=keyboard )

Telegram のコードの結果:

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

ステップ 7: 組み込みのキーボード ボタンのハンドラーを作成する

pyTelegramBot Api パッケージには @bot.callback_query_handler デコレーター関数が含まれています。 このコンポーネントは、コールバックを関数に変換するように設計されています。API が呼び出しをアンラップして再作成します。 次のように綴られています。

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

get_ex_callback メソッドも書きましょう。

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

answer_callback_query という別の便利なメソッドがあります。 ボタンを押してから画面に結果を表示するまでの負荷を取り除くのに役立ちます。 通貨コードとメッセージを渡すことで、send_exchange_query にメッセージを送信できます。 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_update_keyboard(ex) ), parse_mode='HTML' )

チャットボットが銀行からリクエストの結果を受け取る間 API、訪問者には「メッセージを入力しています」という碑文が表示されます。 本物の人間が答えているようです。 このようなインジケータを画面に表示するには、入力ステータス行を追加する必要があります。 次に、get_exchange を使用します。これにより、プログラムは通貨の指定 (ルーブル、ユーロ、またはドル) を受け取ります。 send_message は追加のメソッドを使用します。serialize_ex は通貨を別の形式に変換し、get_update_keyboard は情報を更新して通貨市場データを他のチャットに送信するソフトキーを設定します。

get_update_keyboard のコードを書きましょう。 XNUMX つのボタンについて言及する必要があります。t と e は、タイプと交換を表します。 ユーザーが複数のチャットから選択できるようにするには、共有ボタンの switch_inline_query アイテムが必要です。 訪問者は、ドル、ルーブル、またはユーロの現在の為替レートを誰に送信するかを選択できます。

def get_update_keyboard(ex): キーボード = 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 ('Share', switch_inline_query=ex['ccy']) ) キーボードを返す

短期間に為替レートがどれだけ変化したかを確認する必要がある場合があります。 ユーザーがコースを比較して表示できるように、[更新] ボタンに XNUMX つのメソッドを記述しましょう。

為替レートの差は、diff パラメータを介してシリアライザに渡されます。

所定のメソッドは、データが更新された後にのみ機能し、コースの最初の表示には影響しません。

def serialize_ex(ex_json, diff=None): 結果 = '' + ex_json['base_ccy'] + ' -> ' + ex_json['ccy'] + ':nn' + 'Buy: ' + ex_json['buy'] if diff: result += ' ' + serialize_exchange_diff(diff['buy_diff']) + 'n' + 'Sell: ' + ex_json['sale'] + ' ' + serialize_exchange_diff(diff['sale_diff']) + 'n' else: 結果 += 'nSell: ' + ex_json['sale'] + 'n' return result def serialize_exchange_diff(diff): result = '' if diff > 0: 結果 = '(' + str(差分) + ' " 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: 結果 = '(' + 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">)' 戻り結果

訪問者がドルの為替レートを知りたがっていると想像してください。 メッセージで USD を選択すると、次のようになります。

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

ステップ 8: 更新ボタン ハンドラーの実装

Update ボタンでアクションを処理するためのコードを書き、それに iq_callback_method 部分を追加しましょう。 プログラム項目が get パラメータで始まる場合は、get_ex_callback を記述する必要があります。 他の状況では、JSON を解析してキー 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) 以外の ValueError: パス

t が u と等しい場合、edit_message_callback メソッドのプログラムを作成する必要があります。 このプロセスを段階的に分解してみましょう。

  1. 通貨市場の状態に関する最新情報をダウンロードします (exchange_now = pb.get_exchange(data['c']))。
  1. 差分を使用してシリアライザーを介して新しいメッセージを書き込みます。
  2. 署名の追加 (get_edited_signature)。

最初のメッセージが変わらない場合は、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_message_id : bot.edit_message_text( テキスト, inline_message_id=query.inline_message_id, reply_markup=get_update_keyboard(exchange_now), parse_mode='HTML' )

JSON を解析する get_ex_from_iq_data メソッドを書きましょう。

def get_ex_from_iq_data(exc_json): return { 'buy': exc_json['b'], 'sale': exc_json['s'] }

さらにいくつかのメソッドが必要になります。たとえば、通貨のコストに関する古い情報と新しい情報を読み取り、差額を表示する get_exchange_diff などです。

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

最後の get_edited_signature は、コースが最後に更新された時刻を示します。

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

その結果、為替レートが安定しているボットからの更新されたメッセージは次のようになります。

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

コースが変わると、規定のパラメータにより値の差がメッセージに表示されます。

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

ステップ 9: 組み込みモードの実装

プログラムから任意のチャットに情報をすばやく送信するには、組み込みモードが必要です。参加者として会話にボットを追加する必要はありません。 Telegram ユーザーがボット名の前に @ 記号を付けて入力すると、入力行の上に変換オプションが表示されます。 項目の XNUMX つをクリックすると、ボットは、結果と、データを更新および送信するためのボタンを含むメッセージを会話に送信します。 送信者の名前には、キャプション「via」が含まれます。 "

InlineQuery はライブラリ経由で query_text に渡されます。 コードは answer_line 関数を使用して、データの配列と inline_query_id 要素として検索結果を取得します。 ボットが要求に応じて複数の通貨を見つけるように、get_exchanges を使用します。

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

このメソッドを介して InlineQueryResultArticle からオブジェクトを返すために、データの配列を get_iq_articles に渡します。

def get_iq_articles(exchanges): result = [] exchange の exc: 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 ) )結果を返す

ここで、@ と書くと と行にスペースを入れると、検索結果が画面に表示されます - 利用可能な XNUMX つの通貨に変換するためのオプションです。

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

ユーザーは、目的の通貨を入力して結果をフィルタリングできます。

リストから目的の通貨をクリックすると、チャットはボット ユーザーが受け取るのと同じメッセージを受け取ります。 [更新] ボタンを使用することもできます。 以下の画像は、ボットを介して送信された更新されたメッセージを示しています。

Python の電報ボット。 ゼロから為替レートを使用してボットを作成するための完全なガイド

まとめ

これで、Telegram のボットを作成する方法がわかりました。 便利なツールをプログラムに追加できます。結果を更新してメッセンジャーの他のユーザーに送信するためのボタンと、チャットの外でボットの機能を使用できる組み込みモードです。 この指示に基づいて、為替レートを表示するだけでなく、他の機能を備えた単純なボットを作成できます。 ライブラリ、API、およびコードを試して、Telegram で顧客とチャットし、関心のある人々と会社とのつながりを強化する自動アシスタントを作成することを恐れないでください。

1コメント

コメントを残す