AhFei

AhFei

简洁的写作需要勇气

Telegramボットの登録と使用 Pythonでボットを作成

いくつかの間違いを犯したかもしれませんので、何か間違っていたら教えてください!


先自荐一个 tg 转发机器人,避免存入 tg 收藏夹然后吃灰。

プロジェクトのアドレス: AhFeil/extract_forward_tgbot: 存储转发给它的消息到文件中,并能推送到网页,方便查看编辑信息 (github.com)

それの最も基本的な使用法: (詳細は GitHub プロジェクトのホームページを参照してください)

  1. メッセージをそれに転送する(純粋なテキストメッセージと画像付きメッセージのみサポート)、または直接メッセージを送信
  2. それはその中のテキストと内部リンクのウェブサイトを抽出し、それをファイルに保存します。内部リンクのウェブサイトは順番にテキストの後ろに配置されます。
  3. コマンド /push を送信すると、それは上記のファイルのすべての内容を別の便利にアクセスできるファイルにコピーします。現在使用しているのは 网页记事本 で、対応するウェブページにアクセスすると見ることができます。
  4. コンピュータでウェブページにアクセスし、確認して効率的に処理します。

Telegram でボットを登録し、設定する#

ボットを登録する#

登録プロセスは非常に簡単で、telegram で「ボットの父」にメッセージを送信します。つまり、 https://t.me/BotFather というボットに:

  1. @BotFather との対話ウィンドウを開く
  2. /start を送信(開始)
  3. /newbot を送信
  4. ボットの名前(名称、ニックネーム)を送信
  5. ボットのユーザー名(ユーザー名、ID)を指定します。このユーザー名は bot で終わる必要があり、変更できません。
  6. 名前が重複しなければ、登録が完了し、送信されたメッセージにはボットのトークンが含まれています。形式は次のようになります: 6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU
  7. トークンを保存し、漏洩しないようにします。

register-Telegram-Bot.png

chat_id を取得する#

まずボットを登録し、start をクリックした後、新しく登録したボットに任意のメッセージを送信し、その後次の URL を開きます:

# トークン部分を変更し、前の bot は削除しないでください
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates

ここで "chat" の "id" がメッセージを送信したアカウントの chat_id です。保存してください。

ボットにコマンドを追加する#

コマンドの本質は / で始まるテキストですので、直接 /コマンド を送信してトリガーできます。

BotFather を通じてボットにコマンドを設定します。プロセスは、/setcommands を送信し、変更したいボットを選択し、次にフォーマットに従ってコマンドリストを送信するだけです。フォーマットは次の通りです:

start - 何ができるか見てみましょう
forward - ウェブページにプッシュ
emsg - 保存された最初のメッセージ
dmsg - 最新のメッセージを削除し、テキストを返す
shutdown - 実行を停止
clear - 転送情報をクリア

その後、ボットの入力ボックスの左側にある M をクリックすると、設定したコマンドリストが表示されます。

ボットの個性化紹介を設定する#

/mybots を送信し、ボットを選択し、次に【Edit Bot】をクリックします。ここで名前、アイコン、紹介、コマンドを編集できます。

その中の About は下の画面に表示されるものを編集します。

customize-About-Telegram-Bot.png

Description はボットに初めて入ったときのこの画面です:

customize-Description-Telegram-Bot.png

実際には、ボットの対話ウィンドウで紹介情報を編集するオプションを見つけることもできます。コンピュータでも携帯でも可能で、より便利です。


Telegram-Bot 公式#

公式ドキュメント: Bots: An introduction for developers (telegram.org)
tg 公式が挙げたライブラリのいくつか: Bot API Library Examples (telegram.org)

Telegram-Bot-flowchart.png

一部の制限#

不完全で、記録に過ぎません

注意: ボットはチャンネルの管理者として設定する必要があります。そうしないとメッセージを送信できません。

チャンネルは公開に設定する必要があります。

チャンネルでは @name を通じてメッセージを送信できますが、個人にはできず、chat_id を通じてのみ可能です。

また、ボットはユーザーがそれにメッセージを送信したり、ボットをグループに追加した後でないと、ユーザーにメッセージを主动的に送信できません。ボットは見知らぬユーザーに主动的にメッセージを送信できません。

カスタムキーボード & インラインキーボード#

