/** * 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'); }
/** * 現在の天気の情報を問い合わせる * * @return \bot\weather\yahoocom\Response * @throws \Exception 問い合わせに失敗した場合 */ public function query() { $queryUri = self::buildQueryUrl(['q' => $this->buildYql($this->city), 'format' => 'json', 'env' => 'store://datatables.org/alltableswithkeys']); Log::info(__METHOD__ . ': Query URL: ' . $queryUri); $curl = new Curl(); $curl->get($queryUri); if ($curl->error) { $msg = 'YQL Query Error: ' . $curl->error_code . ': ' . $curl->error_message; Log::error(__METHOD__ . ': ' . $msg); Log::error($curl->raw_response); throw new \Exception($msg); } return new Response($curl->raw_response); }
/** * ツイートを投稿する関数 * * @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; }
} 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); } 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 = [];