Bonjour à tous,
Voici mon code :
$consumerKey = "---";
$consumerSecret = "---";
$accessToken = "---";
$accessTokenSecret = "---";
$content = urlencode("test contenu");
// API endpoint
$url = "https://api.twitter.com/2/tweets";
// Prepare the POST data
$postData = json_encode(["text" => $content]);
// OAuth parameters
$oauth = [
"oauth_consumer_key" => $consumerKey,
"oauth_nonce" => md5(uniqid(rand(), true)), // Generate a unique nonce
"oauth_signature_method" => "HMAC-SHA1",
"oauth_timestamp" => time(), // Current UNIX timestamp
"oauth_token" => $accessToken,
"oauth_version" => "1.0"
];
$allParameters = array_merge($oauth, ["text" => $content]);
ksort($allParameters);
$normalizedParameters = http_build_query($allParameters, '', '&', PHP_QUERY_RFC3986);
$baseString = strtoupper("POST") . "&" .
rawurlencode($url) . "&" .
rawurlencode($normalizedParameters);
$signingKey = rawurlencode($consumerSecret) . "&" . rawurlencode($accessTokenSecret);
$oauth["oauth_signature"] = base64_encode(hash_hmac('sha1', $baseString, $signingKey, true));
$authHeader = "OAuth ";
foreach ($oauth as $key => $value) {
$authHeader .= rawurlencode($key) . "=\"" . rawurlencode($value) . "\", ";
}
$authHeader = rtrim($authHeader, ", ");
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: " . $authHeader,
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode == 201) {
echo "Tweet posté\n";
echo $response . "\n";
} else {
echo "Echec. HTTP Code: $httpCode\n";
echo $response . "\n";
}
echo "<br/>Authorization Header: " . $authHeader . "\n";
echo "<br/>POST Data: " . $postData . "\n";
curl_close($ch);
En gros j’essaie de poster sur X sans passer par une librairie, interagir directement avec l’API.
Pour vérifier la connexion avec des requêtes GET basiques ça marche. Mais dès que j’essaie de poster (des tweets, ou juste une requête avec POST) ça me renvoie une 401.
J’ai essayé de déboguer en comparant les requêtes que mon script envoie avec celles de Postmaster, sans succès. L’appli X est bien autorisée à poster, en principe (vérifié sur X Developper).
Le seul truc qui me viendrait à l’esprit serait le curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
que j’utilise en local.
Mais c’est pas censé influencer les requêtes, si ?
Merci de vos suggestions.
+0
-0