2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

Python用traQ bot作製ライブラリを公開しました

@で やみやみ

by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

自己紹介

  • 名前:d_etteiu8383 (でっていうやみやみ)
  • 生命理工学院生命理工学系 3 年
  • グラフィック班 モデリング部
  • ゲーム班

アイコン画像

by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

きっかけ

  1. 文章生成したい期になってた
    (OpenAIのAPIrinna/japanese-gpt-1bを利用した何かしらを作りたかった)
  2. こういうのは大体Pythonにライブラリが揃ってる
  3. Pythonでbot作るか~
  4. @BOT_mirAI誕生
  5. botブーム到来
  6. ライブラリ化するか
  7. した

by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

できたもの

  • https://github.com/detteiu8383/python-traq-bot
  • (現状)traQ->BOTサーバーへのイベントの受け取り部分を補助
  • BOTサーバー->traQへのリクエストを行うためのAPIクライアントは含んでいない(課題)
  • 以上のスクリプトで指定チャンネルにメッセージが投稿されたときにその情報を表示するbotサーバーが動く。
from traq_bot import TraqBot
import os


bot = TraqBot(os.environ.get("BOT_VERIFICATION_TOKEN"))

@bot.message_created
def print_message_data(data: dict):
    print(data)


if __name__ == '__main__':
    bot.run(8080)
by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

BOTインスタンスの作成と起動

BOTの中身はほぼナメクジウオにもわかるPythonでのtraQbot作成に書かれている通り

botを動かすだけなら3行で済む

from traq_bot import TraqBot


bot = TraqBot(os.environ.get("BOT_VERIFICATION_TOKEN"))
bot.run(8080)
by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

イベントハンドラの登録

デコレータを使って各イベント発生時に実行する関数を簡単に設定できるようにした

@bot.message_created
def hoge():
    print("hoge")

上のようなコードを書けば、メッセージが投稿されたときにhoge()が実行される

※デコレータ

「関数を返す関数」で関数定義を"修飾(decorate)"する感じのアレ
hoge = bot.message_created(hoge)のシンタックスシュガー

by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

パクリ元

Bolt for Python(Slack bot library)

import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler

app = App(token=os.environ.get("SLACK_BOT_TOKEN"))

@app.message("hello")
def message_hello(message, say):
    say(f"Hey there <@{message['user']}>!")

if __name__ == "__main__":
    SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()

既存のBOTライブラリをリスペクトしてます

discord.py

import discord

client = discord.Client()

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

client.run('your token here')
by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

開発段階でのあれこれ

@BOT_mirAIの開発を通してtraQのbotの仕組みを最低限知ることができたのでライブラリ化はそんなに大変ではなかった

by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

PyPIへの公開

予想以上に簡単にできた(アカウント作ってちょっと設定書くだけ)

pipで使えるようになると感動する

pip install traq-bot
by @で やみやみ
2021年度 traP第12回メンバー集会 らん☆ぷろ #traPmtg

使ってみてね

pip install traq-bot

プルリク待ってます https://github.com/detteiu8383/python-traq-bot

by @で やみやみ