2012-02-22 101 views
2

我正在开发一个PHP项目,我希望能够自动将内容发布到twitter。从php更新twitter状态

从我的PHP程序中,我已经授权我的twitter应用程序,并将oauth_token和验证程序存储在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); 

     } 
    } 

的代码,我不知道为什么,这是行不通的,任何帮助将不胜感激。

感谢

UPDATE我出口的$ twitterInfo变量,并将其写入文件和输出如下。不知道这是否有帮助。

EpiTwitterJson :: __ set_state(阵列( 'RESP'=>
EpiCurlManager :: __ set_state(阵列( '键'=> '资源ID#12', 'epiCurl'=> EpiCurl :: __set_state(阵列( 'MC'=> NULL, '封邮件'=> NULL, '运行'=> NULL, '请求'=> 阵列( '资源ID#11'=> NULL, '资源ID#12'=> NULL, ), '响应'=> array( '资源ID#11'=> 阵列( '数据'=> '无效/过期令牌
/OAuth的/的access_token', '代码'=> 401, '时间'=> 0.39, “长度'=> 136, 'type'=>'text/html;数据'=>'{“错误”:“无效的\ /过期的令牌”,“请求”:“\ /帐户(字符集= utf-8', ), '资源ID#12'=> array( 'data'=> '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''','''''>' , ) ) '属性'=> 阵列( '代码'=> 2097154, '时间'=> 3145731, '长度'=> 3145743, '类型'=> 1048594, ) , )),)),'responseText'=>'{“error” :“无效\ /过期的令牌”,“请求”:“\/account \ /verify_credentials.json”}',
'response'=> array( 'error'=>'Invalid/expired Token', ' request'=>'/account/verify_credentials.json',),'error'=>'无效/过期令牌','request'=>'/ account/verify_credentials。JSON”,))

UPDATE 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 我也注意到,它有它的时候它unserializes陈述

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

和PHP错误出现,当我尝试导出它似乎是变量空

+0

是否有任何异常或错误进入错误日志? – 2012-02-22 23:45:29

+0

不,知道错误被抛出,据我所知,只有twitter响应失败 – Boardy 2012-02-23 18:57:58

+0

@Boardy你确定你试图发布的Twitter帐户仍然有这个应用程序授权吗?我以前见过这个,那是在这种情况下的原因。 – BenOfTheNorth 2012-02-24 23:27:10

回答

0

你是如何存储的oauth_token数据库?

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

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

+0

我正在使用中文数据字段将oauth标记存储为mysql数据库。我猜这可能是问题所在。 oauth标记是Twitter授权给你的URL参数,因为这是我使用的oauth标记 – Boardy 2012-02-28 11:24:37

+0

oauth_token是一个对象,因此在将其放入数据库之前必须对其进行序列化 – lamplightdev 2012-02-28 15:46:35

0

您应该创建Twitter的aplication。下载并连接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和采取应对与令牌(响应来满足你在Twitter的应用程序设置-redirect场)的类型,当你拥有它,你可以改变你的状态像:

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

这不意味着用户将永远必须从Twitter页面授权应用程序。我想这样做,所以用户可以添加一个twitter帐户到我的php程序中,当他们随时提交表单时,它会自动授权并发布twitter更新。这是不可能的 – Boardy 2012-02-27 20:57:08

0

您必须将其插入到MySQL之前逃跑的数据。您可以使用mysql_escape_string PHP内置函数。

编辑:你应该使用一个库来与你的服务器(Twitter和其他)进行通信。我已经写了一个简单的,你可以在this blog post更详细的了解它。它支持Twitter,Facebook和Google。

+0

谢谢你做的工作,我希望我可以接受你的答案以及@lamplightdev,因为你们都解决了这个问题。 – Boardy 2012-03-01 14:43:22