2012-02-22 110 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