Yahoo php sdk getContacts() 间歇性工作
Yahoo php sdk getContacts() intermittently works
我正在使用 Yahoo! Social SDK 允许用户授权,然后获取他们的联系人列表。我已将应用程序设置为允许读取联系人数据,并在验证时验证这一点。
身份验证有效,因为我可以在每次加载页面时使用 getProfile()
配置文件。 getContacts()
是问题,尽管 95% 的时间它 returns false 这是不正确的。
我是不是对请求令牌做错了什么,这意味着 getContacts()
没有成功地 运行 的正确权限,还是 Yahoo 对此查询有某种奇怪的缓存问题?由于他们明显缺乏关于 api 和 php 的文档,这更加困难,我可以使用另一个新库来实现这一目标吗?我知道这是可能的,因为我可以在 "AirBnb Invite a friend" 网页上使用工作版本。
这是我正在使用的代码,它是使用 CodeIgniter 编写的,因此解释了语法。
public function yahoo() {
$oauthapp = new YahooOAuthApplication(DEV_OAUTH_CONSUMER_KEY, DEV_OAUTH_CONSUMER_SECRET, DEV_OAUTH_APP_ID, DEV_OAUTH_DOMAIN);
if($this->session->userdata('yahoo_oauth_access_token')){
$oauthapp->token = YahooOAuthAccessToken::from_string($this->session->userdata('yahoo_oauth_access_token'));
$profile = $oauthapp->getProfile();
$contacts = $oauthapp->getContacts(0, 1000);
if($profile)
print_r($profile);
else
echo "No profile / error";
if($contacts)
print_r($contacts);
else
echo "No contacts / error";
}
elseif(!$this->input->get()) {
$request_token = $oauthapp->getRequestToken(DEV_OAUTH_DOMAIN);
$this->session->set_userdata('request_token', json_encode($request_token));
$redirect_url = $oauthapp->getAuthorizationUrl($request_token);
redirect($redirect_url);
}
else {
$request_token = json_decode($this->session->userdata('request_token'));
$oauthapp->token = $oauthapp->getAccessToken($request_token, $this->input->get('oauth_verifier'));
$this->session->set_userdata('yahoo_oauth_access_token', $oauthapp->token->to_string());
redirect("/index/yahoo");
}
}
经过长时间的搜索终于找到了这个问题,几乎可以肯定会有其他人遇到同样的问题,因为它没有输出错误。
问题是库中的 Curl 超过了 10 秒的运行时间,如果发生这种情况,它只是超时并且脚本结束。我的 error_log 中有错误,但屏幕上没有任何内容。
如果您在 YahooCurl.class.php
中增加第 65 行和第 66 行的超时,则此问题得以解决。
/**
* Fetches an HTTP resource
*
* @param string $url The request url
* @param string $params The request parameters
* @param string $header The request http headers
* @param string $method The request HTTP method (GET, POST, PUT, DELETE, HEAD)
* @param string $post The request body
*
* @return string Response body from the server
*/
public static function fetch($url, $params, $headers = array(), $method = self::GET, $post = null, $options = array())
{
$options = array_merge(array(
'timeout' => '10',
'connect_timeout' => '10',
'compression' => true,
'debug' => true,
'log' => sys_get_temp_dir().'/curl_debug.log',
), $options);
我正在使用 Yahoo! Social SDK 允许用户授权,然后获取他们的联系人列表。我已将应用程序设置为允许读取联系人数据,并在验证时验证这一点。
身份验证有效,因为我可以在每次加载页面时使用 getProfile()
配置文件。 getContacts()
是问题,尽管 95% 的时间它 returns false 这是不正确的。
我是不是对请求令牌做错了什么,这意味着 getContacts()
没有成功地 运行 的正确权限,还是 Yahoo 对此查询有某种奇怪的缓存问题?由于他们明显缺乏关于 api 和 php 的文档,这更加困难,我可以使用另一个新库来实现这一目标吗?我知道这是可能的,因为我可以在 "AirBnb Invite a friend" 网页上使用工作版本。
这是我正在使用的代码,它是使用 CodeIgniter 编写的,因此解释了语法。
public function yahoo() {
$oauthapp = new YahooOAuthApplication(DEV_OAUTH_CONSUMER_KEY, DEV_OAUTH_CONSUMER_SECRET, DEV_OAUTH_APP_ID, DEV_OAUTH_DOMAIN);
if($this->session->userdata('yahoo_oauth_access_token')){
$oauthapp->token = YahooOAuthAccessToken::from_string($this->session->userdata('yahoo_oauth_access_token'));
$profile = $oauthapp->getProfile();
$contacts = $oauthapp->getContacts(0, 1000);
if($profile)
print_r($profile);
else
echo "No profile / error";
if($contacts)
print_r($contacts);
else
echo "No contacts / error";
}
elseif(!$this->input->get()) {
$request_token = $oauthapp->getRequestToken(DEV_OAUTH_DOMAIN);
$this->session->set_userdata('request_token', json_encode($request_token));
$redirect_url = $oauthapp->getAuthorizationUrl($request_token);
redirect($redirect_url);
}
else {
$request_token = json_decode($this->session->userdata('request_token'));
$oauthapp->token = $oauthapp->getAccessToken($request_token, $this->input->get('oauth_verifier'));
$this->session->set_userdata('yahoo_oauth_access_token', $oauthapp->token->to_string());
redirect("/index/yahoo");
}
}
经过长时间的搜索终于找到了这个问题,几乎可以肯定会有其他人遇到同样的问题,因为它没有输出错误。
问题是库中的 Curl 超过了 10 秒的运行时间,如果发生这种情况,它只是超时并且脚本结束。我的 error_log 中有错误,但屏幕上没有任何内容。
如果您在 YahooCurl.class.php
中增加第 65 行和第 66 行的超时,则此问题得以解决。
/**
* Fetches an HTTP resource
*
* @param string $url The request url
* @param string $params The request parameters
* @param string $header The request http headers
* @param string $method The request HTTP method (GET, POST, PUT, DELETE, HEAD)
* @param string $post The request body
*
* @return string Response body from the server
*/
public static function fetch($url, $params, $headers = array(), $method = self::GET, $post = null, $options = array())
{
$options = array_merge(array(
'timeout' => '10',
'connect_timeout' => '10',
'compression' => true,
'debug' => true,
'log' => sys_get_temp_dir().'/curl_debug.log',
), $options);