Twitter の TL を PHP で取得する
書いたのは昔ですが、Twitter の自分の TL を取得するクラスです。
自分と書きつつ、非公開に設定していなければ、誰の TL で取得することが出来ます。
クラスなんで当然クライアント部分を書かないと動きません。
クライアントのサンプルは、以下のような感じで、$id はツイート毎のユニークな ID ですね。最後の ID を覚えておいて、次回、その ID を与えるとその次ツイートから取得できる仕組みです。
自分と書きつつ、非公開に設定していなければ、誰の TL で取得することが出来ます。
クラスなんで当然クライアント部分を書かないと動きません。
class GetTwitterUserTimeline {
var $m_Account;
var $m_SinceID;
var $m_Twitter;
function GetTwitterUserTimeline() {
$this->m_Account = "";
$this->m_SinceID = -1;
}
function SetAccount($account) {
$this->m_Account = $account;
}
function SetSinceID($id) {
$this->m_SinceID = $id;
}
function Download() {
$url = "http://twitter.com/statuses/user_timeline.xml?id=".$this->m_Account."&count=200";
if ($this->m_SinceID != -1) {
$url .= "&since_id=".$this->m_SinceID;
}
$xml = file_get_contents($url, false);
$this->m_Twitter = simplexml_load_string($xml) or die("xml error.");
}
function GetNumber() {
return count($this->m_Twitter->status);
}
function GetID($index) {
return $this->m_Twitter->status[$index]->id;
}
function GetTweet($index) {
return $this->m_Twitter->status[$index]->text;
}
function GetScreenName($index) {
return $this->m_Twitter->status[$index]->user->screen_name;
}
function GetTime($index) {
$tdate = explode(" ", $this->m_Twitter->status[$index]->created_at);
$year = intval($tdate[5]);
if (strcmp($tdate[1], "Jan") == 0) $month = 1;
elseif (strcmp($tdate[1], "Feb") == 0) $month = 2;
elseif (strcmp($tdate[1], "Mar") == 0) $month = 3;
elseif (strcmp($tdate[1], "Apr") == 0) $month = 4;
elseif (strcmp($tdate[1], "May") == 0) $month = 5;
elseif (strcmp($tdate[1], "Jun") == 0) $month = 6;
elseif (strcmp($tdate[1], "Jul") == 0) $month = 7;
elseif (strcmp($tdate[1], "Aug") == 0) $month = 8;
elseif (strcmp($tdate[1], "Sep") == 0) $month = 9;
elseif (strcmp($tdate[1], "Oct") == 0) $month = 10;
elseif (strcmp($tdate[1], "Nov") == 0) $month = 11;
elseif (strcmp($tdate[1], "Dec") == 0) $month = 12;
$day = intval($tdate[2]);
$ttime = explode(":", $tdate[3]);
return $this->calcTime($year, $month, $day, $ttime[0], $ttime[1], $ttime[2], intval($this->m_Twitter->status[$index]->user->utc_offset));
}
function calcTime($year, $month, $day, $hour, $minutes, $second, $offset) {
$sec = mktime($hour, $minutes, $second, $month, $day, $year) + $offset;
return date("Y-m-d H:i:s", $sec);
}
}
クライアントのサンプルは、以下のような感じで、$id はツイート毎のユニークな ID ですね。最後の ID を覚えておいて、次回、その ID を与えるとその次ツイートから取得できる仕組みです。
$t = new GetTwitterUserTimeline();
$t->SetAccount("account");
$t->SetSinceID($id);
$t->Download();
for ($i = $tGetNumber() - 1; $i--) {
$date = $t->GetTime($i);
$time = explode(" ", $date);
$file = explode("-",$time[0]);
$fp = fopen("tl.csv", "a");
$text = preg_replace('/\n/', ' ', $t->GetTweet($i));
fprintf($fp,"%s,%s,%s,%s, %s\n", $t->GetID($i),
$t->GetScreenName($i),
$time[0], $time[1], $text);
fclose($fp);
}
$id = $t->GetID(0);
Twitter のアカウントを凍結された
今日の朝、Twitter のアカウントが凍結されました。
といっても最近プログラムするために仮に作ったアカウントで、色々試していたら、今日の朝、
「あなたのアカウントは凍結されています」
なんて件名のメールが届きました。驚きです。
まあ、それなりのことをしてしまった(短期間に不特定多数の人を一定数以上フォローした)んですが...
そのメールには、利用規約違反によりあなたのアカウントが凍結されています。
という日本語のメールがきました。しょうがないので、もうしないから許してよメール出そうとして、それ用のリンクをクリックしたら、
急にここから英語のページに飛ばされました。
中身は、何が書かれているのかよく分かりませんが、仕方がないので英語で Sorry Mail みたいなものを書いてみました。まだ、やりたいことがあるので早く許してくれることを祈っています。
もう無茶はしません。
といっても最近プログラムするために仮に作ったアカウントで、色々試していたら、今日の朝、
「あなたのアカウントは凍結されています」
なんて件名のメールが届きました。驚きです。
まあ、それなりのことをしてしまった(短期間に不特定多数の人を一定数以上フォローした)んですが...
そのメールには、利用規約違反によりあなたのアカウントが凍結されています。
という日本語のメールがきました。しょうがないので、もうしないから許してよメール出そうとして、それ用のリンクをクリックしたら、
急にここから英語のページに飛ばされました。
中身は、何が書かれているのかよく分かりませんが、仕方がないので英語で Sorry Mail みたいなものを書いてみました。まだ、やりたいことがあるので早く許してくれることを祈っています。
もう無茶はしません。
Twitter には同じ投稿を拒否する機能があるらしい。
昨日の 同じつぶやきも有用なら何度も bot するなんてプログラムですが、ちょくちょく失敗します。
この手のプログラムは、全く同じプログラムで同じデータで動かして、結果がちょくちょく違うので意外にやっかいな感じだな~なんて面倒臭い気持ちを前面に押し出して夜寝ました。ただ、寝るだけでは、何も解決しないので PC をつけっぱなしで、プログラムにログを出すようにして、1 晩動かしてみました。
どうやら、エラーの原因は、HTTP/1.1 403 Forbidden でアクセスを拒否されているっぽいです。プログラムは次のログを吐き出していまいた。
HTTP/1.1 403 Forbidden
Date: Sat, 14 Aug 2010 15:45:25 GMT
Server: hi
Status: 403 Forbidden
X-Transaction: YYYYYYYYYYYY-53918-8731
Last-Modified: Sat, 14 Aug 2010 15:45:25 GMT
X-Runtime: 0.05800
Content-Type: application/json; charset=utf-8
Content-Length: 68
Pragma: no-cache
X-Revision: DEV
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Set-Cookie: k=XXX.XXX.XXX.XXX.YYYYYYYYYYYY; path=/; expires=Sat, 21-Aug-10 15:45:25 GMT; domain=.twitter.com
Set-Cookie: guest_id=YYYYYYYYYYYY; path=/; expires=Mon, 13 Sep 2010 15:45:25 GMT
Set-Cookie: lang=ja; path=/
Set-Cookie: _twitter_sess=省略
Vary: Accept-Encoding
Connection: close
{"request":"/statuses/update.json","error":"Status is a duplicate."}
もう少し、直接的な原因を直接教えるエラーメッセージを出せよ。エンジニアあるまじきわがままな文句を垂れていたら、"Status is a duplicate." なんて直接的なメッセージが...
どうやら、Twitter は同じ投稿を繰り返すことはできないみたいですね。ただ、20 も候補があれば投稿できる記事もあるので、おそらく過去 10 回くらいのと同じつぶやきは投稿できないみたいです。

