テレグラフ対ノード電報ボットAPI


今日、最も人気のある方法は、ノードJSTelegraf and Node-Telegram-Bot-Api . 第2は、毎週のダウンロード(250.000)によってより人気があります、しかし、このポストでは、私は統計によって彼らを等しくしたくありません.私は彼らと私の経験について話をしたいと思います.その場合、私はそれらを使用して、あなたに本当に素晴らしいガイドを示します、特にtelegrafのために、彼らは初心者のために読むことができないドキュメントまたはタイプスクリプトを使用しない人々を引き起こします.

ボットのAPI


では、このパッケージから始めましょう.それは本当に簡単です、しかし、それのために、我々は本当に大きなプロジェクトでそれを使うことができません.そして、コメントなしでボットの構造を理解するのを難しくします、あるいは、100万のJavascriptファイル.
タイプのダウンロード
npm i node-telegram-bot-api
この後、ドキュメンテーションで述べたように、あなたがあなたから受け取った電報トークンでそれを初期化する必要がありますBot Father
const TelegramBot = require('node-telegram-bot-api');

const token = 'YOUR_TELEGRAM_BOT_TOKEN';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});
そして、このパッケージには2つの主要なメソッドがあります.bot.sendMessage(chatId, message, options) とボット.についてapi messageやtextのように、message paramを含む関数と応答を返す)
bot.on('message', (msg) => {
  const chatId = msg.chat.id;

  // send a message to the chat acknowledging receipt of their message
  bot.sendMessage(chatId, 'Received your message');
});
こちらmessage object すべてのフィールドで.それで、我々が反応する必要があるならば/start コマンドを実行する必要があります.
bot.on("message", async function (msg) {
  const text = msg.text;
  const chatId = msg.chat.id;
  if (text === "/start") {
    bot.sendMessage(chatId, `Hello ${msg.from.username}! Choose your language...`, 
   reply_markup: {
       one_time_keyboard: true,
       keyboard: [["ua"], ["en"]],
   },);
  }
});
我々のテキストが我々のコマンドに等しいかどうかチェックして、メッセージで応えました.このパッケージからのすべての主なロジック、sendMessageメソッドやparamsを見ることができますhere . その他使用reply_markup 我々の我々のメッセージで送られる我々のキーボードを使うことができるオプション.そして、テキストが“en”に等しいかどうかを確認できます.
また、ユーザーからメッセージを取得せずにメッセージを送信することができますような質問がある場合-あなたはそれを行うことができます.あなたが必要とするすべては、あなたのユーザーをデータベースに保存することですMongoDB チャチフィールドと何かを使用してexpress CRUDメソッドをあなたのメッセージを送信する.これが私の例です.
app.get("/", async (req, res) => {
  await TelegramUser.find()
    .cursor()
    .eachAsync(async (user) => {
      bot.sendMessage(user.chatId, "<b>Hi!</b>", {
        parse_mode: "HTML",
        disable_web_page_preview: false,
      });
    });
});
そこでここで私たちのメッセージ“hi”を非同期formonmondbメソッドのときに我々のアプリに要求を得た.TelegramUser MongoDBモデルは、私はユーザーchatidを格納します.また、このパッケージから2つの最も便利なオプションを参照することができます-私たちのメッセージを解析するParseSoundモード(これはIMG、ビデオのようなすべてのタグを解析することはできません、ビデオ、sendphoto、sendvideoのような方法がある原因)とDisableCal WebHangPageMenプレビュー、あなたがリンクを送信するメッセージで使用することができますし、それのプレビューを見たくない.
私はあなたがそれを得たことを望む、telegrafに移動しましょう.

テレグラフ


私が大プロジェクトで使うのを好む電報ロボット図書館について話しましょう.
ダウンロードする
npm i telegraf
このライブラリでは、ノード電報ボットAPIで同様の方法を見ることができます.
const { Telegraf } = require('telegraf')

