API1.1になってしばらく経ちましたが、
どうもいつの間にかリプライとTL反応ができなくなっていました。
EasyBotter2.1.2版なのに、
必死にググっても解決策がみつからなかったのですが、
ようやく解決策を見つけたので、ここに書きとめておきます。
Consumer key
Consumer secret
Access Token
Access Token Secret
を使って、自動ツイートができることが前提です。
問題は、
mentions_timeline と home_timeline の
使い方にありました。
一般的には、
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
と、"1.1" の変更だけでよかったのです。
■修正前
function getReplies($since_id = NULL){
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
if ($since_id) {
$url .= 'since_id=' . $since_id ."&";
}
$url .= "count=100";
$response = $this->_getData($url);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
とまぁ、こんな感じなのですが、
$url の中身を見ると、
"http://api.twitter.com/1.1/statuses/mentions_timeline.json?count=100" となっており、
一見するとこれでよさそうなのですが、
どうもこれがまた変な感じで、
同じツイッターなのに、できるアカウントと、できないアカウントが存在します。
できない場合、つまり、エラーが起こった場合、
code = 32;
message = “Could not authenticate you”;
と、怒られてしまいます。
日本語では認証エラーという意味なんですが、
きちんと、自動ツイートはできているので、認証がエラーではなかったのです。
答えは、"?"を使ってはいけなかったのです。
つまり、この場合は、
”?count=100"の部分があるがためにエラーになっていたわけです。
パラメーターとして渡してあげないといけなかったわけですね。
渡そうとしても、
渡している部分が、
$response = $this->_getData($url);
となっているので、渡しようがないじゃないかと思われるかもしれませんが、
そういう時は仕方がないので、新しく関数を作ってしまいましょう。
--------------------
■修正後
1.
EasyBotter.php
最下部
//============================================================
//基本的なAPIを叩くための関数
//============================================================
function _setData($url, $value = array()){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, $value, "POST")->getBody(), true);
}
function _getData($url){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, array(), "GET")->getBody(), true);
}
この下に、
function _getData_2($url, $param){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, $param, "GET")->getBody(), true);
}
を追加。
2.
その下、
getReplies()、getFriendsTimeline() 関数を下記のように書き換える。
(比較できるように、オリジナルソースをコメントアウトしています)
function getReplies($since_id = NULL){
// $url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json";
$param = Array(); // 追加
if ($since_id) {
// $url .= 'since_id=' . $since_id ."&";
$param = array_merge($param, array("since_id"=> $since_id));
}
// $url .= "count=100";
$param = array_merge($param, array("count"=> 100));
// $response = $this->_getData($url);
$response = $this->_getData_2($url, $param);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
function getFriendsTimeline($since_id = 0, $num = 100){
// $url = "https://api.twitter.com/1.1/statuses/home_timeline.json?";
$url = "https://api.twitter.com/1.1/statuses/home_timeline.json";
$param = Array(); // 追加
if ($since_id) {
// $url .= 'since_id=' . $since_id ."&";
$param = array_merge($param, array("since_id"=> $since_id));
}
// $url .= "count=" .$num ;
$param = array_merge($param, array("count"=> $num));
// $response = $this->_getData($url);
$response = $this->_getData_2($url, $param);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
-------------------
こんな感じです。
実は_getData($url, $param) とやっておいて、
呼び出し元を修正してもよかったけれど、
検証が大変なので、今回の方法が確実です。
いままで動かなくて困ってた皆様、
よろしければ、やってみてください。
どうもいつの間にかリプライとTL反応ができなくなっていました。
EasyBotter2.1.2版なのに、
必死にググっても解決策がみつからなかったのですが、
ようやく解決策を見つけたので、ここに書きとめておきます。
Consumer key
Consumer secret
Access Token
Access Token Secret
を使って、自動ツイートができることが前提です。
問題は、
mentions_timeline と home_timeline の
使い方にありました。
一般的には、
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
と、"1.1" の変更だけでよかったのです。
■修正前
function getReplies($since_id = NULL){
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
if ($since_id) {
$url .= 'since_id=' . $since_id ."&";
}
$url .= "count=100";
$response = $this->_getData($url);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
とまぁ、こんな感じなのですが、
$url の中身を見ると、
"http://api.twitter.com/1.1/statuses/mentions_timeline.json?count=100" となっており、
一見するとこれでよさそうなのですが、
どうもこれがまた変な感じで、
同じツイッターなのに、できるアカウントと、できないアカウントが存在します。
できない場合、つまり、エラーが起こった場合、
code = 32;
message = “Could not authenticate you”;
と、怒られてしまいます。
日本語では認証エラーという意味なんですが、
きちんと、自動ツイートはできているので、認証がエラーではなかったのです。
答えは、"?"を使ってはいけなかったのです。
つまり、この場合は、
”?count=100"の部分があるがためにエラーになっていたわけです。
パラメーターとして渡してあげないといけなかったわけですね。
渡そうとしても、
渡している部分が、
$response = $this->_getData($url);
となっているので、渡しようがないじゃないかと思われるかもしれませんが、
そういう時は仕方がないので、新しく関数を作ってしまいましょう。
--------------------
■修正後
1.
EasyBotter.php
最下部
//============================================================
//基本的なAPIを叩くための関数
//============================================================
function _setData($url, $value = array()){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, $value, "POST")->getBody(), true);
}
function _getData($url){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, array(), "GET")->getBody(), true);
}
この下に、
function _getData_2($url, $param){
$this->OAuth_Consumer_build();//ここでHTTP_OAuth_Consumerを作り直し
return json_decode($this->consumer->sendRequest($url, $param, "GET")->getBody(), true);
}
を追加。
2.
その下、
getReplies()、getFriendsTimeline() 関数を下記のように書き換える。
(比較できるように、オリジナルソースをコメントアウトしています)
function getReplies($since_id = NULL){
// $url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?";
$url = "http://api.twitter.com/1.1/statuses/mentions_timeline.json";
$param = Array(); // 追加
if ($since_id) {
// $url .= 'since_id=' . $since_id ."&";
$param = array_merge($param, array("since_id"=> $since_id));
}
// $url .= "count=100";
$param = array_merge($param, array("count"=> 100));
// $response = $this->_getData($url);
$response = $this->_getData_2($url, $param);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
function getFriendsTimeline($since_id = 0, $num = 100){
// $url = "https://api.twitter.com/1.1/statuses/home_timeline.json?";
$url = "https://api.twitter.com/1.1/statuses/home_timeline.json";
$param = Array(); // 追加
if ($since_id) {
// $url .= 'since_id=' . $since_id ."&";
$param = array_merge($param, array("since_id"=> $since_id));
}
// $url .= "count=" .$num ;
$param = array_merge($param, array("count"=> $num));
// $response = $this->_getData($url);
$response = $this->_getData_2($url, $param);
if($response["errors"]){
echo $response["errors"][0]["message"];
}
return $response;
}
-------------------
こんな感じです。
実は_getData($url, $param) とやっておいて、
呼び出し元を修正してもよかったけれど、
検証が大変なので、今回の方法が確実です。
いままで動かなくて困ってた皆様、
よろしければ、やってみてください。