php - 从 php 更新 Twitter 状态

标签 php twitter oauth

我正在开发一个 PHP 项目,我希望能够将内容自动发布到 Twitter。

通过我的 PHP 程序,我已经授权了我的 Twitter 应用程序,并将 oauth_token 和验证程序存储在 mysql 数据库中。

当用户提交表单时,应该将数据发布到 Twitter。为此,我从数据库中检索 oauth_token 来发布消息,但是当我查看执行实际状态更新的代码部分之前的响应时,我收到一条错误消息

'invalid/expired token'

下面是我正在使用的代码

function postToTwitter($twitterMsg)
    {
    require ("../../social/phpHandler/twitterLib/EpiCurl.php");
    require ("../../social/phpHandler/twitterLib/EpiOAuth.php");
    require ("../../social/phpHandler/twitterLib/EpiTwitter.php");
    require ("../../social/phpHandler/twitterLib/secret.php");

    $query = "SELECT * FROM social_sites";
    $result = mysql_query($query);
    if ($result)
    {
        //session_start();
        //$twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
        while ($myrow = mysql_fetch_array($result))
        {
            $oauth_token = $myrow['token'];
            $verifier = $myrow['verifier'];

            $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
                $twitterObj->setToken($oauth_token);
            //echo 'OAuth Token: ' . $_GET['oauth_token'];
            $token = $twitterObj->getAccessToken();
            $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
            $_SESSION['ot'] = $token->oauth_token;
            $_SESSION['ots'] = $token->oauth_token_secret;
            $twitterInfo= $twitterObj->get_accountVerify_credentials();
            $twitterInfo->response;
            //echo '<pre>';
            print_r($twitterInfo->response);

        }
    }

更新

我已导出 $twitterInfo 变量并将其写入文件,输出如下。不确定这是否有帮助。

EpiTwitterJson::__set_state(array( 'resp' =>
EpiCurlManager::__set_state(array( 'key' => 'Resource id #12', 'epiCurl' => EpiCurl::__set_state(array( 'mc' => NULL, 'msgs' => NULL, 'running' => NULL, 'requests' => array ( 'Resource id #11' => NULL, 'Resource id #12' => NULL, ), 'responses' => array ( 'Resource id #11' => array ( 'data' => ' Invalid / expired Token
/oauth/access_token ', 'code' => 401, 'time' => 0.39, 'length' => 136, 'type' => 'text/html; charset=utf-8', ), 'Resource id #12' => array ( 'data' => '{"error":"Invalid \/ expired Token","request":"\/account\/verify_credentials.json"}', 'code' => 401, 'time' => 0.156, 'length' => 83, 'type' => 'application/json; charset=utf-8', ), ), 'properties' => array ( 'code' => 2097154, 'time' => 3145731, 'length' => 3145743, 'type' => 1048594, ), )), )), 'responseText' => '{"error":"Invalid \/ expired Token","request":"\/account\/verify_credentials.json"}',
'response' => array ( 'error' => 'Invalid / expired Token', 'request' => '/account/verify_credentials.json', ), 'error' => 'Invalid / expired Token', 'request' => '/account/verify_credentials.json', ))

更新2

我尝试通过使用下面的代码序列化对象并将其存储在数据库中来保存访问 token

function authenticate($consumer_key, $consumer_secret)
    {
        $twitterObj = new EpiTwitter($consumer_key, $consumer_secret);

        $twitterObj->setToken($_GET['oauth_token']);
        //echo 'OAuth Token: ' . $_GET['oauth_token'];
        $token = $twitterObj->getAccessToken();
        $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
        $_SESSION['ot'] = $token->oauth_token;
        $_SESSION['ots'] = $token->oauth_token_secret;
        $twitterInfo= $twitterObj->get_accountVerify_credentials();
        $twitterInfo->response;
        //echo '<pre>';
        //print_r($twitterInfo->response);
        //var_dump($twitterInfo);
        $username = $twitterInfo->screen_name;
        $profilePic = $twitterInfo->profile_image_url;

        addToDatabase($username, $profilePic, $_GET['oauth_token'], $_GET['oauth_verifier']);
    }

    function addToDatabase($username, $profilePic, $token, $verifier)
    {
        $token_serialised = serialize($token);
        $query = "INSERT INTO social_sites (social_name, token, verifier, username, profilePicture) VALUES ('Twitter', '$token_serialised', '$verifier', "
            . "'$username', '$profilePic')";

然后,我尝试发布到 Twitter,而无需重新加载 Twitter 应用程序授权页面,方法是从我之前保存的数据库中获取值,然后使用以下代码将其反序列化以发布到 Twitter:

$twitterObj = new EpiTwitter($consumer_key, $consumer_secret);
            while ($myrow = mysql_fetch_array($result))
            {
                //$access_token = unserialize($myrow['token']);
                //$twitterObj->setToken($access_token);
                //$token = $twitterObj->getAccessToken();
                $token = unserialize($myrow['token']);
                $twitterObj->setToken($token->oauth_token, $token->oauth_token_secret);
                $_SESSION['ot'] = $token->oauth_token;
                $_SESSION['ots'] = $token->oauth_token_secret;
                $twitterInfo= $twitterObj->get_accountVerify_credentials();     

                $myFile = "log.txt";
                $fh = fopen($myFile, 'w') or die("Error");
                fwrite($fh, var_export($twitterInfo->response, true));
                fclose($fh);

//              $twitterMsg = $_REQUEST['tweet'];
                $update_status = $twitterObj->post_statusesUpdate(array('status' => $twitterMsg));
                $tem = $update_status->response;    
                fwrite($fh, var_export($tem, true));
                fclose($fh);
}

日志文件写入是写出 Twitter 响应的地方,它指出 token 无效或已过期。

更新3

我还注意到,当它反序列化它时,它会出现一个 php 错误,并指出

Notice: unserialize(); error at offset 2555 of 2987 bytes

当我尝试导出变量时,它似乎是空的

最佳答案

我的建议:

1) 使用类似 http://github.com/abraham/twitteroauth 的 PHP 库.

2) 在http://dev.twitter.com/apps上选择您的应用程序并点击“我的访问 token ”。

3) 我们访问 token ,如 http://dev.twitter.com/pages/oauth_single_token 中所述.

查看更多: link1

link2

关于php - 从 php 更新 Twitter 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404847/

相关文章:

php - 如何在 MySQL 中优先搜索多个列?

python - 在 Python 中解析 Twitter JSON JSONDecodeError : Expecting value: line 2 column 1 (char 2)

java - instagram api - 获取完整的用户列表

node.js - OAuth 2.0 身份验证和授权

facebook - 验证多个域的应用程序

java - Spring 社交 Facebook 登录 - 抱歉,出了点问题

php - 为什么我不能在用 php 旋转后使 png 的背景透明?

php - MySQL 中的日期时间显示

php - Pubnub 用于在 iOS 中聊天

c# - 使用 OAuth 在 C# 中使用 Twitter API 在 Twitter 中发布阿拉伯字符