我正在开发一个 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
关于php - 从 php 更新 Twitter 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404847/