すずしめにっきスマートフォン用の表示で見るすずしめにっき2016-08-03はんこ画像生成botのソースコードを公開します技術サークルのslackで動かしているはんこをつくるbotです。こんな感じに受け取った文字列をはんこ画像にして返します。このブログ上でも登場していたのですが、折角なのでソースを公開しておきます。gist.github.com全体は2つのrubyのスクリプトで構成されています。はんこ画像を生成するmakehanko.rbとslackと通信して文字列を受け取ったりはんこ画像を投稿したりするhanyu_hanko.rbです。makehanko.rbだけで独立したはんこ画像生成機として使うことができます。画像に文字をいれるためにrmagickというライブラリ(gem)に依存しています。これはimagemagickというツールをrubyから扱うためのラッパーのようなものなので、まずimagemagickのインストールが必要です。8)ではaptitudeでわりとさらっとできた気がしますが、環境によってはこれが結構面倒だったような気がします。次にrmagickというgemを入れるのですが、私はbundlerという支援ソフトを使っています。bundlerの使い方は適当に調べて下さい。すずしめにっきで触れているので、興味のあるかたは作ってみて下さい。作るのが面倒というかたは、適当なフリーフォントをfonts/hoge.ttfにいれてhoge.ttfを使うようにコードを修正して下さい。任意の文字列で使うことができます。既知のバグとして円記号(バックスラッシュ)が空白になってしまうことがあります。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を置いているディレクトリにあわせて修正して下さい。hanyu_hanko.rbで起動するだけです。もとのhanyu.rbには他にもいろいろ機能があるのですが、はんこ機能だけ抜き出したのでhanyu_hanko.rbという名前になっています。これを永続的に動かすためには、もちろん常時起動しているコンピュータが必要になります。私の場合はサークルのサーバーで動かしていますが、自宅のPCが常時起動している場合や、自宅サーバーがある場合はそれで良いでしょう。無い場合は、さくらあたりで賃貸サーバーなりVPSを借りるなり、いまどき流行りのAmazonなんとかとかへろく(?)とかと契約すればいいのかもしれません(よくわかりません)。京大マイコンクラブに入会すればよいでしょう。サーバーからログアウトしても動かし続けるためには、tmuxを使うのがお手軽です(tmux上で起動→Ctrl+Dで抜けるだけ)。私も最初の内はそうしていたのですが、このbotは結構な頻度で落ちるので、落ちる度にいちいち起動するのは面倒でした。今はnode.jsのforeverというツールを使っています。こいつを使うと落ちても勝手に再起動してくれる(?)ので便利です。foreverはnode.jsのパッケージなので、nvmを入れる。nvmでnode.jsを入れる。npmでforeverを入れる。hanyu_hanko.rbです。脆弱性には注意しましょう*1。これはSlackのbotとして動かしていますが、Twitterのbotなんかも似たような感じで簡単に作れます。botしか作っていません。正解でしたね......セキュリティには気をつけて、みなさん楽しいBot生活を!参考qiita.comblog.kzfmix.com*1:当時はmakehanko.rbを起動するところを普通にshellを経由して呼び出していたので、バッククオートで囲んだ文字列をわたすと実行可能になっていました。所謂「任意のコマンドが実行可能になる脆弱性」ですね。そもそもシェルでバッククオートを使ったらコマンドを実行した結果を代入できるなんて知らなかったのですね。こんな小規模なプログラムでそんな恐ろしいことになるんだと驚いて、セキュリティの意識が高まる一件でした。ほんとセキュアプログラミングは大事です。