はんこ画像生成botのソースコードを公開します

サークルのslackで動かしているはんこをつくるbotです。

f:id:suzusime:20160803164833p:plain

こんな感じに受け取った文字列をはんこ画像にして返します。

たまにこのブログ上でも登場していたのですが、折角なのでソースを公開しておきます。
gist.github.com

全体は2つのrubyスクリプトで構成されています。
はんこ画像を生成するmakehanko.rbとslackと通信して文字列を受け取ったりはんこ画像を投稿したりするhanyu_hanko.rbです。
つまり、makehanko.rbだけで独立したはんこ画像生成機として使うことができます。

makehanko.rbの使い方

画像に文字をいれるためにrmagickというライブラリ(gem)に依存しています。
これはimagemagickというツールをrubyから扱うためのラッパーのようなものなので、まずimagemagickのインストールが必要です。
私が動かしている環境(debian 8)ではaptitudeでわりとさらっとできた気がしますが、環境によってはこれが結構面倒だったような気がします。

次にrmagickというgemを入れるのですが、私はbundlerという支援ソフトを使っています。
bundlerの使い方は適当に調べて下さい。

最後に、同じ階層にfontsというディレクトリを作って、ここにipaexm_tate.ttfを突っ込んで……と言おうと思ったのですが、このフォント(IPAex明朝を縦書き字形に変更したフォントです)、フォント名からIPAを消していないのでライセンス上公開できないんですよね……
作り方は
旧字フォントをつくった - すずしめにっき
で触れているので、興味のあるかたは作ってみて下さい。
作るのが面倒というかたは、適当なフリーフォントをfonts/hoge.ttfにいれてhoge.ttfを使うようにコードを修正して下さい。
(気が向いたら再配布できるように名称を変えたフォントをアップロードします……)

準備ができたら、

$ bundle exec ruby makehanko.rb 任意の文字列

で使うことができます。

既知のバグとして円記号(バックスラッシュ)が空白になってしまうことがあります。
どうもrmagickのエスケープ文字の絡みなのですが、よくわかりません。

hanyu_hanko.rbの使い方

このスクリプトがやることは、slackの投稿を監視し、正規表現に合う文字列が投稿されると、そこから抽出した文字列を引数としてmakehanko.rbを起動、生成した画像をgyazoにアップロードしてそのURLをslackに投稿、です。
slackのAPIで画像を直接アップロードすることもできるのですが、ユーザー名・アイコンを変更することができなくてbotらしくならないので、外部サービスにアップロードします。
Gyazoスクリーンショットを共有するための便利サービスですが、APIが公開されていて画像を手軽にアップロードできるのでアップローダー代わりに使っています。
ただ本来のスクショ機能も便利なので最近依存しています。
ちなみに私はNota.Incでバイトをしていないので回し者ではないです。

さて、このスクリプトは"slack"と"gyazo"というgemに依存しているのでまずはそれをbundlerで入れます。
また、環境変数でSlackとGyazoのトークンを指定します。名前はソースを見て下さい(外部に公開しないならばソースを編集して直書きしても構いません)。
それと/home/hoge/と書いているあたりを実際にmakehanko.rbを置いているディレクトリにあわせて修正して下さい。

あとは普通に

$ bundle exec ruby hanyu_hanko.rb

で起動するだけです。
なお、もとのhanyu.rbには他にもいろいろ機能があるのですが、はんこ機能だけ抜き出したのでhanyu_hanko.rbという名前になっています。

これを永続的に動かすためには、もちろん常時起動しているコンピュータが必要になります。
私の場合はサークルのサーバーで動かしていますが、自宅のPCが常時起動している場合や、自宅サーバーがある場合はそれで良いでしょう。
無い場合は、さくらあたりで賃貸サーバーなりVPSを借りるなり、いまどき流行りのAmazonなんとかとかへろく(?)とかと契約すればいいのかもしれません(よくわかりません)。
もしくは京大マイコンクラブに入会すればよいでしょう。

サーバーからログアウトしても動かし続けるためには、tmuxを使うのがお手軽です(tmux上で起動→Ctrl+Dで抜けるだけ)。
私も最初の内はそうしていたのですが、このbotは結構な頻度で落ちるので、落ちる度にいちいち起動するのは面倒でした。
今はnode.jsのforeverというツールを使っています。こいつを使うと落ちても勝手に再起動してくれる(?)ので便利です。
foreverはnode.jsのパッケージなので、

  1. nvmを入れる。
  2. nvmでnode.jsを入れる。
  3. npmでforeverを入れる。

という手順になります。
あとは

$ forever start -c bundle exec ruby hanyu_hanko.rb

です。

その他

f:id:suzusime:20160803180144p:plain
脆弱性には注意しましょう*1

これはSlackのbotとして動かしていますが、Twitterbotなんかも似たような感じで簡単に作れます。
ただ、不特定多数の入力を受け付けるようなものを作るのは怖かったのでSlack botしか作っていません。
正解でしたね……

セキュリティには気をつけて、みなさん楽しいBot生活を!

*1:当時はmakehanko.rbを起動するところを普通にshellを経由して呼び出していたので、バッククオートで囲んだ文字列をわたすと実行可能になっていました。所謂「任意のコマンドが実行可能になる脆弱性」ですね。そもそもシェルでバッククオートを使ったらコマンドを実行した結果を代入できるなんて知らなかったのですね。こんな小規模なプログラムでそんな恐ろしいことになるんだと驚いて、セキュリティの意識が高まる一件でした。ほんとセキュアプログラミングは大事です。