const bot = new Telegraf(process.env.BOT_TOKEN)
bot.start((ctx) => ctx.reply('Welcome'))
bot.help((ctx) => ctx.reply('Send me a sticker'))
bot.on('sticker', (ctx) => ctx.reply('👍'))
bot.hears('hi', (ctx) => ctx.reply('Hey there'))
bot.launch()
初期化するにはnew Telegraf(token) . コマンドを開始してコマンドを開始するbot.start これは以前のパッケージより読みやすいです.メッセージオブジェクトの代わりに、我々はCTXを持ちますcontext object , それはほとんど最初の1つから大きな違いを持っていないが、他の多くの方法があります.ctx.reply レスポンスメッセージがある場合、ここでHTMLを解析したり、オーディオや写真などで返信したりする場合は、以下のような方法を使用できますctx.replyWithHTML or ctx.replyWithPhoto , あなたが前のリンクで見ることができるすべての方法.bot.on ノードtelegram bot apiと同じです、あなたが見ることができるこの機能を受けることができるすべてのparamshere . bot.hears はユーザのメッセージに反応する関数です.
そして我々のボットを起動するにはbot.launch()それが終わりであるように思えます、しかし、事実、それはこの図書館が与える機会の一部です.ここではscenes .

テレグラフシーン


のは、Telegramボットは、1つのビューアを持つ劇場です-私たちのユーザーを想像してみましょう.パフォーマンスが始まると、最初のシーンが始まります.いくつかの行動がしばらくの間この場面で起こります、そして、場面は終わります.それで、我々の場面の始まりと終わりからのこの間隔は、我々の場面です.
テレグラフシーンは同じですが、コードで表示しましょう.
このライブラリには2種類のシーンがあります.Base Scene and Wizard Scene .
私たちのシーンを設定するにはStage . 本題でそれをしましょう.
アプリ.js
const { Scenes, Telegraf } = require("telegraf");
const start = require("./controllers/start"); // scene file 
const about = require("./controllers/about"); // scene file 
const settings = require("./controllers/settings"); // scene file 
const contact = require("./controllers/contact"); // scene file 
const search = require("./controllers/search"); // scene file 


const bot = new Telegraf(process.env.TELEGRAM_TOKEN);
const stage = new Scenes.Stage([start, about, settings, contact, search]); // Register our scenes
bot.use(stage.middleware()); // Stage middleware
bot.hears("settings", Scenes.Stage.enter("settings")); // Entering the settings scene when listener worked
ここでは、我々の場面を輸入して、配列に登録しました.また、我々の場面が働かないステージミドルウェアを加えました.と我々のシーンを入力するにはbot.hears そして、最初のparamとして、私たちのシーンID(次の段落で参照)を入力し、我々はScenes.Stage.enter .

ベースシーン


以下はこの例です.
設定.js
const { Scenes } = require("telegraf");
const Scene = Scenes.BaseScene;
const { getMainKeyboard, getBackKeyboard } = require("../../util/keyboards");
const { leave } = Scenes.Stage;
const settings = new Scene("settings");

settings.enter(async (ctx) => {
  const { backKeyboard } = getBackKeyboard();
  await ctx.reply("settings.what_to_change", backKeyboard);
});
settings.leave(async (ctx) => {
  const { mainKeyboard } = getMainKeyboard();
  await ctx.reply("shared.what_next", mainKeyboard);
  await ctx.scene.leave();
});
settings.hears("Back", leave());
settings.action("backButtonId", console.log("Back button was clicked"));
module.exports = settings;

……Util/キーボード
const { Markup } = require("telegraf");

exports.getMainKeyboard = () => {
  let mainKeyboard = Markup.keyboard([
    ["Movies", "Settings"],
  ]);
  mainKeyboard = mainKeyboard.oneTime();

  return mainKeyboard;

};
exports.getBackKeyboard = () => {
  let backKeyboard = Markup.keyboard(["Back"]);
  backKeyboard = backKeyboard.oneTime();
  return backKeyboard;
};

それは私たちの設定シーンファイルです.それを初期化するためにnew Scene("scene id") . ユーザーが我々の場面に入ったとき、彼はsettings.enter(async function(ctx)) , 我々が場面の我々の第一歩をすること.それから、我々の場面のすべての行動は、中にありますsettings.on またはsettings.hears . それから、場面が終わるとき、我々は使いますsettings.leave 我々はデフォルトのシーン(スタートシーン)に戻ると機能を持っているとctx.scene.leave() , これは場面を残すために必要です.それがなければ、あなたは永遠にこのシーンに滞在するリスクがあります.
また、キーボードがあれば、Markup.keyboard , すべてのボタンは配列に文字列です.我々が我々のキーボードで多くの行を作りたいならば、我々は2つのストリング(ボタン)で2つの配列を持っているように、我々は各々の2つのボタンで2つの列でキーボードを得ます.
ボタンをタップすると、このタップを扱うことができますscene.action(buttonId) , ここでButtonIDは私たちのボタンの2番目のparamMarkup.button.callback . また、インラインキーボードを作成することができますMarkup.inlineKeyboard
Markup.inlineKeyboard(
  [
    Markup.button.callback("Back", "backButtonId"),
  ],
  {}
)
  .oneTime()
  .resize();

