2つのif 構文が1つしか動作してくれない
唐突に質問失礼致します。PHP修行中の者です。
自分のTwitterのタイムラインをFC2ブログに投稿するスクリプトを書きたいと思い、ここ数ヶ月、PHPの本を片手に、200以上のPHPサイトのブラウザタブ開きながら試行錯誤しているのですが暗礁に乗り上げてしまって困っています。
恐縮ながら、どうか御教授いただけたら幸いに存じ上げます。
ブログに投稿することまではできるのですが、今できなくて困っていることは、
1、2つ設置しているif 構文が1つしか動いてくれないので2つ動かしたい。
2、1日分(昨日分=24時間前)の最新(更新分)のテキスト(ツイート)のみ抽出して1日毎に投稿するようにしたい。
3、テキスト(ツイート)の時間のならびを昇順(古い順)にしたい。
の3つです。
改善法をご存じの方がいらっしゃいましたら1~3のいずれか1つだけでもいいので御教授いただけたら幸いに存じ上げます。
今は下記のように書いています。↓
/////////////////////////////////
$url = "http://api.twitter.com/1/statuses/user_timeline.json?&include_rts=true&count=30&screen_name=(ユーザー名)&page=".$_POST['page'];
$tweets = json_decode(file_get_contents($url));
$str = '';
$pat1='/^RT/';
$pat2='/@/';
$m1 = preg_match($pat1, $str);
foreach ($tweets as $val) {
if ($pat1 && $pat2){
echo
$str .= $val->retweeted_status->text;
}
if (!$pat1){
echo
$str .= $val->text;
}
$str .='<br />'
.date('Y-m-d H:i:s', strtotime($val->created_at) + 9*3600)
.'<br /><br />'."\n";
}
var_dump($tweets);
try{
$bm->postEntry("ユーザー名".date("Y年m月d日", $timestamp .= strtotime("-1 day"))."のつぶやきまとめ",
" [". $str ."]");
/////////////////////////////////
これで実行すると、
1、if 構文に関しては、最初の「if ($pat1 && $pat2){echo $str .= $val->retweeted_status->text;」は読み込んでくれますが、次のif構文の「if (!$pat1){echo $str .= $val->text;」は読み込まれずに、「空白」が出力されてしまいます。
やりたいことは文頭がRTで始まる場合は$val->retweeted_status->textで、それ以外は$val->textにしたいのです。
(全てval->textに指定すれば空白なく全て表示できるのですが、RTが文頭につくval->textのものは文末が省略されてしまっているので、全文が書かれているretweeted_status->textに変えたいのです)
2、テキスト(ツイート)の最新のものを抽出するためには「$url = "http://api.twitter.com/1/statuses/user_timeline.json?&include_rts=true&count=30&screen_name=(ユーザー名)&page=".$_POST['page'];」のどこかを書き加えればいいとは思うのですが、どう書き加えれればいいか分からなくて困っています。
Twitter API仕様書によれば
http://watcher.moe-nifty.com/memo/docs/twitterAPI20.txt
(転載はじめ)
////////////////////////////////
user_timeline
自分の過去24時間以内に update されたステータスから最大20件(count引数使用時は最大200件)を取得する。
引数 id を指定すれば、その id のユーザのステータスを取得できる
URL: http://twitter.com/statuses/user_timeline.format
http://twitter.com/statuses/user_timeline/id.format
(format は xml, json, rss, atom のうちのいずれかを指定)
since=日時 (オプション)
指定した日時以降に update されたステータスを取得する
指定した日時以降に update されたステータスを取得する
日時のフォーマットは RFC822(の「5. 日付と時刻仕様」) に従う
なお、本オプションの代わりに http リクエストヘッダで
If-Modified-Since
を明示することで、日時を指定することもできる
例:
http://twitter.com/statuses/user_timeline.rss?since=Tue%2C+27+Mar+2007+22%3A55%3A48+GMT
2007年3月27日22時55分48秒GMT以降に update されたステータスを RSS 形式で取得する
////////////////////////////////
(転載終わり)
…と記載してありますが、実際に.jsonでフォーマットしてデフォルトで20件分の取得だったとしても、「過去24時間以内」ではなく、それより前(1日以上前)のものまで取得されてしまいます。
これをどのように書き変えればいいのでしょうか?
3、最後にこの上記のテキスト(タイムライン)を昇順(古い順)で出力したいのですが、urlからの入力書き換えで可能でしょうか?
あるいは今回だと降順(新しい順)しか出力できず、昇順にするためには後から並び替えなければならないのでしょうか?
その並び替え方を教えていただきたいです。
質問が多くて誠に申し訳ございません。
改善法をご存じの方がいらっしゃいましたら1~3のいずれか1つだけでもいいので御教授いただけたら幸いに存じ上げます。
お礼
ごめんなさい。 いろいろ調べてみた結果、解決することが出来ました。 回答ありがとうございました。
補足
返信遅くなり申し訳ありません。 回答者様のライブラリを使わせていただきました。 エラーが治すことが出来ないので教えていただきたいです。 <?php require_once ('TwistOAuth.phar'); // 4種のキーを指定 $ck = '*****'; $cs = '*****'; $at = '*****'; $as = '*****'; $screen_name = '*****'; try { $to = new TwistOAuth($ck,$cs,$at,$as);//OAuth認証 } catch(TwistException $e) { $error = $e->getMessage(); } $statuses = array(); //すべてのツイート用の配列 for($i = 0; $i < 1000; $i += 200) { $param = array('screen_name' => $screen_name, 'count' => '200'); if(isset($max_id)) { $param['max_id'] = $max_id; } try { $tmp_statuses = $to->get('statuses/user_timeline', $param); } catch (TwistException $e) { $error = $e->getMessage(); } if(count($tmp_statuses) == 0) { //取得件数0だったら終了 break; } else { //取得したツイートがあった時 $statuses = array_merge($statuses, $tmp_statuses); //配列の最後に追加 $max_id = $tmp_statuses[count($tmp_statuses)-1]->id - 1; //取得した最古のツイートのidを保存 } foreach($statuses as $result){ echo "$result"; } } ?> エラー文 Catchable fatal error: Object of class stdClass could not be converted to string in C:\xampp\htdocs\php\search_tweet.php on line 38 です。 __________________________________ スクリーンネームを打ち込むスペースを作り打ち込み検索 ↓ ユーザーネーム、ツイート、ツイート時間 という風にするにはどのようにしたらいいですか?