プログラミングなんてわからないんですけど〜

元プログラマによるプライベートでのプログラミング日記。1/3のつもりだけどソフト関連はここがメイン

OPEN NSFW APIを作る

マストドンなどの分散SNSに入っていると、サーバによってはポルノ画像がFTLに流れてくることがよくあります。通常、そのような画像はNSFWフラグが立っているので、きちんとしたクライアントではぼかしやすぐには見えないようになっていることが多いのですが、たまにフラグが立っていない画像に出会うことがあります。
自分が作っているsimple html clientでこのような画像を自動検出できないか考えていて、OPEN NSFWを試してみたいと思っていました。ただ、知識が圧倒的に足りないので今まではどうしようもなかったのですが、ググったところ以下のサイトにたどり着きました。

blog.kksg.net

dockerでイメージを提供してくれていて、curlで問い合わせればスコアが返ってくるというものです。まずはこれを導入することにしました。dockerのインストールなどは省きます。このイメージはここにかいてあるとおりに入れると、パラメータで指定した画像をNSFW識別してくれます。

さて、これをVPSなり自宅サーバに入れるなりして動かすのはできますが、できればWeb APIにしたいところです。今回、自宅サーバにインストールしましたので8080ポートは外に見せていません。そこで、nginx経由でhttpsのサイトとしてアクセスできるようにしてみました。
confファイルは以下のようにしてみました。

server {
    listen 443 default ssl;
    server_name nsfw.example.com;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/nsfw.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/nsfw.example.com/privkey.pem;
    location / {
        proxy_pass    http://localhost:8080;
    }
}

これで最低限のアクセスができるようになりましたが、私はsocialapi.appというドメインを持っているので、ここのWeb APIとして動かしてみたいと思います。
nsfw.phpとして以下を用意しました。

<?php header('Content-Type: text/txt; charset=utf-8');?>
<?php
if (isset($_GET['image_url'])) {
    $mode = $_GET['image_url'];
} else {
    $mode="";
}
$jsonUrl = "https://nsfw.pptdn.jp/nsfw_score?image_url=" . $mode;
$json = file_get_contents($jsonUrl, false, $con);
$code = substr($http_response_header[0], 9, 3);
switch ($code){
  case '200':
    echo $json;
    break;
  case '404':
    echo '404 error';
    //エラー処理
    break;
  case '500':
    echo '500 error';
    //エラー処理
    break;
  default:
  break;
}

これをAPIのように仕立てたのが以下のURLです。

https://socialapi.app/api/nsfw?image_url=https://storage.kksg.net/screenshot/20161020130337.png

ひとまずここまででWeb APIになりました。ただ、実際に色々試してみたところ、現在のWebにそぐわない点が出てきています。まず、pythonのバージョンが古いことによってSSL関係の新しい規格に対応ができていません。また、user-agentが書かれていないため、アクセス拒否に合うURLも存在しています。この点を改善したものは、また別の機会に公開したいと思います。

上記のAPIは基本アクセスは自由ですので、色々試してみてください。

では。