Я использую Twitter API, чтобы получить твиты на веб-сайте, иногда это показывает, хорошо, а затем вдруг перестает показывать ошибку ..
Эта ошибка возникает, когда перестает работать:
Notice: Trying to get property of non-object in public_html/wp-content/themes/sandra/TwitterModel.php on line 26
Вот мой код:
require("TwitterModel.php");
$tw = new TwitterModel();
$t = $tw->getTweets("sandrasflower");
echo "<div>";
foreach($t['tweets'] as $date=>$tweet)
{
echo "<div class='tweet'>";
echo $tweet . "<br />" . date("jS F Y", strtotime($date));
echo "</div>";
}
Пожалуйста, помогите мне кто-нибудь …
Код файла TwitterModel.php:
<?php
class TwitterModel {
protected $token = "1949108046-8jQwOMdqLSw86n2UZvFx0RlkquyKDEwndxdTMfN";
protected $token_secret = "PE1EIHRGpt8OHkk5Okc9HLUE2ilUL1UYP4u3GTDucOPCG";
protected $consumer_key = "9b7Ww9SM1AdeiVhOoYuenDsRS";
protected $consumer_secret = "nhAASYEa4epSribnb1kSPqtZVFMih4eXYJVWgm5W5VBTCnuOjC";
protected $host = 'api.twitter.com';
protected $method = 'GET';
protected $path = '/1.1/statuses/user_timeline.json'; // api call path
# Get the last 5 tweets for this screen name
public function getTweets($user) {
$query = array( // query parameters
'screen_name' => $user,
'count' => '4'
);
$twitter_data = $this->request($query);
$name = "";
$tweets = array();
foreach ($twitter_data as $value) {
$name = $value->user->name;
$tweetout = "";
$tweetout .= preg_replace("/(http:\/\/|(www\.))(([^\s<]{4,68})[^\s<]*)/", '<a href="http://$2$3" target="_blank">$1$2$4</a>', $value->text) . "<br />";
$tweetout = preg_replace("/@(\w+)/", "<a href=\"http://www.twitter.com/\\1\" target=\"_blank\">@\\1</a>", $tweetout);
$tweetout = preg_replace("/#(\w+)/", "<a href=\"http://twitter.com/search?q=\\1\" target=\"_blank\">#\\1</a>", $tweetout);
$tweets[$value->created_at] = $tweetout;
}
if(is_array($tweets) && !empty($tweets)) {
return array("name" => $value->user->name, "image" => $value->user->profile_image_url, "tweets" => $tweets);
} else {
return false;
}
}
public function request($query) {
$oauth = array(
'oauth_consumer_key' => $this->consumer_key,
'oauth_token' => $this->token,
'oauth_nonce' => (string)mt_rand(), // a stronger nonce is recommended
'oauth_timestamp' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_version' => '1.0'
);
$oauth = array_map("rawurlencode", $oauth); // must be encoded before sorting
$query = array_map("rawurlencode", $query);
$arr = array_merge($oauth, $query); // combine the values THEN sort
asort($arr); // secondary sort (value)
ksort($arr); // primary sort (key)
// http_build_query automatically encodes, but our parameters
// are already encoded, and must be by this point, so we undo
// the encoding step
$querystring = urldecode(http_build_query($arr, '', '&'));
$this->url = "https://$this->host$this->path";
// mash everything together for the text to hash
$base_string = $this->method."&".rawurlencode($this->url)."&".rawurlencode($querystring);
// same with the key
$key = rawurlencode($this->consumer_secret)."&".rawurlencode($this->token_secret);
// generate the hash
$signature = rawurlencode(base64_encode(hash_hmac('sha1', $base_string, $key, true)));
// this time we're using a normal GET query, and we're only encoding the query params
// (without the oauth params)
$this->url .= "?".http_build_query($query);
$this->url = str_replace("&","&",$this->url); //Patch by @Frewuill
$oauth['oauth_signature'] = $signature; // don't want to abandon all that work!
ksort($oauth); // probably not necessary, but twitter's demo does it
// also not necessary, but twitter's demo does this too
function add_quotes($str) { return '"'.$str.'"'; }
$oauth = array_map("add_quotes", $oauth);
// this is the full value of the Authorization line
$auth = "OAuth " . urldecode(http_build_query($oauth, '', ', '));
// if you're doing post, you need to skip the GET building above
// and instead supply query parameters to CURLOPT_POSTFIELDS
$options = array( CURLOPT_HTTPHEADER => array("Authorization: $auth"),
//CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $this->url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
// do our business
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$twitter_data = json_decode($json);
return $twitter_data;
}
}
?>
Это ошибка, возвращаемая из ваших звонков в Twitter:
class stdClass#2 (1) {
public $errors =>
array(1) {
[0] =>
class stdClass#3 (2) {
public $message =>
string(19) "Rate limit exceeded"public $code =>
int(88)
}
}
}
Таким образом, вы делаете вызовы API чаще, чем это разрешено.
Увидеть https://blog.twitter.com/2008/what-does-rate-limit-exceeded-mean-updated
Это не проблема кода.
Других решений пока нет …