カスタムキーボードとインラインキーボードには以下の違いがあります:

  1. インラインキーボードは入力エリアの上に表示され、カスタムキーボードはキーボード入力エリアの下に表示されます。
  2. インラインキーボードを押すとボットにコールバッククエリが返されますが、カスタムキーボードを押すとボットにテキストメッセージが送信されます。本質的にはテキストと同じコマンドです。

ブラウザで直接確認する(webhook)#

コードを書く前に、手動で webhook を使用してボットが受信した情報を確認し、直感的に理解することができます。

Telegram の API インターフェース形式は URL で、通常使用するウェブサイトと似ています。

以下の URL をブラウザのアドレスバーにコピーし、Your Token を実際のトークンに置き換えてアクセスします:

https://api.telegram.org/botYour Token/getupdates

# 例えば、こうです
https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/getupdates

ボットにメッセージを送信した後、ブラウザをリフレッシュすると、以下のようなメッセージが得られます:

{'chat': {'first_name': 'Jean',
          'id': 24601,
          'last_name': 'Valjean',
          'type': 'private',
          'username': 'MonsierMadeleine'},
 'date': 17691833,
 'from': {'first_name': 'Jean',
          'id': 24601,
          'is_bot': False,
          'last_name': 'Valjean',
          'username': 'MonsierMadeleine'},
 'message_id': 7417,
 'text': 'I am warning you Javert'}

メッセージは json 形式で包装されて送信され、本質的にはネストされた辞書です。つまり、辞書がもう一つの辞書を包んでいます。


もしアドレスバーに次の URL を入力した場合:

https://api.telegram.org/botYour Token/sendMessage?chat_id="Some Chat id"&text="Hello"

https://api.telegram.org/bot6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU/sendMessage?chat_id=2066666604&text="Hello"

実際のトークンと chat ID に置き換え、テキストを編集し、エンターを押すと、あなたのボットは「Hello」を指定したユーザーに送信します。

形式は似ており、Telegram は sendMessage、sendPhoto などの多くの機能を規定しています。

メッセージ のキーには chat(ユーザーの名前、ID、チャットの種類)、date(メッセージ送信の日付)、from(送信者の情報)、message_id(特定のメッセージを指す)、text(ユーザーが送信したメッセージのテキスト)が含まれます。

Telegram では、チャットの種類はプライベート、グループ、チャンネルの三種類に分かれています。


python-telegram-bot#

プログラミング言語の一つと API をラップするライブラリを選択し、開発を便利にします。

ここでは Python を使用し、ライブラリは python-telegram-bot を使用して公式 API を迅速に操作します。関連するウェブサイトは次の通りです:


3 つのファイルを作成することをお勧めします。例えば extract_forward_tgbot.pytgbotBehavior.py、前者はルーティングを設定し、ルーティングを開始するために登録し、後者は具体的な関数(ボットの動作を定義)を置きます。

さらに config.py はトークンなどの設定情報を構成するために使用します。

フローチャートが来ました!

image

実際の作成#

私はこのライブラリの wiki を見て入門しました: Extensions Your first Bot (github.com)

以下に AhFei が書いた小さな例を見てみてください。少なくとも中国語で理解しやすいです。公式の wiki を見ると、実際にはそれ以上を書く必要はありません。公式のドキュメントが最良の参考です。

この例では、bot_token を入力するだけで、残りは完全にコピー&ペーストで実行できます(国内ネットワークの場合は、プロキシアドレスを設定する必要があります)。
興味がある方は、まず一度実行してみて、成功したら修正してください。


まずライブラリをインストールします(Python 3.7+)

pip3 install python-telegram-bot~=20.3

まず config.py を見て、bot_token とプロキシアドレスを設定します。

# config.py
import platform
from enum import Enum
import os
import sys

# 将参数值赋给变量
bot_token = "6111111110:AAxxxxxvfly2xxxx9iGxxLa_atxxcomxuNU"

# 下面跟机器人没什么关系,主要作用方便开发,如果在 Windows ,则说明是开发环境,配置代理和修改一些变量的值,如果是 Linux,就是生产环境

system = platform.system()  # 获取操作系统名字

if system == 'Windows':
    # 处于开发环境
    os.environ["http_proxy"] = "http://127.0.0.1:10809"
    os.environ["https_proxy"] = "http://127.0.0.1:10809"
elif system == 'Linux':
    # 处于生产环境
    pass
