Post a tweet to the X API in PHP without any special libraries
December 6, 2024
I really dislike using third-party libraries. Often I find that they are far, far more trouble than they're worth. But even when they really provide some value, they're often a square-peg/round-hole problem; a one-size-fits-all solution that doesn't really fit any problem very well. They make debugging more difficult by adding another untouchable, black-box codebase that could be broken, a codebase that you can't fix even if your own customers need it to work. Anyway, for me, vanilla is best almost all the time.
In the case of posting to the X API, the amount of vanilla code you need is pretty small, so why on earth would anyone waste their time trying to learn and import a library to "help"? And yet people do. Lots of them. I suspect this is because Tw... X's documentation is awful, and everything I found on Stack Overflow was outdated, or partial, or incorrect. Regardless, here's some December, 2024 vanilla PHP code you can copy verbatim and use to automatically post to the X API, along with correlations for the weird variable naming that X employs to make things really clear.
A.I. agrees that human reason necessitates GodArtificial Intelligence chatbot Claude agrees that the existence of human reason can only be explained by the existence of an omnipotent, omniscient, rational God.
Other than filling in the four initial variables with your own data, data that X will give you in your project's control panel, you should be able to keep the rest of the code exactly as-is. But do make sure that your project has read-write access (in your online X developer dashboard, under App Settings > User Authentication Settings > Edit), and not just read access (the default).
function postTweet($tweetString)
{
// Fill in the following four variables according
// to the data X gives you in your
// project control panel.
// X calls this your "API Key"
$key = '';
// X calls this your "Access Token"
$token = '';
// X calls this your "API Key Secret"
$consumerSecret = '';
// X calls this your "Access Token Secret"
$tokenSecret = '';
// Make sure these variables are percent-encoded
// https://developer.x.com/en/docs/authentication/oauth-1-0a/authorizing-a-request
$consumerSecret = rawurlencode($consumerSecret);
$tokenSecret = rawurlencode($tokenSecret);
// Define some other variables
// https://developer.x.com/en/docs/x-api/tweets/manage-tweets/api-reference/post-tweets
$url = 'https://api.x.com/2/tweets';
$nonce = dechex(microtime(true) * 1000).bin2hex(random_bytes(8));
$timestamp = time();
$fields = array("text" => $tweetString);
$postvars = json_encode($fields);
// Make the signature
// https://developer.x.com/en/docs/authentication/oauth-1-0a/creating-a-signature
$parameters = 'POST&'.rawurlencode($url).'&'.rawurlencode(join("",
[
'oauth_consumer_key='.rawurlencode($key),
'&oauth_nonce='.rawurlencode($nonce),
'&oauth_signature_method='.rawurlencode('HMAC-SHA1'),
'&oauth_timestamp='.rawurlencode($timestamp),
'&oauth_token='.rawurlencode($token),
'&oauth_version='.rawurlencode('1.0'),
]));
// Encrypt the signature
$signingKey = $consumerSecret.'&'.$tokenSecret;
$hashedSignature = hash_hmac('sha1', $parameters, $signingKey, true);
$signature = base64_encode($hashedSignature);
// Create your oauth string
// https://developer.x.com/en/docs/authentication/oauth-1-0a
$oauth = join(", ",
[
'oauth_consumer_key="'.rawurlencode($key).'"',
'oauth_nonce="'.rawurlencode($nonce).'"',
'oauth_signature_method="'.rawurlencode('HMAC-SHA1').'"',
'oauth_timestamp="'.rawurlencode($timestamp).'"',
'oauth_token="'.rawurlencode($token).'"',
'oauth_version="'.rawurlencode('1.0').'"',
'oauth_signature="'.rawurlencode($signature).'"',
]);
// Open the connection
$ch = curl_init();
// Set the url, POST data, etc
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-type: application/json',
'Authorization: OAuth '.$oauth
));
// Call X
$resultstr = curl_exec($ch);
// Close connection
curl_close($ch);
// Display the results
echo('<p>'.$resultstr.'</p>');
}
// Launch it like this:
postTweet('Posted via the API! #HelloWorld https://presuppositions.org/software/php-post-tweet-x-api');
?>
That should be it. If something doesn't seem to work right, please let me know.
Gilbert Guttlebocker, Defender of Dragons
Riveting, yet absurd; romantic, yet innocent; Gilbert Guttlebocker, Defender of Dragons is a little Roald Dahl, a little Harry Potter, and a little Chronicles of Narnia, all rolled into one. Timothy McCabe collaborates with the great Benedict Ballyhoot to bring you the novel of the century!
In Printed Form
Along with numerous other authors including Don Landis, Bodie Hodge and Roger Patterson, Timothy McCabe contributes analyses of various world religions and cults in this volume from Master Books.
Other Writings
"Did Jesus preach non-violence? He says in Mat 5:39 Whoever smites thee on thy right cheek offer him the other. But in Luke 22:36 he says He that hath no sword, let him sell his garment and buy one. How then can Heb 1:8-12 says he is unchanging?"
Addressing the last part of your question first, the text is below: Hebrews 1:8-12 (from Psalm 102:25-27) - NASB But of the Son He says, "YOUR THRONE, O GOD, IS FOREVER AND EVER, AND THE RIGHTEOUS SCEPTER IS THE SCEPTER OF HIS KINGDOM. "YOU HAVE LOVED RIGHTEOUSNESS AND HATED LAWLESSNESS; THEREFORE GOD, YOUR GOD, HAS ANOINTED YOU WITH THE OIL OF GLADNESS ABOVE YOUR COMPANIONS.
Continue reading...
"Is unitarianism true or false?"
Unitarianism, as opposed to Trinitarianism, is the view that divine sovereignty is not shared in any way. Effectively, in unitarian views, there is not only just one God, but He is only revealed through just one person. In Trinitarian Christianity, the one God is revealed through three persons, the Father, the Son, and the Holy Spirit.
Continue reading...
"Would you explain to me how we know that Matthew 21v22 (where Jesus promises that we will receive anything we ask for in prayer) cannot be taken literally?"
Matthew 21, verse 22 can and should be taken literally. Let's look at the passage in context: And Jesus answered and said to them, "Truly I say to you, if you have faith and do not doubt, you will not only do what was done to the fig tree, but even if you say to this mountain, 'Be taken up and cast into the sea,' it will happen. And all things you ask in prayer, believing, you will receive.
Continue reading...