the Website of Timothy McCabe Follower of Christ; Student of Epistemology, Apologetics, and Theology
Home Good News Proofs Questions Presentations Software More

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 God
Artificial 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).

<?php
 
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

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!

 

World Religions and Cults (volume 2)

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

"Brian Dunning from skeptoid.com claims that there is no record of a mass Exodus of Jewish slaves out of Egypt. Is this true?"

No. This is not even remotely the case. This would be true only if we were to throw out all record that we have of the exodus of Jews from Egypt, as Brian Dunning seems to do. Let's take a look at some of his outrageous claims. The statement in question comes from an essay on skeptoid.com entitled "Did Jewish Slaves Build the Pyramids?" PRESUPPOSITIONS Mr.
Continue reading...

"Does your religion or worldview address gender differences regarding: expectations, roles, limitations (or does it)? "

Christianity does detail many differences between genders. Before we address the differences, however, we must first note and discuss one of the most central doctrines of the Christian faith as plainly stated by the Apostle Paul in Galatians 3:28: "There is neither Jew nor Greek, there is neither slave nor free man, there is neither male nor female; for you are all one in Christ Jesus".
Continue reading...

"In Romans 1:23, God clearly says "you have brought down the image of the uncorruptible God to corruptible man". How then can you call Jesus God?"

This question is a continuation of an earlier question, linked to at the bottom of my answer. The question was asked in several parts, so I have compiled all of the questions together here, and will answer them all at once. In full, the questioner asks: "You mentioned that Jesus has two seperate identities. How? Did not Jesus say that he was 'the son of man'?
Continue reading...

All articles