monogusaを使ってただのpythonの関数をslackやdiscord上のコマンドとして公開できるようになった

今までただの関数をCLIとして利用できたり、ちょっとしたwebAPIとして利用できるようにしていたけれど。 今度はmonogusaを使ってただのpythonの関数をslackやdiscord上のコマンドとして公開できるようになった。

簡単な例

例えば以下の様な関数がある。本当にただの関数。

02hello.py

def hello(*, name: str) -> None:
    print(f"hello {name}")


def byebye() -> None:
    print("byebye")

これを以下の様な形で呼ぶとbotになる。

$ python -m monogusa.chatbot.slackcli 02hello.py

slack上での表示

slackbotの場合にはthreadとして実行結果を返す。インターフェイス自体はほぼほぼCLI上のコマンドのまま。 丁寧な進捗表示やコンソールの同期のようなリッチな機能は存在していない。

デフォルトでは $app で始まる投稿に反応する。これは実行時の --name オプションで変えられる。 とりあえずヘルプメッセージを表示してみる。

f:id:podhmo:20200104204232p:plain

helloとbyebyeが公開されている。試しにhelloを実行してみる。引数が足りなかった。

f:id:podhmo:20200104204246p:plain

--name=world を追加してみる。良さそう。

f:id:podhmo:20200104204300p:plain

そういう感じ。

tokenの設定方法

注意点としてtokenの設定をしないと以下の様なエラーが出る。この辺はもう少し親切にするかもしれない。

$ python -m monogusa.chatbot.slackcli 02hello.py
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/runpy.py", line 193, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "$HOME/vboxshare/venvs/my/monogusa/monogusa/chatbot/slackcli/__main__.py", line 8, in <module>
    def run(
  File "$HOME/vboxshare/venvs/my/lib/python3.8/site-packages/handofcats/__init__.py", line 30, in as_command
    return call(fn, level=level, argv=argv)
  File "$HOME/vboxshare/venvs/my/lib/python3.8/site-packages/handofcats/__init__.py", line 25, in call
    return driver.run(fn, argv)
  File "$HOME/vboxshare/venvs/my/lib/python3.8/site-packages/handofcats/driver.py", line 44, in run
    return fn(**params)
  File "$HOME/vboxshare/venvs/my/monogusa/monogusa/chatbot/slackcli/__main__.py", line 22, in run
    token = token or component.api_token()
  File "$HOME/vboxshare/venvs/my/monogusa/monogusa/chatbot/slackcli/component.py", line 17, in api_token
    return os.environ[envvar]
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/os.py", line 673, in __getitem__
    raise KeyError(key) from None
KeyError: 'SLACKCLI_API_TOKEN'

tokenの設定方法は以下の2つ

  • .envに書く
  • オプションで渡す

.envには以下の様に書く(cwdの.envを見る)。

SLACKCLI_API_TOKEN = xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxXXxXxxxxXxXxXXxxxxxxxx

オプションで渡す場合は--tokenに。

$ python -m monogusa.chatbot.slackcli --token <TOKEN> <FILE>

discord

slackしかこの記事では触れなかったけれど。discord上にも同様の手順で公開できる。

full examples

もう少しまともな利用例は以下を見ると良い。sqliteを使ったmini todo app的な例がある。

f:id:podhmo:20200104204803p:plain