KotlinのTelegram用のエコーボット

前書き

この記事の一部として、フォーマットとメディアを考慮して、ユーザーが送信したメッセージを再送信できる独自のボットを作成します。





ボットのトピックは、多くのブログ、投稿、ブログ投稿、およびその他のコーダーによって穴をあけられてきました。ただし、ほとんどの場合、これらは条件付きのPython / JS / PHPボットであり、通常はその方法で実行でき、すべてが機能しているように見えます。かつて、私は(ほとんど)これらの言語をJavaでの強い型付けとオブジェクト指向の世界に残し、後にKotlinに残しました。私が最初のボットを書くことに興味を持っていたとき githubマーケットpengrad / java-telegram-bot-apiライブラリしかありませんでしたが、個人的には致命的な欠点が1つありました。当時はTelegramが完全に複製されていました。ボットAPI。つまり、実際には、Javaクラスを介した対話に加えて、他に何も提供しなかったガスケットでした。





そこで、Telegram BotAPI用に独自のライブラリを作成するというアイデアを思いつきましたメインAPIをカバーする最初のバージョンは私に1か月かかりましたが、更新が出て、ユーザーは改善のためのアイデアを提案し、私はしばしば自分の手で物事を継続的に行うのが好きではありませんでした。その結果、ライブラリは今日まで開発されており、便利なAPI、独自のDSLを備えていますが、最も重要なことは、Telegram BotAPIを使用して作業を厳密に入力するという当初のアイデアを失っていないことです。





Telegramボットの一般的な仕組み

テレグラムボットには多くの制限があります。ここでは美しい数字をよく見ることができますが、要するに(自分自身を繰り返さないように、BotFatherへのリンク)(おそらく、視野を広げるために補充されます):





  • - ( group privacy BotFather)





  • - . - , , . , ( BotFather)





    • , - , - ,





  • API . . .





:









  • BotFather /newbot







  • ,









,

  1. BotFather /newbot











Readme , App.kt



. , :





suspend fun main(args: Array<String>) {
    val bot = telegramBot(args.first()) // 1
    val scope = CoroutineScope(Dispatchers.Default) // 2

    bot.buildBehaviour(scope) { // 3
        val me = getMe()

        onCommand("start", requireOnlyCommandInMessage = true) {
            reply(it, "Hello, I am ${me.firstName}")
        }
    }.join() // 4
}
      
      



  1. . args.first()



    , BotFather





  2. CoroutineScope



    . , -





  3. . buildBehaviour











:





onContentMessage { // 1
    execute( // 2
      	it.content.createResend(it.chat.id) // 3
    )
}
      
      



? , :





  1. : , , ..





  2. execute



    - . . , ,





  3. createResend , . -





- -. :





onCommand("start") { // 1
  reply(it, ",       ,    !") // 2
}
onCommand("help") {
  reply(it, "   ,      ?")
}
      
      



  1. /start



    , ,





  2. . it







onContentMessage



, :





fun save(sources: List<TextSource>) {
  //     
  println(sources.makeString()) // 3
}

onContentMessage {
  it.content.asTextContent() ?.let { content -> // 1
    save(content.textSources) // 2
  }
  execute(it.content.createResend(it.chat.id))
}
      
      



  1. asTextContent()



    , let



    ,





  2. content.textSources



    TextSource



    , :





    1. ( TextSource



      kotlinx.serialization



      )





    2. , ,





    3. -





  3. makeString



    TextSource



    書式設定に関係なくユーザーに表示されるリストからテキストを作成します





結論

そこで、次のようなボットを作成しました。





  • 簡単なコマンドに応答でき/start



    /help







  • 受信したメッセージを送信者に再送信する方法を知っている





  • テキストメッセージを選択し、そのコンテンツで操作を実行します





さらに、想像力が十分である限り、ボットを開発することだけが残っています。たとえば、PlaguBot eで行ったように、モジュールを関数/プラグインに分割できます






プロジェクトの詳細については、メインページウィキを含むプロジェクトを参照し、電報チャネルをご覧ください








All Articles