#### teratailのAPIで過去の質問・回答を #### 取得するシステムを作る
motuo : 2017-12-13
#### 自己紹介
 + 名前 : motuo(もつお) + メインのお仕事 : 物流系企業の社内SE + 良く使う言語 : - PHP - VBA - RPG(ゲームじゃないですよ!)
今年のトピックといえば…
埼玉西武ライオンズがパリーグ2位で シーズンを終えましたね!
(**今年はCS・日本シリーズはありませんでした**)
では無くて
###### このテーマを取り上げてみたいと思います。 teratail の過去遺産をもっと活用したい 
確かに… + 検索機能はあっても思った通りに結果が得られない事があったり… + 自分自身の回答を検索する機能が無かったり… 
ないなら作れば良いじゃない!
というわけで
APIドキュメント
を参考に Laravel5.5で作ってみました。
画面イメージはこんな感じ 
検索結果 
使ったAPIは以下の2つです。 + 特定のユーザーの質問を取得する (https://teratail.com/api/v1/users/display_name/questions) + 特定のユーザーの回答を取得する(https://teratail.com/api/v1/users/display_name/replies)
記事を一度に取得できる件数は100件が限度の為、 ページネーションしながら 指定されたユーザーの質問または、 回答の全記事を取得しています。
ソースコード(抜粋) 検索ロジック ```PHP /*** * APIを使って自分が回答した内容を検索する */ private function getMyArticles(Array $requestParam){ if($requestParam['answerOrQuestion']=='isAnswer'){ $url = 'https://teratail.com/api/v1/users/'. $requestParam['userID'] .'/replies?limit=100'; $category = 'replies'; }else{ $url = 'https://teratail.com/api/v1/users/'. $requestParam['userID'] .'/questions?limit=100'; $category = 'questions'; } $resultArray = teratailAPI::callAPI($requestParam,$url); $meta = $resultArray['meta']; //リクエストに失敗したら処理終了 if($meta['message'] != 'success'){ dd($meta['message']); } $searchArray = explode (' ',$requestParam['searchWord']); $returnQuestions = utils::searchWord($resultArray[$category], $searchArray); //質問もしくはを100件以上していたらページネーションして全記事を取得 if($meta['hit_num'] > 100){ $page = ceil($meta['hit_num'] / 100); for($i=2;$i<$page+1;$i++){ $resultArrayAdds = teratailAPI::callAPI($requestParam,$url,$i);//2ページ目以降 $returnQuestionsAdded = utils::searchWord($resultArrayAdds[$category], $searchArray); $returnQuestions = array_merge($returnQuestions, $returnQuestionsAdded); } } return $returnQuestions; } } ```
ソースコード(抜粋) API取得ロジック ```PHP /** * 実際にAPIを実行する処理。取得結果を配列にデコードして返却 * @param array $requestParam ユーザID,アクセストークンを利用 * @param string $url * @param int $page * @return type */ public function callAPI(Array $requestParam, string $url,int $page=0) { $access_token = $requestParam['accesstoken']; if($page){ $url .= '&page='.$page; } $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$access_token)); $result = curl_exec($curl); curl_close($curl); return json_decode($result,true); } ```
### 使ってみた感想 APIの利用はとっても簡単に出来ます。 Webシステムへの組み込みも簡単にできました。
### 強いて要望を言うなら…
・ 回答のAPIには質問のタイトルがほしい!
・ ~~teratailの検索機能をもう少し改善して貰えると…~~
### このサイトは現在、Bluemix上で稼働中です。 良かったら使ってみてください。 https://teratailapisearch.eu-de.mybluemix.net/
ありがとうございました。 良いお年を!