else:
    # 直接退出
    sys.exit('Unknown system.')

次に extract_forward_tgbot.py を見て、ここでは 3 つの動作をインポートし、start、myid、transfer を設定し、ルーティングを構成します。つまり、

  1. ボットが '/start' を受信すると、start 関数を実行します。
  2. ボットが '/myid' を受信すると、myid 関数を実行します。
  3. ボットがコマンド以外の内容を受信すると、transfer 関数を実行します。

一時的に私のプロジェクトから転送ボットのコードを抽出しました。後で時間があれば、簡単で実用的な具体例に変更します。

これは私たちのメインプログラムで、python3 extract_forward_tgbot.py でプログラムを起動する必要があります。

# extract_forward_tgbot.py

from telegram import Update   # 获取消息队列的
from telegram.ext import filters, MessageHandler, ApplicationBuilder, CommandHandler,  ContextTypes

import config
# 从 tgbotBehavior.py 导入定义机器人动作的函数
from tgbotBehavior import start, transfer, myid

if __name__ == '__main__':  
    # 创建实例的,在这里放入 token
    application = ApplicationBuilder().token(config.bot_token).build()  
  
    # 类似路由,接收到 /start 执行哪个函数,左边是指令,右边是定义动作的函数
    start_handler = CommandHandler('start', start)  
    # (~filters.COMMAND)  就是指令之外的消息  
    transfer_handler = MessageHandler((~filters.COMMAND), transfer)  
    # 
    myid_handler = CommandHandler('myid', myid)  

    # 注册 start_handler ,以便调度  
    application.add_handler(start_handler)  
    application.add_handler(transfer_handler)  
    application.add_handler(myid_handler)  
  
    # 启动,直到按 Ctrl-C
    application.run_polling(allowed_updates=Update.ALL_TYPES)

最後に tgbotBehavior.py を見て、ボットのさまざまな動作を定義します。

# tgbotBehavior.py

from telegram import Update  
from telegram.ext import ContextTypes  

import config  

# 回复固定内容  
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):  
    # 定义一些行为
    
    # 向发来 /start 的用户发送消息
    await context.bot.send_message(chat_id=update.effective_chat.id,  
                                   text=f"これは転送ボットです")  

# 返回 ID
async def myid(update: Update, context: ContextTypes.DEFAULT_TYPE):  
    # update.effective_chat.id  可以就是与机器人交流的用户的 chat id
    your_chat_id = update.effective_chat.id  

    await context.bot.send_message(chat_id=update.effective_chat.id, text=f'あなたの chat id は {your_chat_id} です')  

async def transfer(update: Update, context: ContextTypes.DEFAULT_TYPE):  
    # 定义一些行为
    # 省略
    pass

メインプログラムを実行した後、

  • /start を送信すると、「これは転送ボットです」と返答されます。
  • /myid を送信すると、「あなたの chat id は 123456789 です」と返答されます。
  • その他のメッセージには何の応答もありません。

実際には構造が非常に明確で、まず動作を定義する関数を作成し、次にルーティングを構成して有効にします。
参考文献を見れば、機能豊富なボットを作成できます!

systemd デーモンを使用する#

実際に Linux でボットを実行する際、systemd デーモンを使用することは持続的に実行する良い方法です。具体的な設定については、当サイトのこの記事を参照してください: Telegram 転送ボットのデプロイプロセス

チートシート#

  • ユーザー ID : update.effective_chat.id

  • 転送元: update.message.forward_from_chat.title と update.message.forward_from_chat.username 、前者はチャンネル名、後者は @ユーザー名

  • 転送されたメッセージのソース ID: update.message.forward_from_message_id

  • テキストメッセージの内容: update.message.text

  • 画像メッセージの内容: update.message.caption


もし「ブラウザで直接確認する(webhook)」のセクションを見て実践したことがあれば、上記の構造がウェブページ上の情報と一対一で対応していることがわかります。


原文リンク: https://blog.vfly2.com/2023/08/register-telegram-bot-and-build-a-bot-using-python/

版权声明:本博客所有文章除特別声明外,均为 AhFei 原创,采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 承飞之咎 (blog.vfly2.com)

保持更新 ٩(・̤̀ᵕ・̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰可重复的实用技能,欢迎使用 RSS 订阅,也欢迎留言指正。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。