PLATFORM
  • Tails

    Create websites with TailwindCSS

  • Wave

    Start building the next great SAAS

  • Pines

    Alpine & Tailwind UI Library

  • Auth

    Plug'n Play Authentication for Laravel

  • Designer comingsoon

    Create website designs with AI

  • DevBlog comingsoon

    Blog platform for developers

  • Static

    Build a simple static website

  • SaaS Adventure

    21-day program to build a SAAS

Written By

Create a Twitter bot that updates the profile banner with the latest followers

Create a Twitter bot that updates the profile banner with the latest followers

Have you seen Twitter profiles that show their latest followers in the profile banner? And wondering how to do it? There are two ways you can do it.

  • Pay for a no-code service that updates the profile banner with the latest followers.
  • Create a bot that updates the profile banner with the latest followers. Do this all for free!

So, we will create a Twitter bot. First, you need to have these things:

  • Twitter developer account
  • API key and secret (Twitter bot)
  • Access token and secret (Once you've authorized the app, you will get an access token and secret)
  • GitHub account (To update the profile banner)
  • Node & npm (Manage packages)
  • your Twitter account ID

Now, We'll start. First, we create a .env file with the following credentials:

appKey=(your api key)
appSecret=(your api secret)
accessToken=(your access token)
accessSecret=(your access secret)

Then, we'll install some packages:

npm install dotenv jimp twitter-api-v2

After that, go to your Twitter profile and save the banner in a folder called static. Your directory structure should look like this:

static\
    (banner.png)
package.json
package-lock.json
.env

Then we create an index.js file.

Now we import the modules.

import { TwitterApi } from "twitter-api-v2";
import jimp from "jimp";
import dotenv from "dotenv";

Then initialize the dotenv module and the Twitter Client.

dotenv.config();

const client = new TwitterApi({
    appKey: process.env.appKey,
    appSecret: process.env.appSecret,
    accessToken: process.env.accessToken,
    accessSecret: process.env.accessSecret,
});

We store all the followers in an array.

let followers_glob = [];

Then, we create a function that gets the latest followers and stores them in the array.

async function saveUserPics() {
    const followers = await client.v2.followers("REPLACE_WITH_YOUR_TWITTER_ID", {
        max_results: 3,
    });

    followers_glob = followers.data.map((fol) => fol.username);

    const user_names = [];

    followers.data.forEach(({ username }) => user_names.push(username));

    const save_pic = async (username) => {
        const URL = `https://unavatar.io/twitter/${username}`;

        const image = await jimp.read(URL);
        image.write(`${username}.png`);
    };


    Promise.all(user_names.map(save_pic)).then(image)
}

Also, don't forget to replace the REPLACE_WITH_YOUR_TWITTER_ID with your Twitter ID.

Then, we create a function that updates the profile banner.

async function image() {
    const image = await jimp.read("static/1500x500.png");
    let mask = await jimp.read(`${followers_glob[0]}.png`);
    const font = await jimp.loadFont("fonts/fnt.fnt");

    image.resize(1500, 500);
    image.print(font, 100, 110, "Latest followers");

    mask.resize(100, 100);
    mask.circle();
    image.composite(mask, 110, 216);

    mask = await jimp.read(`${followers_glob[1]}.png`);
    mask.resize(80, 80);
    mask.circle();
    image.composite(mask, 230, 170);

    mask = await jimp.read(`${followers_glob[2]}.png`);
    mask.resize(80, 80);
    mask.circle();
    image.composite(mask, 240, 260);

    image.write("static/test.png", async () => {
        // await client.v1.updateAccountProfileBanner("./static/test.png");

        // Uncomment the line above to update the profile banner.
    });
}

Make sure to change the numbers before updating the profile banner!

Also, I use a custom font, copy this folder to your project and rename it to fonts.

Now, finally, we execute the function.

saveUserPics();

If you try node index.js and go to static/test.png you will see the banner.

Update profile banner

We have created a program that updates the profile banner. But, you can't do this every time you get a new follower. So, we will create a cron job using GitHub Actions.

Create a GitHub repo, and upload the code (without the .env file). Now go to the settings tab.

Go to Secrets > Actions from the sidebar.

Now create all the secrets that we have in the .env file.

Once you have created the secrets, you should see the following:

Now create a .github/workflows/update.yml file. And paste the following code:

name: Update status

# Controls when the workflow will run
on:
  schedule:
    - cron: "0 0 * * *"

  push:
    branches: [ "main" ]

  workflow_dispatch:

jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3

      # Runs a set of commands using the runners shell
      - name: Setup env vars
        run: |
          touch .env
          echo appKey=${{ secrets.APPKEY }} >> .env
          echo appSecret=${{ secrets.APPSECRET }} >> .env
          echo accessToken=${{ secrets.ACCESSTOKEN }} >> .env
          echo accessSecret=${{ secrets.ACCESSSECRET }} >> .env
          
      # Runs a single command using the runners shell
      - name: Install & run
        run: npm i && node index.js

This runs the index.js file every day at midnight. And it also updates the profile banner every time you get a new follower.

The end

Thank you for reading this tutorial. Here are the links if you need more information.

GitHub - https://github.com/Posandu/twitter-cron Follow me on Twitter – https://twitter.com/Posandu

Comments (0)

loading comments