从php更新twitter状态

时间:2012-02-22 23:23:15

标签: php twitter oauth

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

从我的PHP程序中,我已经授权我的twitter应用程序并将oauth_token和verifier存储在mysql数据库中。

当用户提交表单时,应该将数据发布到twitter。为此,我从数据库中检索oauth_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'=&gt;
  EpiCurlManager :: __ set_state(阵列(        'key'=&gt; '资源ID#12',        'epiCurl'=&gt;       EpiCurl :: __ set_state(阵列(          'mc'=&gt;空值,          'msgs'=&gt;空值,          'running'=&gt;空值,          'requests'=&gt;         阵列(           '资源ID#11'=&gt;空值,           '资源ID#12'=&gt;空值,         )          'answers'=&gt;         阵列(           '资源ID#11'=&gt;           阵列(             'data'=&gt; '无效/过期令牌
  / oauth / access_token',             'code'=&gt; 401,             'time'=&gt; 0.39,             'length'=&gt; 136,             'type'=&gt; “text / html的;字符集= UTF-8' ,           )           '资源ID#12'=&gt;           阵列(             'data'=&gt; '{“错误”:“无效\ /过期令牌”,“请求”:“\ / account \ /verify_credentials.json”}',             'code'=&gt; 401,             'time'=&gt; 0.156,             'length'=&gt; 83,             'type'=&gt; “应用程序/ JSON;字符集= UTF-8' ,           )         )          'properties'=&gt;         阵列(           'code'=&gt; 2097154,           'time'=&gt; 3145731,           'length'=&gt; 3145743,           'type'=&gt; 1048594,         )       )),)),'responseText'=&gt; '{“错误”:“无效\ /过期令牌”,“请求”:“\ / account \ /verify_credentials.json”}',
  'response'=&gt;阵列(       'error'=&gt; '无效/过期令牌',       'request'=&gt; '/account/verify_credentials.json',),'错误'=&gt; '无效/过期令牌','请求'=&gt; '/account/verify_credentials.json',))

更新2

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

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响应的地方,表示令牌无效或已过期。

更新3

我还注意到它在反序列化时出现了一个php错误

  

注意:unserialize();偏移2555处的错误2987字节

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

4 个答案:

答案 0 :(得分:2)

我的建议:

1)使用像http://github.com/abraham/twitteroauth这样的PHP库。

2)在http://dev.twitter.com/apps上选择您的应用,然后点击&#34;我的访问令牌&#34;。

3)我们按照http://dev.twitter.com/pages/oauth_single_token所述访问令牌。

查看更多: link1

link2

答案 1 :(得分:0)

如何在数据库中存储oauth_token?

您不能将其简单地存储为字符串,因为它是一个对象。相反,您需要在将其写入数据库之前对其进行序列化,并在从数据库中检索它时对其进行反序列化。

http://php.net/manual/en/function.serialize.php

答案 2 :(得分:0)

您应该创建Twitter应用程序。下载并连接EpiTwitter api。复制twitter应用程序密钥和秘密(在应用程序设置中)使用它们来初始化twiiter对象。

 $twitterObj = new EpiTwitter($context["TWITTER"]["APP_KEY"], $context["TWITTER"]["APP_SECRET"]);

然后检查Twitter是否已经将令牌发送到您的页面

$oauth_token = $_GET['oauth_token'];
if($oauth_token == '')
{
 $url = $twitterObj->getAuthorizationUrl();
 header("Location: $url");
}else{
 $twitterObj->setToken($_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();
}

如果twitter token =''您的页面向twitter发出请求并使用令牌进行响应(响应来自您在Twitter应用程序设置中输入的地址-redirect字段),当您拥有它时,您可以更改您的状态:

 $twitterObj->setToken($_SESSION['ot'], $_SESSION['ots']);
 $update_status = $twitterObj->post_statusesUpdate(array('status' => $tweet_msg));
 $temp = $update_status->response;

答案 3 :(得分:0)

在将数据插入MySQL之前必须先转义数据。您可以使用mysql_escape_string PHP内置函数。

编辑:您应该使用库与服务器(Twitter和其他人)进行通信。我写了一个简单的,你可以在this blog post中更多地阅读它。它支持Twitter,Facebook和谷歌。