狂ったお茶会のlog

後で起きる自分のためのメモ

twitterBotで、ぐるなびAPIを使ってリプライする

やりたいこと

TwitterBotをつくった - 狂ったお茶会のlog

上記で作ったtwitterBotに、おすすめのご飯を教えてくれる機能をつけたい。

やったこ

ぐるなびAPIを取得

ぐるなび Web Service - トップページ

ここでアカウントが作れます。 api仕様とかも見れる。

書いた処理

  • 「ごはん」とリプライすると、渋谷マークシティ近辺の飲食店をぐるなびで探して持ってくる
  • 「ごはん hogehoge」とリプライすると、渋谷マークシティ近辺の飲食店をぐるなびでhogehogeで検索して持ってくる
  • 複数指定したい場合は「ごはん hogehoge、fugafuga」みたいに「、」で区切って指定
<?php
/**
*  ごはん@ぐるなび
*/
function replyGohan($TwitterOAuth, $value, $gohanAccesskey, $gohanText)
{
    // エンドポイントとパラメータ設定
    $endpoint = 'http://api.gnavi.co.jp/RestSearchAPI/20150630/';
    $hitNum = 50;
    $gohanParams = [
        'keyid' => $gohanAccesskey,
        'format' => 'json',
        'latitude' => '35.657988',  //渋谷マークシティの緯度&経度 エリアコードの方がいいかもしらんが
        'longitude' => '139.698056',
        'range' => '5',             // 緯度/経度からの検索範囲(半径) 5:3000m
        'hit_per_page' => $hitNum,  // 取得件数 どうも50が上限
        'freeword' => $gohanText,   //フリーワード検索「,」区切りで複数ワードが検索可能(10個まで)
    ];
    $gohanUrl = $endpoint.'?'.http_build_query($gohanParams, '', '&');

    // API実行
    $gohanJson = file_get_contents($gohanUrl);

    // 取得した結果をオブジェクト化
    $gonahObj  = json_decode($gohanJson);

    // エラーハンドリング
    if(empty($gonahObj->rest)) //失敗するとrestキーが存在しない
    {
        $errorCode = $gonahObj->error->code;
        $errorMessage = $gonahObj->error->message;
        if(!empty($errorMessage))
        {
            $errorMessage = "".$errorMessage."」とのこと";
        }
        error_log(print_r($gonahObj, true));

        $resMessage = '@'.$value->user->screen_name.' '."すません…".$errorCode."エラーです…\n".$errorMessage;
        $response = $TwitterOAuth->post('statuses/update', array('status' => $resMessage, 'in_reply_to_status_id'=>$value->id_str));

        // エラー出力
        if($TwitterOAuth->getLastHttpCode() != 200)
        {
            error_log(print_r($response, true));
        }

        return;
    }

    // 0件の時
    $gohanNum = $gonahObj->total_hit_count;
    if($gohanNum == 0)
    {
        $resMessage = '@'.$value->user->screen_name.' '.'0件です(´・ω・`)';
        $response = $TwitterOAuth->post('statuses/update', array('status' => $resMessage, 'in_reply_to_status_id'=>$value->id_str));
        return;
    }

    // 成功してたら1件だけ取得
    $i = 0;
    $rand = rand(0, $hitNum-1);
    foreach($gonahObj->rest as $restArray)
    {
        $gohanName = $restArray->name;
        $gohanUrl = $restArray->url;

        if($i >= $rand)
        {
            break;
        }
        $i++;
    }

    if(!empty($gohanText))
    {
        $gohanText = "".preg_replace("/,/", "", $gohanText)."」は";
    }

    $credit = 'Supported by ぐるなびWebService(http://api.gnavi.co.jp/api/scope/)';
    $gohanStr = $gohanText.$gohanNum."件あった、オススメはこれかな\n".$gohanName."\n".$gohanUrl."\n\n".$credit;
    $resMessage = '@'.$value->user->screen_name.' '.$gohanStr;
    $response = $TwitterOAuth->post('statuses/update', array('status' => $resMessage, 'in_reply_to_status_id'=>$value->id_str));

    // エラー出力
    if($TwitterOAuth->getLastHttpCode() != 200)
    {
        error_log(print_r($response, true));
    }
}
?>

シンタックスハイライトしてもらおうと思って<?php ?>で囲んだけどなんか色がすごい)

使うとこういう感じ

f:id:dormouse666:20171018194238p:plain

Github

github.com



解決できなかったこ

フリーワード検索自体の精度がどうも今一つであり、「カレー」で検索しても鳥貴族とかを持ってきちゃったりすることが結構多い。
業態マスタ取得API とかも使わないとダメかな。。。



参考URL