/** * 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; }
$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); } if (empty($res)) { Log::success("新着はありません"); exit(0); } Log::success("Twitter からメンション一覧を取得しました。新着は " . count($res) . " 件です。"); // 最終投稿IDを書き込む file_put_contents(__DIR__ . '/runtime/last_id.txt', $res[0]->id_str); Log::trace("最終投稿IDを保存しました: " . $res[0]->id_str); $success_count = 0; $failure_count = 0; $chat_context_manager = new ChatContextManager(); foreach ($res as $re) { $param = []; Log::info("届いたメッセージ:"); Log::info(sprintf(" [@%s] %s - %s\n", $re->user->screen_name, $re->user->name, $re->text)); // もし自分自身宛てだったら無視する.(無限ループになっちゃうから) if (strtolower($re->user->screen_name) === strtolower($config->getTwitterScreenName())) { Log::info("投稿ユーザが自分なので無視します"); continue; }