gpt4 book ai didi

php - 使用 oAuth 授权,发布到 Twitter

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:41:45 24 4
gpt4 key购买 nike

我已经创建了一个 Twitter 应用程序来自动发布到我的 Twitter 帐户。所以,我不需要授权新用户。

我已经将访问级别设置为读/写,并收到了访问 token 。我在应用程序中使用了 OAuth 工具来生成 cURL 命令:

curl --request 'POST' 'https://api.twitter.com/1/statuses/update.json' --data 'status=Maybe+he%27ll+finally+find+his+keys.+%23peterfalk' --header 'Authorization: OAuth oauth_consumer_key="...", oauth_nonce="97fad626790e8e5988d4a06cfd47fa74", oauth_signature="...", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1364161424", oauth_token="...", oauth_version="1.0"' --verbose

在命令上方,它说:

Important: This will only be valid for a few minutes. Also remember the cURL command will actually execute the request.

我假设这将在 linux 终端中工作。

我想知道如何将其转换为 PHP cURL 命令。这是我试过的。请注意 $DST 的值是 https://dev.twitter.com/docs/auth/authorizing-request 中“DST”的值;也等于OAuth工具中cURL命令中--header 'Authorization:后字符串的值。

$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
data => 'status='.urlencode($status),
header => 'Authorization: '.$DST
)
));
$resp = curl_exec($ch);
curl_close($ch);

但是$resp的值是:

{
request: "/1/statuses/update.json",
error: "Could not authenticate you."
}

我做错了什么吗?请注意,OAuth 工具表示 cURL 命令实际上可以工作。所以我认为这只是弄清楚如何在 PHP 中安排 cURL 的问题。我不是很熟悉。另请注意,如果可以的话,我想避免使用 OAuth 库。我觉得应该有一个比安装整个库更轻量级的解决方案。

最佳答案

我遇到了三个问题:

(1) 我没有把它包含在这个问题中,但是我的签名没有正确创建。

我当时做的是 base64_encode(hash_hmac('sha1', $base, $key)); 但我应该将 hash_hmac 第四个参数设置为 true 以返回原始二进制而不是十六进制(十六进制显示为 Twitter 文档中的示例,这让我感到困惑)。因此,正确的函数是:base64_encode(hash_hmac('sha1', $base, $key, true));

(2) cURL 设置不正确。我需要 CURLOPT_HTTPHEADER 来设置授权,并将 CURL_VERBOSE 设置为 true:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $DST));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.rawurlencode($status));
curl_setopt($ch, CURLOPT_URL, $url);

(3) 如上面的代码所示,我必须将状态作为字符串而不是数组来发布。我在这个问题上找到了解决这个问题的方法:Why can't I authenticate with OAuth? .

所有这些现在都运行良好。此外,请确保您的 Twitter 应用程序中的访问 token 表示访问级别为“读写”。如果不是,请更改“设置”中的权限,然后返回“详细信息”并重新创建您的访问 token 。

完整脚本

<?php

class Tweet {

public $url = 'https://api.twitter.com/1/statuses/update.json';

function the_nonce(){
$nonce = base64_encode(uniqid());
$nonce = preg_replace('~[\W]~','',$nonce);
return $nonce;
}

function get_DST($status){

$url = $this->url;

$consumer_key = $your_consumer_key_here;
$nonce = $this->the_nonce();
$sig_method = 'HMAC-SHA1';
$timestamp = time();
$version = "1.0";
$token = $your_token_here;
$access_secret = $your_access_secret_here;
$consumer_secret = $your_consumer_secret_here;

$param_string = 'oauth_consumer_key='.$consumer_key.
'&oauth_nonce='.$nonce.
'&oauth_signature_method='.$sig_method.
'&oauth_timestamp='.$timestamp.
'&oauth_token='.$token.
'&oauth_version='.$version.
'&status='.rawurlencode($status);
$sig_base_string = 'POST&'.rawurlencode($url).'&'.rawurlencode($param_string);
$sig_key = rawurlencode($consumer_secret).'&'.rawurlencode($access_secret);

$tweet_sig = base64_encode(hash_hmac('sha1', $sig_base_string, $sig_key, true));

$DST = 'OAuth oauth_consumer_key="'.rawurlencode($consumer_key).'",'.
'oauth_nonce="'.rawurlencode($nonce).'",'.
'oauth_signature="'.rawurlencode($tweet_sig).'",'.
'oauth_signature_method="HMAC-SHA1",'.
'oauth_timestamp="'.rawurlencode($timestamp).'",'.
'oauth_token="'.rawurlencode($token).'",'.
'oauth_version="1.0"';
return $DST;
}

function set($status){

$url = $this->url;

$ch = curl_init();

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: ' . $this->get_DST($status)));
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'status='.rawurlencode($status));
curl_setopt($ch, CURLOPT_URL, $url);

$result = json_decode(curl_exec($ch));
if(!curl_errno($ch)){
$info = curl_getinfo($ch);
if($info['http_code']!='200'){
//error posting
echo 'Error: '.$result->{'error'};
}else{
//success
echo 'Success! <a href="https://twitter.com/AOKHalifax/status/'.$result->{'id_str'}.'" target="_blank">View Tweet</a>';
}
}else{
//error connecting
echo 'error posting';
}
curl_close($ch);
}
}

/*
Usage example:
$status = new Tweet();
$status->set('checking');
*/

?>

关于php - 使用 oAuth 授权,发布到 Twitter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15605635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com