ウィザードシーン


このシーンのすべてのロジックは前と同じですが、ここでシーンのステップとチェーンがあります.次のステップに進むにはctx.wizard.next and ctx.wizard.steps[ctx.wizard.cursor](ctx) また、それなしでtelegrafの最後のバージョンの原因は、我々のステップは変わりません.我々が使う場面から去るためにctx.scene.leave
const { Scenes } = require("telegraf");
const { getMainKeyboard } = require("../../util/keyboards");
const Wizard = Scenes.WizardScene;
const about = new Wizard(
  "about", // Our wizard scene id, which we will use to enter the scene
  async (ctx) => {
    await ctx.reply(ctx.i18n.t("scenes.about.main"));
    ctx.wizard.next();
    return ctx.wizard.steps[ctx.wizard.cursor](ctx);
  },
  async (ctx) => {
    const { mainKeyboard } = getMainKeyboard(ctx);
    await ctx.reply(ctx.i18n.t("shared.what_next"), mainKeyboard);
    return ctx.scene.leave();
  }
);
module.exports = about;

セッション


そして、このライブラリの最後の主なものはセッションです.それはウェブのローカル記憶のようです、しかし、電報ボットのために.ここでは、我々は保存し、将来的にそれらを使用する必要があるparamsを保存することができます.設定するには、メインファイルを変更しましょう.
const { Scenes, session, Telegraf } = require("telegraf");
const start = require("./controllers/start"); // scene file 
const about = require("./controllers/about"); // scene file 
const settings = require("./controllers/settings"); // scene file 
const contact = require("./controllers/contact"); // scene file 
const search = require("./controllers/search"); // scene file 


const bot = new Telegraf(process.env.TELEGRAM_TOKEN);
const stage = new Scenes.Stage([start, about, settings, contact, search]); // Register our scenes
bot.use(session()); // Session middleware
bot.use(stage.middleware()); // Stage middleware
bot.hears("settings", Scenes.Stage.enter("settings")); // Entering the settings scene when listener worked
ここでは、我々のセッションをtelegrafから輸入して、セッションミドルウェアを作りました.それから、我々は我々の場面でそれを使うことができます.例えば、
const { Scenes, session } = require("telegraf");
const { getMainKeyboard, getBackKeyboard } = require("../../util/keyboards");
const { User } = require("../../models");
const { getMoviesBySearch, getMovieKeyboard } = require("./helpers");
const Base = Scenes.BaseScene;
const search = new Base("search");
const { leave } = Scenes.Stage;

search.enter(async (ctx) => {
  const backKeyboard = getBackKeyboard(ctx);
  await ctx.replyWithHTML("scenes.search.welcome_to_search",
    backKeyboard
  );
});

search.hears("Back"), leave());
search.on("text", async (ctx) => {
  const user = await User.findById(ctx.from.id);
  const movies = getMoviesBySearch(user.language, ctx.message.text);
  const movieKeyboard = getMovieKeyboard(ctx);
  ctx.session.movies = movies; // Set session field
  ctx.session.index = 0; // Set session field
  ctx.replyWithHTML(``, movieKeyboard);
});

search.leave(async (ctx) => {
  const { mainKeyboard } = getMainKeyboard(ctx);
  await ctx.reply("shared.what_next", mainKeyboard);
  delete ctx.session.index; // Delete session field
  delete ctx.session.movies; // Delete session field
  await ctx.scene.leave();
});
module.exports = search;

結論


このポストでは、ステップバイステップで最も人気のあるJS電報ライブラリに対処する方法を説明しました.私が言ったように、私は、それがより面白くて読みやすいのでNode電報ボットAPIにtelegrafを好む.あなたがそれについての考えがあるならば、以下のコメントを書いて、私がこのポストで若干の間違いをしたならば、私を正してください😅

加えて


今日、私の国では、ウクライナでは、ロシアの侵略によって引き起こされた戦争です.私は私の国で平和を持ちたいです、そして、我々の軍は最善を尽くします、そして、あなたがあなたのdevのポストにおいて、Nurarinukraineを書くことを支持することができるならば、それは素晴らしいです.私はすぐに私はここに任意の記事を書くことができると再びコードプロジェクトを作ることができる、今私は地階に座っているだけで待つことを願っています.