かなり煩雑なコードになってきたので、クラス化と言う名のリファクタリング。 意地でもPEARや他のライブラリは使わないぞw
■修正内容 VoiceService ver0.2 (1) MixiVoice、Twitterクラス化・ファイル整理
VoiceService | getVoices() | MixiVoice --> HTTPService Twitter --> HTTPService
(2) HTTPサービスクラス「HTTPService」作成 「HTTPRequestService」の命名の方が正しいかも!?
(3) 同時投稿機能追加 とり合えず最低限の実装 ・Twitterは、Basic認証でなくてtokenにするのが今後の課題 ・Mixiは、htmlパースとログイン処理が課題
■VoiceService(抜粋) ファイル分離して非常にわかりやすくなったv(^_^)v
/**
* mixi & Twitterボイス取得
**/
public function getVoices()
{
$mixi_voice = new MixiVoice();
$voices['mixi'] = $mixi_voice->getVoices();
$twitter = new Twitter();
$voices['twitter'] = $twitter->getUserTimeline();
$results = $this->_marge_voices($voices);
dump($results);
return $results;
}
/**
* mixi & Twitterボイス同時投稿
**/
public function postVoice($values)
{
if ($values->message && $values->password == VOICE_PASSWORD) {
$mixi_voice = new MixiVoice();
$is_mixi = $mixi_voice->postMessage($values->message);
$twitter = new Twitter();
$is_twitter = $twitter->postMessage($values->message);
return ($is_mixi && $is_twitter);
}
}
※「$this->_marge_voices($voices)」は、MixiVoiceとTwitterデータをマージしてJSON化してる
■MixiVoice(抜粋) 「HTTPService->request」を実装して、paramsをオブジェクトで渡すようにした。 とりあえず、こんなもんかな?
/**
* mixiボイス取得
**/
public function getVoices()
{
$this->login();
$params->url = MIXI_ECHO_LIST_URL;
$params->method = 'POST';
$html = $this->request($params);
$results = $this->parseVoice($html);
return json_encode($results);
}
■Twitter(抜粋) このクラス名だと、また膨大になりそうな予感だけど。。。 これもパラメータをオブジェクトで渡すようにした。
/**
* Twitter投稿
**/
public function postMessage($message)
{
if (!$message) return;
$posts['status'] = $message;
$params->posts = $posts;
$params->url = TWITTER_UPDATE_JSON_URL;
$params->basic->id = TWITTER_USER_NAME;
$params->basic->password = TWITTER_PASS;
$results = $this->curlRequest($params);
return $results;
}
■HTTPService(抜粋) これが肝のクラス。 なので、頭が整理できてなずサッパリ(T_T)
cokkie処理やBasic認証が両立できなくて、とりあえず「curl」と「file_get_contents」の併用です。
▽各メリット ・curl:細かいことができそうで速い ・file_get_contents:ソースが短くできそう
最終的にはcurlで統一するかな?
/**
* HTTPリクエスト(curl)
**/
public function curlRequest($params)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $params->url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//POST
if ($params->posts) {
$posts = http_build_query($params->posts, '', '&');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
}
//cookies
//TODO
//curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie");
//BASIC認証
if ($params->basic) {
curl_setopt($ch, CURLOPT_USERPWD, "{$params->basic->id}:{$params->basic->password}");
dump($params->basic);
}
$results = curl_exec($ch);
curl_close($ch);
return $results;
}
/**
* HTTPリクエスト(file_get_contents)
**/
public function request($params) {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
if (is_array($params->posts)) {
$content = http_build_query($params->posts, '', '&');
$content_length = strlen($content);
$headers[] = "Content-Length: {$content_length}";
$requests['http']['content'] = $content;
}
//Basic認証
if ($params->basic) {
$basic = base64_encode("{$params->basic->id}:{$params->basic->password}");
$header[] = "Authorization: Basic ".$basic;
}
//cokkie
//TODO paramsかセッションにする?
if ($this->cookie) {
$headers[] = "Cookie: {$this->cookie}";
}
if ($params->method) {
$method = $params->method;
} else {
$method = 'GET';
}
$requests['http']['method'] = $method;
$requests['http']['header'] = implode("\r\n", $headers);
$context = stream_context_create($requests);
$contents = file_get_contents($params->url, false, $context);
//cookie取得・設定
if ($http_response_header) {
$this->setCookieForHttpResponseHeader($http_response_header);
}
return $contents;
}
※「$this->setCookieForHttpResponseHeader」は、HTTPヘッダーをパース