我正在做一个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);
}
}
更新
我已经导出了$twitterInfo
变量并将其写入一个文件,输出如下。不确定这是否有帮助。
EpiTwitterJson::__set_state(数组('resp'=>
EpiCurlManager::__set_state(数组('key'=>'资源id#12','epiColl'=>EpiCurl::__set_state(数组('mc'=>NULL,'msgs'=>空,'running'=>NULL,"请求"=>阵列("资源id#11"=>NULL,"资源id#12"=>NULL,),"响应"=>阵列('资源id#11'=>阵列('data'=>'无效/过期的令牌
/oauth/access_token’,‘code’=>401,‘时间’=>0.39,'长度'=>136,'type'=>'text.html;charset=utf-8’,),'资源id#12'=>阵列('data'=>'{"error":"无效的\/过期的令牌","request":"\/account\/verify_credentials.json"}',‘code’=>401,‘时间’=>0.156,'长度'=>83,'type'=>'application/json;charset=utf-8’,),),"属性"=>阵列('代码'=>2097154,‘时间’=>3145731,'长度'=>3145743,'类型'=>1048594,),)),)),'responseText'=>'{"error":"无效的\/过期的令牌","request":"\/account\/verify_credentials.json"}',
"response"=>数组('error'=>'无效/过期的令牌',"request"=>"/account/verify_credentials.json",),"error"=>"无效/过期令牌","request"=>"/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')";
稍后,我将尝试在不必重新加载推特应用程序授权页面的情况下发布到推特,方法是从我之前保存的数据库中获取值,并使用以下代码将其取消序列化以发布到推特中:
$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();2987字节中偏移2555处的错误
当我试图导出变量时,它似乎是空的
我的推荐:
1) 使用类似的PHP库http://github.com/abraham/twitteroauth.
2) 在上选择您的应用http://dev.twitter.com/apps然后点击"我的访问令牌"。
3) 如上所述访问令牌的Ushttp://dev.twitter.com/pages/oauth_single_token.
查看更多:链接1
链接2
如何在数据库中存储oauth_token?
您不能将它简单地存储为字符串,因为它是一个对象。相反,您需要在将其写入数据库之前对其进行序列化,并在从数据库中检索时取消序列化。
http://php.net/manual/en/function.serialize.php
您应该创建twitter应用程序。下载并连接EpiTwitterapi。复制twitter应用程序密钥和机密(应用程序内设置),使用它们初始化twiter对象。
$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发出请求,并使用token进行响应(响应到您在twitter应用程序设置-重定向字段中键入的地址),当您拥有它时,您可以更改您的状态,如下所示:
$twitterObj->setToken($_SESSION['ot'], $_SESSION['ots']);
$update_status = $twitterObj->post_statusesUpdate(array('status' => $tweet_msg));
$temp = $update_status->response;
在将数据插入MySQL之前,必须对其进行转义。您可以使用mysql_escape_string PHP内置函数。
编辑:您应该使用一个库来与服务器(Twitter和其他人)进行通信。我写了一篇简单的文章,你可以在这篇博客文章中阅读更多。它支持推特、脸书和谷歌。