Puppeteer – Otomasi Twitter Posting

Pada kali ini kita akan coba buat program sederhana untuk membuat posting otomatis pada twitter dengan menggunakan puppeteer.

Flow program adalah

  • Membuka halaman twitter login.
  • Proses login yaitu, isi username dan password lalu tekan button login.
  • Buka halaman twitter home.
  • Tekan tweetbox untuk input tweet.
  • Isi tweetbox
  • Tekan tombol tweet.

Code

const puppeteer = require('puppeteer');

const USRNM = 'user goes here';
const PSWRD = 'passwrod goes here';

const HMURL = 'https://twitter.com/';
const LGURL = 'https://twitter.com/login';

(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        defaultViewport: {
            width: 1280,
            height: 720
        }
    });

    //proses login
    const page = await browser.newPage();
    await page.goto(LGURL);
    await page.waitFor('input[name="session[username_or_email]"]');
    await page.type('input[name="session[username_or_email]"]', USRNM, {delay:50});
    await page.type('input[name="session[password]"]', PSWRD , {delay:50}); 
    await page.click('#react-root > div > div > div.css-1dbjc4n.r-1pi2tsx.r-13qz1uu.r-417010 > main > div > div > form > div > div:nth-child(8) > div > div > span > span');

    //proses postTweet
    await page.goto(HMURL);
    await page.waitFor('div[class="DraftEditor-editorContainer"]');
    await page.click('div[class="DraftEditor-editorContainer"]');
    await page.waitFor(400);
    await page.keyboard.type('hohoho');
    await page.click('div[class="css-18t94o4 css-1dbjc4n r-urgr8i r-42olwf r-sdzlij r-1phboty r-rs99b7 r-1w2pmg r-1n0xq6e r-1vuscfd r-1dhvaqw r-1fneopy r-o7ynqc r-6416eg r-lrvibr"]');
    //await browser.close();
    //debugger;
})();

Perhatian, code diatas bisa obsolete dan tidak berjalan karena twitter menggunakan react.js menyebabkan element tidak memiliki id atau class yang tetap.

Latihan

Walaupun ini bukan dari bagian scraping, namun memisahkan antara logik program dan library untuk mengakses twitter adalah kebiasaan baik. Dengan memisahkan antara library untuk akses twitter, library ini bisa digunakan di projek lainnya.

//index.js

const puppeteer = require('puppeteer');
const tweet = require("./tweet");

const USRNM = 'user goes here';
const PSWRD = 'password goes here';


(async () => {

    await tweet.init();

    await tweet.login(USRNM, PSWRD);

    await tweet.postTweet('hohoho');

    debugger;
})();
//tweet.js

const puppeteer = require('puppeteer');

const HMURL = 'https://twitter.com/';
const LGURL = 'https://twitter.com/login';


let browser = null;
let page = null;

const tweet = {

    init: async () => {
        browser = await puppeteer.launch({
            headless: false,
            defaultViewport: {
                width: 1280,
                height: 720
            }
        });

        page = await browser.newPage();
    },

    login: async (usrnm, pswrd) => {
        await page.goto(LGURL);
        await page.waitFor('input[name="session[username_or_email]"]');
        await page.type('input[name="session[username_or_email]"]', usrnm, {delay:50});
        await page.type('input[name="session[password]"]', pswrd , {delay:50});
        await page.click('#react-root > div > div > div.css-1dbjc4n.r-1pi2tsx.r-13qz1uu.r-417010 > main > div > div > form > div > div:nth-child(8) > div > div > span > span');
    },
    
    end: async () => {
        await browser.close();
    },

    postTweet: async (msgs) => {
        await page.goto(HMURL);
        await page.waitFor('div[class="DraftEditor-editorContainer"]');
        await page.click('div[class="DraftEditor-editorContainer"]');
        await page.waitFor(400);
        await page.keyboard.type(msgs, {delay: 50});
        await page.click('div[class="css-18t94o4 css-1dbjc4n r-urgr8i r-42olwf r-sdzlij r-1phboty r-rs99b7 r-1w2pmg r-1n0xq6e r-1vuscfd r-1dhvaqw r-1fneopy r-o7ynqc r-6416eg r-lrvibr"]');        
    }
};

module.exports = tweet;

Kesimpulan Akhir Tutorial

Tidak semua problem atau kasus dapat dibahas satu-persatu. Namun dengan mengikuti modul-modul diatas, kita dapat memahami ide dasar untuk mengakses html element baik melalui object request ataupun menggunakan headless browser seperti puppetter.

Dengan berakhirnya modul ini, tutorial Web Scrapping dengan Node.js berakhir. Semoga bermanfaat.

Sharing is caring:

Leave a Comment