23
Tweeting with an image using Node JS
This is my fourth tutorial about using Twitter API with Node JS. My previous tutorials are listed up there 👆.
In my first tutorial, I showed how to tweet with only text using Twitter API and Node JS, see here.
Then I got a question on how to tweet with an image, thanks to @thomasbnt
and @generativexbot
, so here I'll explain my way to do this.
You need to have a Twitter Developer account and for the basic configurations please go here for more explanation as I follow the same structure.
To tweet an image, the process will consist of two requests:
1- Uploading the image
2- Tweeting with that image
- The new thing here is that each request uses a different subdomain in the Twitter API url, which means that a small change will be done on the config.js file.
const twitter = require('twitter-lite');
exports.newClient = function (subdomain = 'api') {
return new twitter({
subdomain,
consumer_key: '',
consumer_secret: '',
access_token_key: '',
access_token_secret: ''
});
}
- Here I changed the configurations to be returned as a function instead of a JSON object. The function returns a twitter lite client that I moved its definition here for simplicity. The reason I did that is the new configuration attribute subdomain, which can be set from the function parameter.
-Now, we are ready to edit the index.js file. Some changes must be made after changing the config.js file:
1- Remove twitter lite definition
2- Define twitter lite clients for both subdomains to be used later
const apiClient = config.newClient();
const uploadClient = config.newClient('upload');
const fs = require('fs');
const path = require('path');
- Then, read the file as a 64 based file.
const mediaFile = fs.readFileSync(path.join(__dirname, 'hello_world.png'));
const base64image = Buffer.from(mediaFile).toString('base64');
Next, it's similar to what we did in this tutorial where a request is depending on the result of another request.
The first request is for uploading image using media/upload endpoint and the uploading subdomain. This means using uploadClient here and returns an object with media_id attribute which we save for the next step.
// Uploading an image
uploadClient.post('media/upload', { media_data: base64image })
.then(media => {
console.log('You successfully uploaded media');
var media_id = media.media_id_string;
}).catch(console.error);
You can see full details for this request here.
The second request is the normal tweeting using statuses/update endpoint to tweet with the image, which uses the apiClient.
// tweeting with text and image
apiClient.post('statuses/update', { status: 'Hello world!', media_ids: media_id })
.then(tweet => {
console.log('Your image tweet is posted successfully');
}).catch(console.error);
You can see full details for this request here.
everything in place now and we can run the app in Command Prompt using:
node index.js
- That's it and your image is added to your tweet and takes its place in your friends timeline 😁.
Here's is the full code for index.js file:
const fs = require('fs');
const path = require('path');
const config = require('./config');
const apiClient = config.newClient();
const uploadClient = config.newClient('upload');
const mediaFile = fs.readFileSync(path.join(__dirname, 'hello_world.png'));
const base64image = Buffer.from(mediaFile).toString('base64');
uploadClient.post('media/upload', { media_data: base64image })
.then(media => {
console.log('You successfully uploaded media');
var media_id = media.media_id_string;
apiClient.post('statuses/update', { status: 'Hello world!', media_ids: media_id })
.then(tweet => {
console.log('Your image tweet is posted successfully');
}).catch(console.error);
}).catch(console.error);
In the following tutorial, we are going to explore more about twitter API. I have several ideas to share with you, so stay tuned 😉
For the full code, you can visit my github page.
23