Twitter OAUTH - 返回响应代码"0"

edd*_*ddz 5 php twitter oauth twitter-oauth

我尝试使用Matt Harris的Twitter OAUTH库(https://github.com/themattharris/tmhOAuth)用我的密钥和令牌替换默认数据,但由于某种原因我无法获得有效的响应代码.

我正在测试的url以端口(8888)结束,但我不确定是否与它有关.我正在拖尾PHP日志,没有错误.

$tweet_text = 'Hello world!';
print "Posting...\n";
$result = post_tweet($tweet_text);
print "Response code: " . $result . "\n";

function post_tweet($tweet_text) {

  require_once('tmhOAuth.php');

  $connection = new tmhOAuth(array(
    'consumer_key'    => '(hidden)',
    'consumer_secret' => '(hidden)',
    'user_token'      => '(hidden)',
    'user_secret'     => '(hidden)',
  )); 

  $connection->request('POST', 
    $connection->url('1/statuses/update'), 
    array('status' => $tweet_text));

  return $connection->response['code'];
}
Run Code Online (Sandbox Code Playgroud)

有人有什么想法吗?

非常感谢.

Mik*_*ike 14

我有这个问题,这是由于最近2011年12月的变化:

"默认CURLOPT_SSL_VERIFYPEER为true"

如果您按照Darren的建议转储$ connection->响应,您可能会看到一个错误,例如我的错误:

string(165)"错误设置证书验证位置:"

确保证书文件cacert.pem已就绪,或禁用SSL_VERIFYPEER.

我愿意打赌这会解决你的问题(尽管它可能不是最安全的解决方案):

$connection = new tmhOAuth(array(
    'consumer_key'          => '(hidden)',
    'consumer_secret'       => '(hidden)',
    'user_token'            => '(hidden)',
    'user_secret'           => '(hidden)',
    'curl_ssl_verifypeer'   => false
));
Run Code Online (Sandbox Code Playgroud)

2015年2月更新

今天回顾这个答案,我意识到建议人们将curl_ssl_verifypeer设置为false并不是一个很好的答案(此时你不能再确定你正在与Twitter交谈,所以实际上这是一个可怕的答案).相反,采取我给出的其他建议,并确保适当的根CA证书文件(cacert.pem)到位.


Dar*_*ook 1

如果您与https://github.com/themattharris/tmhOAuth/blob/master/examples/tweet.php进行比较,您的代码可能需要更改为:

$code=$connection->request('POST', ...);
return $code;
Run Code Online (Sandbox Code Playgroud)

然而,查看源代码,可以发现两件事。首先,您的代码应该与此一样好,因为$this->response['code']设置为返回的值。其次,该函数(实际上curlit())也可以返回 void。当它发生时,这response['code']是未定义的。(在我看到这个设计错误之前,这看起来像是一个很有前途的 Twitter 库。)

进一步探究,它只会void$this->config['prevent_request']存在且为真时返回。你没有这样做,我们又回到了原点,无法解释你所看到的行为。

因此,我的下一个故障排除步骤是放在error_reporting(E_ALL|E_NOTICE)顶部,然后检查错误日志以获取更多线索。print_r($connection->response)打电话后也要做一下,request()看看里面还有什么。