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);