【问题标题】:Twitter OAuth returning blank array if there is no tweet如果没有推文,Twitter OAuth 返回空白数组
【发布时间】:2012-12-23 05:45:59
【问题描述】:

我在这个问题上花费了最后 5 个小时,最后我来到这里寻求解决方案。

我正在我的网站(Zend Framework + PHP)中使用 twitter 功能登录,一切正常。但我面临以下问题:

如果用户在他的帐户中没有推文(0 条推文),那么

$tweets = json_decode($response->getBody());
echo "<pre>";
print_r($tweets);
exit;

它向我展示了空白数组。即:Array(); :-(

如果我在 twitter 帐户中添加一些推文,那么它会向我显示完整的数组以及显示名称、图像等用户信息......就像这样:

Array
(
    //other data
    [0] => stdClass Object
        (
            [user] => stdClass Object
            ....
            ....
            so on..
        )
)

以下是我的代码:

public function twitterregisterAction() {
        $path = realpath(APPLICATION_PATH . '/../library/');
        set_include_path($path);
        session_start();
        require $path . "/Zend/Oauth/Consumer.php";

        $config = array(
            "callbackUrl" => "http://" . $_SERVER['HTTP_HOST'] . "/register/twittercallback",
            "siteUrl" => "http://twitter.com/oauth",
            "consumerKey" => "xxxxxxxxxxxxx",
            "consumerSecret" => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        );
        $consumer = new Zend_Oauth_Consumer($config);
// fetch a request token
        $token = $consumer->getRequestToken();

// persist the token to storage
        $_SESSION["TWITTER_REQUEST_TOKEN"] = serialize($token);
// redirect the user
        $consumer->redirect();
    }

    /*
     * Ticket id #16
     * twittercallbackAction method
     */

    public function twittercallbackAction() {
        $config = array(
            "callbackUrl" => "http://" . $_SERVER['HTTP_HOST'] . "/register/twittercallback",
            "siteUrl" => "http://twitter.com/oauth",
            "consumerKey" => "xxxxxxxxxxxxxxxxxx",
            "consumerSecret" => "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        );
        $consumer = new Zend_Oauth_Consumer($config);

        if (!$this->_getParam("denied")) {

            if (!empty($_GET) && isset($_SESSION['TWITTER_REQUEST_TOKEN'])) {
                $token = $consumer->getAccessToken($_GET, unserialize($_SESSION['TWITTER_REQUEST_TOKEN']));
            } else {
// Mistaken request? Some malfeasant trying something?
                exit('Invalid callback request. Oops. Sorry.');
            }
// save token to file
// file_put_contents('token.txt', serialize($token));
            $client = $token->getHttpClient($config);
            $client->setUri('https://api.twitter.com/1/statuses/user_timeline.json?');
            $client->setMethod(Zend_Http_Client::GET);
            $client->setParameterGet('name');
            $client->setParameterGet('profile_image_url');
            $response = $client->request();
            $tweets = json_decode($response->getBody());

            $session = new Zend_Session_Namespace("userIdentity");
            Zend_Session::rememberMe(63072000); //2years
            $session->tw_id = $tweets[0]->user->id;
            $session->tw_name = $tweets[0]->user->name;
            $session->tw_image = $tweets[0]->user->profile_image_url;

            if ($session->tw_id != "") {
                $tw_id = $session->tw_id;
//Calling the function twitterAuthAction for email authentication
                $twAuthArr = $this->twitterAuthAction($tw_id);
                if ($twAuthArr['socialId'] == $tw_id) {
                    $session->userId = $twAuthArr['id'];
                    $session->email = $twAuthArr['emailId'];
                    $this->_redirect('/profile/showprofile');
                } else {
                    $user = new UserRegistration();
                    $firstname = "";
                    $lastname = "";
                    $password = "";
                    $socialtype = "twitter";
                    $email = "";
                    $socialid = $session->tw_id;
                    $result = $user->registerUser($firstname, $lastname, $socialid, $socialtype, $email, $password);
                    $session->userId = $result;
                    $this->_redirect('/register');
                }
            }
            $this->_redirect("/register");
        } else {
            $this->_redirect("/register");
        }
    }

我的问题是:

1) 如果我的推特账户(或新创建的推特账户)中没有任何推文,为什么它不提供用户数组

2) 我想要来自 twitter 帐户的用户个人资料详细信息。我怎样才能得到它?

需要帮助。谢谢

【问题讨论】:

    标签: php zend-framework twitter twitter-oauth


    【解决方案1】:

    我认为根据大卫的回答,您需要在那里使用users/show url 而不是使用statuses/user_timeline。您可以使用 curl 请求 url,这样您将获得包含用户信息的响应。

    试试下面的代码:

        $user_id = $client->getToken()->getParam('user_id');
        $trends_url = "http://api.twitter.com/1/users/show.json?user_id=".$user_id;
    
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $trends_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $curlout = curl_exec($ch);
        curl_close($ch);    
        $response = json_decode($curlout, true);
    
        $session = new Zend_Session_Namespace("userIdentity");
        Zend_Session::rememberMe(63072000); //2years
        $session->tw_id = $response['id'];
        $session->tw_name = $response['name'];
        $session->tw_image = $response['profile_image_url'];
    

    试试这个。希望对你有帮助。

    【讨论】:

      【解决方案2】:

      我认为您误读了 statuses/user_timeline 端点的 Twitter API 文档。

      您标识的字段user 是返回的推文中的字段之一。如果您指向的用户 id 没有推文,则返回的数组中将没有条目,因此没有用户字段。

      如果您在没有任何推文的情况下仍需要用户信息,那么您可能需要点击users/show 端点。

      【讨论】:

        猜你喜欢
        • 2012-05-08
        • 2023-01-10
        • 2018-06-29
        • 2018-11-18
        • 2018-11-15
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        • 2011-11-02
        相关资源
        最近更新 更多