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
"How could Adam and Eve reproduce if neither were married, nor involved in the church to be married? And don't say anything about "God put Eve on earth to love" because the Christians believe that you must be married to have sex."
Eve was created as Adam's wife. In Genesis 2:24-25, speaking of Adam and Eve immediately after the special creation of Eve, we read "For this reason a man shall leave his father and his mother, and be joined to his wife; and they shall become one flesh. And the man and his wife were both naked and were not ashamed.
Continue reading...
"Is it possible for God to be both all-loving and all-powerful if he allows Hell in the form of eternal suffering and torture?"
What is intended by the phrase "all-loving"? Does it mean that God loves everyone and everything? A God like this loves evil. He loves rape, murder, Satanism, the hatred of Himself, idolatry, etc. He loves the rejection of love. Such a God would love hell and would love sending people to it. Thus, if that is what it means for there to be a God who is all-loving, then the answer to the question is certainly, an all loving God could send people to hell for eternal suffering and torture.
Continue reading...
"How do fossils exist if the Earth is supposedly 6000 years old?"
The vast majority of the fossils we find on this planet are the result of the catastrophic global flood around 2350 BC, recorded in Genesis 6-8, and memories of which remain throughout the histories and traditions of cultures around the world. The "billions of dead things buried in rock layers laid down by water all over the earth" are a very clear testament to the accuracy of the Biblical narrative, and to the results of human sin and rebellion against God (Genesis 6:5, 6:12, 6:17).
Continue reading...