この手のプログラムは、全く同じプログラムで同じデータで動かして、結果がちょくちょく違うので意外にやっかいな感じだな~なんて面倒臭い気持ちを前面に押し出して夜寝ました。ただ、寝るだけでは、何も解決しないので PC をつけっぱなしで、プログラムにログを出すようにして、1 晩動かしてみました。
どうやら、エラーの原因は、HTTP/1.1 403 Forbidden でアクセスを拒否されているっぽいです。プログラムは次のログを吐き出していまいた。
HTTP/1.1 403 Forbidden
Date: Sat, 14 Aug 2010 15:45:25 GMT
Server: hi
Status: 403 Forbidden
X-Transaction: YYYYYYYYYYYY-53918-8731
Last-Modified: Sat, 14 Aug 2010 15:45:25 GMT
X-Runtime: 0.05800
Content-Type: application/json; charset=utf-8
Content-Length: 68
Pragma: no-cache
X-Revision: DEV
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Set-Cookie: k=XXX.XXX.XXX.XXX.YYYYYYYYYYYY; path=/; expires=Sat, 21-Aug-10 15:45:25 GMT; domain=.twitter.com
Set-Cookie: guest_id=YYYYYYYYYYYY; path=/; expires=Mon, 13 Sep 2010 15:45:25 GMT
Set-Cookie: lang=ja; path=/
Set-Cookie: _twitter_sess=省略
Vary: Accept-Encoding
Connection: close
{"request":"/statuses/update.json","error":"Status is a duplicate."}
もう少し、直接的な原因を直接教えるエラーメッセージを出せよ。エンジニアあるまじきわがままな文句を垂れていたら、"Status is a duplicate." なんて直接的なメッセージが...
どうやら、Twitter は同じ投稿を繰り返すことはできないみたいですね。ただ、20 も候補があれば投稿できる記事もあるので、おそらく過去 10 回くらいのと同じつぶやきは投稿できないみたいです。