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
オプションで変えられる。
とりあえずヘルプメッセージを表示してみる。
helloとbyebyeが公開されている。試しにhelloを実行してみる。引数が足りなかった。
--name=world
を追加してみる。良さそう。
そういう感じ。
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的な例がある。