投書箱サービスを作るまでの色々

もう世の中には山ほどあるので今更なのですが、勉強も兼ねて、投書箱系のサービスを作ってみました。

やぎさんゆうびん

作るに至ったのは色々な経緯があり、このサービスをみんなに使ってほしいという思いはそこまで強くありません(もちろん使ってもらえたら嬉しいですが)。

つらつらと話してみます。

経緯

Twitterで二次創作をやっているとやはり投書箱系のサービスを運用したくなるものです。イラストに感想をもらえるのはものすごく嬉しいからです。

自分も質問箱を運用していたのですが、過去にものすごく炎上してしまい、泣く泣く閉鎖したことがあります。

元々自分の作風が反感を買いやすいというのはあると思うのですが、それはちょっと今回は置いておいて、その炎上の発端は個人同士のトラブルでした。

トラブルとは、自分と、あるフォロワーが揉め事になったことです。自分のツイートがたまたまそのフォロワーを批判していると誤解され、トラブルに発展したのですが、その直後、匿名掲示板に自分のことを批判する書き込みが何件かなされました。

その匿名掲示板は匿名とはいえIPアドレスを表示していて、それらの自分を批判する書き込みはIPアドレスが同じだったので明らかに同一人物によるものだったのでした。しかし、スレッドの中ではそれは指摘されず、同調して自分を批判する書き込みも何件かみられました。その後質問箱が荒らされ始めました。

質問箱にもIPアドレスやIDを表示するような仕組みがあれば、同一人物からの嫌がらせメッセージには気づくことができるかもしれませんでしたが、その時は対処のしようがなく、泣く泣く質問箱を閉鎖しました。その時から、ぼんやりと、荒らされにくい安全な投書箱系サービスは作れないかという構想を練り始めました。

最初の案

自分が最初に考えたのは、メッセージを送信する際にTwitterとの連携を必須にするというものです。

そして、受け取った側がもしメッセージを不快に感じ通報し、管理者がその通報を正当なものだと判断したら、送信者のTwitterアカウントを開示します。こうすることで嫌がらせのメッセージをなくせるのではないかと思いました。

また、受け取り主は設定によって、自分のフォロワーや相互フォロワーしかメッセージを送れないようにすることもできます。こうすることで捨て垢による嫌がらせも止めることができます。

無理があると思った人は多いと思いますが、自分もそう思います。管理者の負担が大きすぎるし、どこまでを通報の対象にするかがあやふやだからです。

自分がメッセージを送る側だとしたら、そのようなサービスには怖くてメッセージを送ることができないでしょう。

また、自分が管理者をやるのも嫌です。質問箱が炎上する以前に、管理者としての自分が炎上してしまいそうな気がします。

投書箱を作る際に、「こういうのはやめてください」というルールを明記してもらうことにし、管理者はそれと照らし合わせて機械的に判断する、というような運用も考えましたが、これも現実的には難しそうです。

完全にボツにすることはなく、何度も考え直したのですが、そんなことをしている間にTwitterAPIが有料化してこの案は使えなくなってしまいました。

実現したとしても炎上と隣り合わせな案なので、少しホッとした気持ちもありました。

第二案

Twitter連携ができなくなったので、別の認証方法を考えました。

まず、メールアドレスによる認証をしないとメッセージが送れないというシステムを考えました。

そもそも違反したら開示するというシステム自体が炎上のきっかけになりそうなので、もう違反したら開示するというシステムは諦め、あくまで個人の識別子としてメールアドレスのハッシュ値か何かを表示する、というのを考えました。

ハッシュ値からメールアドレスを逆算することはできないが、同じメールアドレスで何回も嫌がらせ投稿するとバレる、というような仕組みです。

捨てアドを使えばどうとでもなってしまうのですが、自分が体験した炎上のように、同じIPアドレスで批判の書き込みをするような、あまり警戒心のない人は結構いるようです(もしくは単に面倒なだけか)。

なので、これでも案外抑止力になるのではないかと思いました。

今回作った投書箱サービスでは、当初、これを採用しました。採用しましたが、作り込んでいくほど、手間がかかり、誰かに使ってもらえないと割に合わない。という思いが増してきました。

そして、実際に自分がこういうメールアドレスの認証を要求するサービスがあったとして、いくら安全と謳っていても、これに質問を送るか?と考えた結果、送らねえな……という結論に至りました。

最終案

結局、メールアドレスによる認証はオプションにし、デフォルトでは無効にしました。自分はオフにしています。

最後に個人の識別情報として残したのは、UserAgentとIPアドレスのハッシュ値です。この程度の情報は簡単に変えられてしまいますし、警戒心のない人にしか効果はありませんが、むしろ、メールアドレスで認証するなど物々しくなっていると警戒されて対策されそうなので、このくらいが良いのかもしれません。

ただ、そもそも送られてこない方が良いので、送られてきたけどブロックできるから良し、みたいなのは、あまり筋が良いとは言えないかもしれません。送られてきた時点で困るので。

既存のサービスにもIPアドレスによるブロックができるサービスはあるようですし、ここまで来ると自分で作った意味はあまりなかったのかもしれません。

一応、「自分が作った」ということで、その気になればIPアドレスとか抜けるんやぞ、という抑止力にはなるかもしれません(抜かないですが)。

アーキテクチャ

普通のGo+React で特筆すべき点はありませんが、質問に対する回答を公開する画面だけは、OGPを効かせたいのでSSRしています。

そのために文字が書かれた画像を生成するライブラリまで作りました。

GitHub - shimiwaka/str2img: golang string to image library
golang string to image library. Contribute to shimiwaka/str2img development by creating an account on GitHub.

ただ、なぜか期待通りに動いてくれませんでした。大きい画像で表示されるはずの画像を生成しているのですが、小さく表示されています。後々調整が必要そうです。

おわりに

そんなこんなで、あまり他のサービスとの差別化もできず、開発のモチベーションが続かなかったので、とりあえず最低限動くものを作って、細かい機能はこれから盛り込んでいく予定なのが今です。

おそらく自分しか使わないし、あんまり質問が来る気もしないので、開発スピードは遅くなります。

過去の炎上などやや重い話もありましたが、そういうエピソードがあればいいものを作れるというわけでもないということを身に沁みて感じているのがつらいところですが、一応、勉強にはなったと思います。

それでは。