首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从php更新twitter状态

从php更新twitter状态
EN

Stack Overflow用户
提问于 2012-02-23 07:23:15
回答 4查看 1.2K关注 0票数 2

我在一个PHP项目中工作,我希望能够将东西自动发布到twitter上。

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

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

‘无效/过期令牌’

下面是我使用的代码

代码语言:javascript
复制
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(数组( 'resp‘=>

EpiCurlManager::__set_state( array ( 'key‘=>’资源id #12','epiCurl‘=> EpiCurl::__set_state(array( 'mc’=> NULL,'msgs‘=> NULL,'running’=> NULL,'requests‘=> array( 'Resource id #11’=> NULL,'Resource id #12‘=> NULL,)、‘=>’响应数组(‘资源id #11’=>数组( 'data‘=>’无效/过期令牌

/oauth/access_token ','code‘=> 401,'time’=> 0.39,'length‘=> 136,’键入‘=>’文本/html;字符集=utf-8‘,),’资源id #12‘长度数组( 'data’=> '{"error":"Invalid \/ expired Token",=>‘代码’=> 401,‘=>’=> 0.156,'length‘=> 83,‘键入’=>‘应用程序/json;字符集=utf-8‘,),),'properties’=>数组( 'code‘=> 2097154,'time’=> 3145731,'length‘=> 3145743,'type’=> 1048594,),)),'responseText‘=>’{“error”:“无效\/过期令牌”,"request":"\/account\/verify_credentials.json"}',

‘=>’响应数组(‘=>’帐户无效/过期令牌‘,’请求‘=> '/account/verify_credentials.json',),'error’=>‘无效/过期令牌’,‘请求’=> '/account/verify_credentials.json',)

更新2

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
$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错误,声明

通知:取消序列化();在2987字节的偏移量2555处出错

当我尝试导出变量时,它看起来是空的

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-27 23:36:02

如何在数据库中存储oauth_token?

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-02-25 18:01:46

我的建议是:

1)使用http://github.com/abraham/twitteroauth等PHP库。

2)在http://dev.twitter.com/apps上选择您的应用程序,然后单击"My Access Token“。

3)使用http://dev.twitter.com/pages/oauth_single_token上描述访问令牌。

更多信息请访问:link1

link2

票数 2
EN

Stack Overflow用户

发布于 2012-02-28 00:11:19

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

代码语言:javascript
复制
 $twitterObj = new EpiTwitter($context["TWITTER"]["APP_KEY"], $context["TWITTER"]["APP_SECRET"]);

然后检查twitter是否已经将token发送到您的页面

代码语言:javascript
复制
$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发出请求并使用token进行响应(响应来自您在twitter应用程序设置-redirect字段中键入的地址),当您拥有它时,您可以像这样更改您的状态:

代码语言:javascript
复制
 $twitterObj->setToken($_SESSION['ot'], $_SESSION['ots']);
 $update_status = $twitterObj->post_statusesUpdate(array('status' => $tweet_msg));
 $temp = $update_status->response;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9404847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档