前書き
この記事の一部として、フォーマットとメディアを考慮して、ユーザーが送信したメッセージを再送信できる独自のボットを作成します。
ボットのトピックは、多くのブログ、投稿、ブログ投稿、およびその他のコーダーによって穴をあけられてきました。ただし、ほとんどの場合、これらは条件付きの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
,
-
,
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
}
:
onContentMessage { // 1
execute( // 2
it.content.createResend(it.chat.id) // 3
)
}
? , :
: , , ..
execute
- . . , ,
createResend , . -
- -. :
onCommand("start") { // 1
reply(it, ", , !") // 2
}
onCommand("help") {
reply(it, " , ?")
}
/start
, ,
.
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))
}
asTextContent()
,let
,
content.textSources
TextSource
, :
(
TextSource
kotlinx.serialization
)
, ,
-
makeString
TextSource
書式設定に関係なくユーザーに表示されるリストからテキストを作成します
結論
そこで、次のようなボットを作成しました。
簡単なコマンドに応答でき
/start
、/help
受信したメッセージを送信者に再送信する方法を知っている
テキストメッセージを選択し、そのコンテンツで操作を実行します
さらに、想像力が十分である限り、ボットを開発することだけが残っています。たとえば、PlaguBot eで行ったように、モジュールを関数/プラグインに分割できます。
プロジェクトの詳細については、メインページ、ウィキ、例を含むプロジェクトを参照し、電報チャネルをご覧ください。