ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

「アザラシの赤ちゃんの最新情報を取得するAPI」を作ってみたお話

time 2018/08/11

私は自他共に認めるアザラシ好きでありながら、未だに「アザラシの赤ちゃんを生で見たことがない」という致命的な欠点があります。
加えて、アザラシの赤ちゃんのモッフモフな白い毛は生後2週間ほどで抜け落ちてしまうため、タイムリーな情報が必要になるわけです。

そこでインターネット上から「アザラシの赤ちゃんの情報を取得する」方法を考えてみました。もちろん直近1ヵ月以内くらいのホットな情報のみを対象とします。

試してみた方法

「TwitterOAuth」によるツイートの検索

まず思いついたのは、以前「ランパ台詞bot」作成時に使用した「TwitterOAuth」を使用し、Twitterの最新ツイートからアザラシの情報を取得する方法です。
https://twitteroauth.com/

しかし実際に試してみると、水族館と全然関係のないユーザーやbotのツイートを拾いまくってしまいます。取得後に検索結果を絞り込むことはできますが、不純物込みの結果から水族館関連で絞り込むとほとんど残りません。
更に検索しすぎるとAPIのリクエスト制限に引っ掛かることもあり、残念ながら実用に耐えうるとは言い難いでしょう。
一応、一般人の「○○水族館にアザラシの赤ちゃん!」的なツイートは取れる可能性はあるので残してはおこうと思います。

「Google Custom Search API」の利用

Twitterがダメなら通常の検索エンジンを使用して取ってくるしかありません。
Google検索のAPIとして「Google Custom Search API」があるようですが、無料版では1日あたり100リクエストしか受け付けない制限があり、情報収集に使うには厳しいとの意見が多いようです。
ただしアザラシの赤ちゃんの情報を1日に何度も取得する必要はなく、ピンポイントな検索ならやれそうなので試してみました。

以下のようなAPIを実行する用のサービスクラスを作成します。ここではPHPのcURLを使用しました。

<?php

class AzarashiAPIService
{
    const GOOGLE_SEARCH_API_URL = "https://www.googleapis.com/customsearch/v1?key=%key%&cx=%engine_id%&q=%word%&dateRestrict=%date%";
    const API_KEY = "APIKey";
    const SEARCH_ENGINE_KEY = "EngineKey";

    public function getAzarashiInfo($search_word)
    {
        $result = $this->getGoogleSearchAPIResult($search_word);

        return $result;
    }

    protected function getGoogleSearchAPIResult($search_word)
    {
        $url = self::GOOGLE_SEARCH_API_URL;
        $url = str_replace('%key%', self::API_KEY, $url);
        $url = str_replace('%engine_id%', self::SEARCH_ENGINE_KEY, $url);
        $url = str_replace('%word%', $search_word, $url);
        $url = str_replace('%date%', 'm1', $url);

        $ch = curl_init($url);

        $curl_options = [
            CURLOPT_HEADER => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_CONNECTTIMEOUT => self::TIMEOUT,
        ];

        curl_setopt_array($ch, $curl_options);
        $result = curl_exec($ch);

        curl_close($ch);

        return $result;
    }
}

流石GoogleのAPIだけあってドキュメントもレスポンスも良質です。必要なものは粗方取得できるので整形して返せば使えそうです。
リクエスト制限は1日1回のみ取得し保持しておくようにしてカバーしようと思います。

簡単な認証の仕組みを入れる

どんなリクエストでも受け入れていたらサーバがパンクしてしまうので、特定の通信のみAPIを実行するようにします。
「ログイン認証」なんて大袈裟な仕組みはいらないので、特定のパラメータと文字列がpostされているかで判定します。
合わせて先ほどのAzarashiAPIServiceを呼び出すコードも実装します。

<?php

require_once './src/AzarashiAPIService.php';

$AUTH_KEY = 'key';

$auth_key = $_POST['auth_key'];

if ($auth_key != $AUTH_KEY) {
  exit;
}

$APIService = new AzarashiAPIService();
$result = $APIService->getAzarashiInfo('アザラシ赤ちゃん');

header('Content-Type: application/json');
echo $result;

そんなわけで、今回作ったAPIは基本的に非公開とする予定です。そこまで性能の良いVPSを借りているわけでもないので…。
気になる方は自分で作って試してみてください。

これでアザラシの情報をJSONで返すことはできるようになりましたが、このままではGoogle検索するのと何も変わらないわけで、利用価値はありません。
理想ではスマホから見れるようにしたいので、今後はそのあたりも考えてみようと思います。

down

コメントする