/** * docomoの対話APIを叩いてレスポンスを貰ってくる * * @param string $apikey docomoAPIキー * @param string $context 会話のコンテキストID(API仕様参照) * @param string $mode 会話のモード(API仕様参照 * @param string $nickname 会話している人間側の名前 * @param string $text 人間側の入力テキスト * @return stdClass レスポンスのJSONをデコードしたオブジェクト * @throws \Exception サーバとの通信に失敗した場合 */ private function getData($apikey, $context, $mode, $nickname, $text) { $userData = ['utt' => (string) $text, 'context' => (string) $context, 'nickname' => (string) $nickname, 'mode' => (string) $mode]; $url = sprintf('https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue?APIKEY=%s', rawurlencode($apikey)); Log::info("docomo対話APIを呼び出します"); Log::info("URL: " . $url); Log::info("パラメータ:"); Log::info($userData); $curl = new Curl(); $curl->setHeader('Content-Type', 'application/json; charset=UTF-8'); $ret = $curl->post($url, json_encode($userData)); if ($curl->error) { Log::error(sprintf("docomo対話APIの呼び出しに失敗しました: %d: %s", $curl->error_code, $curl->error_message)); throw new \Exception('docomo dialogue error: ' . $curl->error_code . ': ' . $curl->error_message); } Log::info("docomoからのデータ:"); Log::info($ret); if (is_object($ret) && isset($ret->utt)) { if ($ret->utt == '') { Log::warning(" docomo 指示文章が空です"); } else { Log::success(" docomo 指示文章: " . $ret->utt); } return $ret; } Log::error("docomoから受け取ったデータが期待した形式ではありません:"); Log::error($ret); throw new \Exception('Received an unexpected data from docomo server'); }
/** * ツイートを投稿する関数 * * @param object $connection 投稿に使用する TwitterOAuth のインスタンス * @param array $param Twitter に送信するパラメータ * @param int $retryLimit 最大再試行回数 * @return bool 投稿に成功すれば true、失敗すれば false */ public static function postTweet(TwitterOAuth $connection, array $param, $retryLimit = 3) { Log::info("Twitter に tweet を POST します:"); Log::info($param); for ($retry = 0; $retry < $retryLimit; ++$retry) { if ($retry > 0) { sleep(1); } $result = $connection->post('statuses/update', $param); if (is_object($result) && isset($result->id_str) && isset($result->text)) { Log::success("Tweet を投稿しました"); Log::success(['id' => $result->id_str, 'text' => $result->text]); return true; } Log::warning("Tweet の投稿に失敗しました"); } Log::error("Tweet を投稿できませんでした"); Log::error($param); return false; }
// bootstrap require_once __DIR__ . '/vendor/autoload.php'; Log::setErrorHandler(); $param = []; // 最終投稿IDを取得 Log::trace("last_idを読み込みます。"); if (@file_exists(__DIR__ . '/runtime/last_id.txt')) { if ($since_id = file_get_contents(__DIR__ . '/runtime/last_id.txt')) { $param['since_id'] = $since_id; Log::info("since_id: {$since_id} を読み込みました。"); } else { Log::warning("last_id.txtからデータが読み込めません。空のパラメータが送信されます。"); } unset($since_id); } else { Log::warning("last_id.txtがありません。空のパラメータが送信されます。"); } // ファイルの行をランダムに抽出 $randomFaces = new RandomSentenceList(__DIR__ . '/tweet_content_data_list/face_list.txt'); Log::trace("face_listは" . count($randomFaces) . "行です"); // Twitterに接続 $config = Config::getInstance(); $connection = new TwitterOAuth($config->getTwitterConsumerKey(), $config->getTwitterConsumerSecret(), $config->getTwitterAccessToken(), $config->getTwitterAccessTokenSecret()); // リプライを取得 Log::info("Twitter に問い合わせます。\nパラメータ:"); Log::info($param); $res = $connection->get('statuses/mentions_timeline', $param); if (!is_array($res)) { Log::error("Twitter から配列以外が返却されました:"); Log::error($res); exit(1);