炎上botを作ったら火傷した

初めまして、VOYAGE MARKETINGに所属している@pro_shunsukeです。

さて、私は先日社内LT大会で「炎上ジェネレーター」について発表しました。

what is 炎上ジェネレーター

f:id:pro_shunsuke:20150529095510p:plain

https://enjo-generator-black.herokuapp.com/

簡単に炎上出来る!スゴい!

使い方はとてもシンプル。セリフに文字を入力するだけです。一瞬で出来上がります。出来上がった画像はTwitterに投稿出来たり、画像をダウンロード出来たりします。

発表当時のSlackはこんな感じでした。

f:id:pro_shunsuke:20150529100715p:plain

面白い!!!

こんな意見も

f:id:pro_shunsuke:20150529100728p:plain

と言うわけで、この炎上ジェネレーターをAPI化してSlack上から簡単に炎上出来るようにしました!

こんな感じです

f:id:pro_shunsuke:20150529100753p:plain

やったこと

炎上ジェネレーターはクライアントサイドでCanvasを利用して画像処理を行っています。API化を行うに当たって、サーバーサイドでも画像処理をする必要がありました。

サーバーサイドはNode.jsで動かしているので、今回はnode-canvasというグラフィカルライブラリを使用しました。node-canvasはCanvasと同じようなコードで書けるので、とても使いやすかったです!(ロジック部分などはコードを共通化できるのでは?とも思いました)

公開後

Slack上でこのようなことを言われました。

f:id:pro_shunsuke:20150529100847p:plain

実はAPIを叩くと、生成された画像がTwitter上で勝手に呟かれるという、下手したらリアル炎上しかねない仕様になっていたのです。

そして・・・

f:id:pro_shunsuke:20150529100903p:plain

と、いうことで、リアル炎上する可能性を考慮しリリースからわずか1時間で閉鎖されました・・・;;

反省点

皆様に早めに気づかせていただいたため炎上は免れましたが、私自身少々火傷を負ってしまいました・・・。今回の事から以下のような教訓が得られました。

使われる状況を考える

API化を行う以前は、自分と身内の数人が使う程度の規模のサービスでした。API化を行い公開することによって、今までとは異なるユーザが一気に増えました。それによって今まで想定していた事以外の問題点が出てくるようになりました。

今開発しているサービスが今後どのように成長して、どのような層に使われるのかを意識することは、今回のような小さなサービスに限らないことだと思います。実際に業務においても、本質は何かを考えることはとても重要であると感じました。

仕様を考える

Slack上で使われる時にはHubotを通してAPIを叩いていました。その時には

{吹き出し1}{カンマ}{吹き出し2}{半角スペース}{ババーン}

という形式で書き込みを行っていました。この形式だと、たまたまこのような順番で書き込みを行った時に、それがTwitter上に呟かれてしまうという心配がありました。

さらに、迂闊にHubotが反応してしまうようなインターフェースは避けるべきでした。例えば、書き込みの先頭に迂闊には書かないような文字列を指定するといったインターフェースにする必要がありました。サービスは、使いやすさはとても大事ですが、だからといってセキュリティを無視することは出来ないし、それを考慮した仕様にすべきだと感じました。

現在では、Twitterに直接投稿せずに画像だけを返すAPIにしています。さらにHubotからは

{jewelpet}{半角スペース}{炎上}{半角スペース}{吹き出し1}{半角スペース}{吹き出し2}

という形で呼び出すようにしており、迂闊にAPIが呼ばれる心配のないようなインターフェースになりました。

炎上API

現在は以下のようなAPIになっています!

パラメータを指定すれば、画像がバイナリデータで返ってきます。

Base URL

https://enjo-generator-black.herokuapp.com

Request

GET api/create-enjo

Parameters

パラメータ 説明
text1 吹き出し1のセリフ
text2 吹き出し2のセリフ

Response

画像データ(binary, image/png)

APIが実装出来たところで、僕が属している会社の Slack チームで動いているbotにこのAPIを実行してもらいました。ちなみに今回使用されているbotについては次の記事が参考になると思います。

Slack で役に立たない Bot を運用するときの知見とか - ミントフレーバー緑茶

f:id:pro_shunsuke:20150529101517p:plain

これから

Twitterに投稿されてもよい(むしろ外部に公開していきたい)時に呟かれる用のAPIを作っても良いなーとは思いました!

それでは皆さんも良い炎上ライフを!

https://enjo-generator-black.herokuapp.com/api/create-enjo?text1=%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%8F%E3%82%8C%E3%81%A6%20%20%20%20%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86&text2=%E3%81%95%E3%81%99%E3%81%8C%E3%81%AB%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E7%82%8E%E4%B8%8A%E3%81%AA%E3%82%93%E3%81%8B%E3%81%97%E3%81%AA%E3%81%84%E3%82%88