Pythonむずい
勉強が足りない
AAは面白いが崩れる
AAって面白いですよね。
でも2chの専ブラとかでないと本来の見た目でなかったり、そもそも崩壊していたり・・・。
ブーム君のAA
Slackでもそれは例外でないです。
この間某Slackで「いよいよ明日は~」というコピペをもじった告知がありました。
↑こういうやつです。
画像の通り、返信には「今日と明日だよ・・・」と返すのがそれっぽいと思うんですが・・・(押しつけ)
これをそのままSlackに張り付けると
こんなふうにちょっとずれます。
これはこのままでも見れないこともないですけど、大きなAAになるとめちゃめちゃになります。
特にスマホとかだと確定でめちゃめちゃになります。
めちゃめちゃになったAAの例
AAは モナーフォント で見せるようになっている(?)ので普通のフォントでは崩れるのは当然なのですが・・・
崩れてしまうと何がなんだか分からずに白けてしまうので何とかしたい・・・
しかし全員にこのフォントにするように言うのはなんか違いますよね。
文字列がダメなら画像にしちゃう
画像にAAを張り付けてUpすれば全員が同じ崩れていないAAを見ることができます。
でも普通の人はそんな手間なことしませんし、そんなことしてたら会話の流れが過ぎ去っていきます。オタクの会話はスピードがはやいですから。
ここはSlackBot AAGenBot とでも名付けて、コイツにAAを画像化するのをやってもらいましょう。
AAGenBotのイメージ1
こうすればAAをコピペするだけでAAがずれることなくみんな見れます (実際はテキストが張り付けられるのでタイムラインがガーッと流れたりしますが・・・)
他にも特定の発言に対してそれっぽいAAを張り付ける機能も欲しいです。
AAGenBotのイメージ2
こうすればいちいちAAをコピペせずともBotが勝手にAAを貼ってくれます(邪魔だという意見もありそうです)
つくってワクワク
使った言語はPythonとBashシェルスクリプトです。
SlackAPIを使ってメッセージの送受信と画像の生成をするのがPythonのお仕事で、それっぽいAAの画像を探したり、AA用のテキストファイルを用意したりするのをBashシェルスクリプトでやります。
Pythonはやったことなかったのでワクワクしてます
だいたいの流れはこうです
SlackAPIの利用にはpython-slackclient
を使いました
github.com
Slackのサイトからテキトーにクリックしたら見つかったのでこれにしました(頭わるい感)
Pythonで画像を生成するにはPillow
を使いました
https://pillow.readthedocs.io/en/4.1.x/pillow.readthedocs.io
なんかPIL
とか呼ばれてたやつ?っていうかそれのforkらしい?(詳しく調べてない)
つくります
できました
github.com
色々説明は面倒なのでこれをみてね
py/SlackMessageGetter.py
でメッセージを受信(送信もするけどね)して機能分け
py/aagen.py
でAAを生成
sh/search.sh
とsh/aaImageSearcher.sh
で発言に合いそうな画像をさがします。二つに分けたのはsh/search.sh
の方をパイプに挟みたかったからです。
このsh/search.sh
が形態素解析とか結構謎深い検索方法をしているので興味があれば見てみてください。
sh/FileUploader.sh
でcurl
使って画像をアップロードします。なぜか前述のpython-slackclient
ではうpできませんでした・・・
またsh/FileUploader.sh
ではある程度Botの画像うpを自重するようにしてます。
- 30秒以内に画像をうpしてたら自重
- 候補の画像を30分以内にうpしてたら自重
これで自重できてるのかは・・・わからん・・・な
インストールのしかた
必要なものをapt-get
とかpip3
します。python3がなければそれもいれてね
# mecab ファイルサーチにつかっちゃったw sudo apt-get install mecab # もとPIL sudo pip3 install Pillow # Slackのライブラリ sudo pip3 slackclient
- メモ:普段あんまり使わなさそうなコマンドとか
jpegtopnm
pnmquant
ppmtosixel
- これらは生成した画像をターミナルに表示するのに使っています。Sixelに対応しているターミナルでないとダメなのでいらない場合は
sh/aaTextRedirector.sh
の25行目をコメントアウトしてOKです
普通にgit clone
します
git clone https://github.com/xztaityozx/AAGenBot
cd AAGenBot
AAGenBotはシェル変数からTokenやユーザ名、フォントへのパスを読み取るのでexport
します
export SLACK_API_TOKEN="xxxx-xxxxxxxxxxxxxxxxxxxxxxxx" #APIトークン export AAGENBOT_NAME="<@Uxxxxxxxxxx>" #Uから始まるBotのID?名前?みたいなやつ、<@ >で囲むこと export AAGENBOT_MASTER_NAME="Uyyyyyyyyyy" #Uから始まる自分の名前?ID?。Botを管理する人の名前?ID? export monafontPath="/home/user/.fonts/ipagp-mona.ttf" #AA作るときに使うフォント 絶対パスで書かないと見つからない?
~/.bashrc
とかに書いておくと楽ちんです
シェルスクリプトに実行権限がなかったらchmod
しておきます。
chmod +x sh/*
これだけだよー(^o^)/
起動方法
AAGenBot
ディレクトリ以下で
sh/Starter.sh
とするだけだよー(^o^)/
つかいかた
使いたいチャンネルにAAGenBotを参加させます。
生成
AAGenBotに対して生成してほしいAAの名前とAA本体を発言します
フォーマットは
@aagenbot [AAの名前] [AA本体]
とします
こんなふうに結果がうpされます
ちなみにAAの名前はそのままファイル名に使われるので*
や/
が入ると癇癪というかエラーを起こします。
呼び出し
AAGenBotに対して呼び出したい画像の名前をcall
キーワードの後に付けて言うとうpしてくれます
こんな感じですね。
名前が間違ってるとうんともすんとも言いません(不親切)
発言に反応
これはAAGenBotに特に何か言うということはないです。
ユーザー同士の会話の中を勝手に読み取って適度にAAを張り付けます。
こういった感じですね
こんなふうに複雑な文章でもそれっぽいのを見つけてきます。
これはなんかアルゴリズムを使ったとかじゃないです。シェル芸を使ってます。(sh/search.sh
を見ればわかると思います。)
前述のとおり 自重システム がが備わっているので会話の流れが汚染されることは無いと思います()
終了
AAGenBotのMASTER(Botを管理するやつ)限定でSlackからAAGenBotを終了できます。
デバッグ用だったんですけど残しました。
こうです。煽ってるわけではないです
まとめ
Pythonはじめてでしたけどなかなか楽しかったです。またなんか作りたいですね・・・
最初は全部Pythonでやるつもりだったんですが
シェルスクリプトのが楽やわ!w
ってなったところはシェルスクリプトにしました。その結果Pythonとシェルスクリプトが交互する意味の解らない構造になりましたがまあいいでしょう
まだ某Slack内で使ってないのでどれほど実用に堪えるのかわからないのですが、書く記事もちょうどなかったので書きました。
まだ生成失敗したときとか呼び出し失敗とか、エラーをユーザー達に伝えるような部分できてないのでその辺をもうちょっとだけメンテしてから某Slack内で公開したいです。どきどきする・・・
ちなみにこのAAGenBot副作用があります。
ALLFilesのところがめちゃめちゃになる
それでは良い AAライフ を!
参考
- ssh接続先で作った図をターミナル上に表示 - blog
- Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方 - Librabuch
- slackのbotを作る 入門編 - shuto_log.aep
- Slack API | Slack
既知のバグ
- 画像をUpしたあともう一度
sh/FileUploader.sh
が呼ばれる。1行目からエラーが出て終わる - 下の方がはみ出る。謎