Tweet Automation Menggunakan RTweet dan Github Action

Pada tutorial ini, kita akan membuat sebuah twitter bot sederhana dan secara periodik akan membuat tweet otomatis. Bahasa yang akan digunakan adalah bahasa R dengan IDE RStudio. Untuk akses ke twitter API menggunakan paket RTweet. Adapun untuk automasi akan menggunakan Github Action.

Untuk itu terdapat beberapa prasyarat untuk melanjutkan tutorial ini yaitu:

Membuat Repo Github

Langkah pertama adalah membuat repositori github sebagai tempat penyimpanan program yang akan dikerjakan. Masuk pada akun github dan buatlah repositori baru. Dalam contoh ini repositori yang dibuat adalah random-tweet-bot.

Membuka Project dengan RStudio

Setelah selesai, selanjutnya kita beralih ke RStudio untuk mulai bekerja dengan repositori tersebut. Caranya adalah sebagai berikut:

Pilih FileNew Project

Selanjutnya pada window New project Wizard pilih Version Control kemudian pilih Git

Pada kotak Repository URL isi dengan link repositori yang sudah dibuat, kemudian tentukan pula tempat penyimpanannya di komputer lokal dan klik Create Project. Jika tidak ada permasalahan maka sudah bisa bekerja pada repositori tersebut.

Membuat Environment Variabel pada RStudio

Langkah selanjutnya adalah membuat Script R yang akan menangani konten yang akan dibuat serta akses ke Twitter API dan mengirimkan tweet. Pada tahap ini kita belum menggunakan Github Action, proses post tweet akan dilakukan dengan mengeksekusi script R secara manual.

Seperti yang disampaikan di awal, kita membutuhkan paket rtweet. Jika belum ada maka dapat diinstall menggunakan sintaks berikut.

R

install.packages('rtweet')

Untuk dapat mengakses Twitter API kita memerlukan 4 informasi berikut:

  • Consumer API Key
  • Consumer API Key Secret
  • Access Token
  • Access Token Secret

Jika sudah memiliki Akun twitter developer maka seharusnya keempat data tersebut sudah dimiliki.

Ketika bekerja dengan API Key dan sejenisnya, salah satu praktik yang perlu diikuti adalah menggunakan environment variabel. Terlebih jika kode dapat diakses secara publik, maka praktik tersebut wajib dilakukan.

Karena kita masih bekerja secara lokal maka pengaturan environment variabel masih relatif mudah.

Buatlah R Script baru dan tuliskan environment variabel pada file tersebut seperti sintaks berikut:

R

Sys.setenv(TWITTER_CONSUMER_API_KEY = "PUT_YOUR_CONSUMER_API_KEY")
Sys.setenv(TWITTER_CONSUMER_API_SECRET = "PUT_YOUR_CONSUMER_API_SECRET")
Sys.setenv(TWITTER_ACCESS_TOKEN = "PUT_YOUR_ACCESS_TOKEN")
Sys.setenv(TWITTER_ACCESS_TOKEN_SECRET = "PUT_YOUR_ACCESS_TOKEN_SECRET")

Nama variabel tidak harus sama seperti di atas, namun agar konsisten dan tidak membingungkan sebaiknya memberi nama yang jelas dan menggambarkan isinya. Untuk isiannya silahkan disesuaikan dengan akun masing-masing.

kemudian run semua baris kode tersebut. Sekarang, variabel tersebut sudah dapat digunakan pada proses selanjutnya.

Membuat Program Twitter Bot

Sekarang saatnya kita masuk pada bagian yang menarik, yaitu membuat program untuk mengirimkan tweet. Buatlah R Script baru dan simpan dengan nama ‘tweet-bot.R’, atau nama apapun yang diinginkan.

Sebelum melangkah lebih jauh, mari kita putuskan konten apa yang akan kita post ke twitter. Silahkan disesuaikan dengan keinginan masing-masing. Dalam contoh ini, yang dilakukan adalah membangkitkan sejumlah data acak mengikuti sebaran tertentu kemudian membuat kurva sebarannya menggunakan ggplot2. Data sebaran dan gambar kurva nanti akan kita post di twitter. Sound interesting…?

berikut ini kode untuk membuat sebaran dan kurva sebarannya:

R

library(ggplot2)

# Jumlah data yang akan dibangkitkan
n <- 10000

# Memilih sebaran yang akan dibangkitkan
# kita lakukan secara random
# 1 : Normal
# 2 : Exponensial
# 3 : F
dist <- sample(1:3, 1)

# Membangkitkan n data yang menyebar
# sesuai sebaran yang terpilih

if (dist == 1) {
  # membangkitkan nilai mean secara acak
  mean <- runif(1, min=0, max=10)
  # membangkitkan nilai std secara acak
  std <- runif(1, min=1, max=10)
  
  # membangkitkan 10000 data yang menyebar Normal
  # dengan mean dan std tertentu
  data <- rnorm(n, mean=mean, sd = std)
  
} else if(dist == 2) {
  # membangkitkan nilai lambda secara acak
  lambda <- runif(1, min=0.1, max=10)
  
  # membangkitkan 10000 data yang menyebar Exponensial
  # dengan lambda tertentu
  data <- rexp(n, rate=lambda)
  
} else if (dist == 3) {
  # Menentukan derajat bebas penyebut dan pembilang
  # secara acak
  df1 <- sample(1:100, 1)
  df2 <- sample(1:100, 1)
  
  # membangkitkan 10000 data yang menyebar F
  # dengan df1 dan df2 tertentu
  data <- rf(n, df1, df2)

}

my.data <- data.frame(data)

rand.color <- function() {
  r <- sample(0:255, 1)
  g <- sample(0:255, 1)
  b <- sample(0:255, 1)
  
  rgb(r, g, b, maxColorValue = 255)
}

# Membuat histogram dengan warna random
plot <- ggplot(data=my.data, aes(x=data)) +
  geom_histogram( color=rand.color(), fill=rand.color(), 
                  position = 'identity', bins=40, lwd=0.1)

# menyimpan plot pada temporary file
histogram_pic <- tempfile( fileext = ".jpeg")
ggsave(histogram_pic, plot = plot, device = "jpeg", 
       dpi = 96, width = 8, height = 8, units = "in" )

Setiap kali kode di atas dijalankan maka akan dipilih 1 dari tiga sebaran yaitu Normal, Eksponensial atau F. Selain itu setiap parameternya juga kita tetapkan secara acak. Misalkan untuk sebaran Normal, nilai mean kita dapatkan secara acak antara 0-10 dan standar deviasi antara 1 sampai 10. Begitu pula dengan sebaran lainnya.

Kemudian berdasarkan sebaran dan parameter yang diperoleh secara acak, kita bangkitkan 10.000 data yang menyebar sesuai dengan sebaran yang dipilih.

Langkah berikutnya adalah membuat histogram dari sebaran tersebut dengan variasi warna yang juga acak. Untuk pemilihan warna acak ini kita membuat fungsi rand.color(). Berikut contoh hstogram yang diperoleh

Setelah bagian di atas selesai saatnya bekerja untuk mempostingnya di twitter.

Masih pada file yang sama tambahkan kode berikut:

R

library(rtweet)

# membaca environment variabel
twitter_token <- rtweet::rtweet_bot(
  api_key =    Sys.getenv("TWITTER_CONSUMER_API_KEY"),
  api_secret = Sys.getenv("TWITTER_CONSUMER_API_SECRET"),
  access_token =    Sys.getenv("TWITTER_ACCESS_TOKEN"),
  access_secret =   Sys.getenv("TWITTER_ACCESS_TOKEN_SECRET")
)

# Konten yang akan di-posting
if (dist==1) {
  status <- paste("Distribusi Normal(Mean =", mean, ", std =", std, ")\n#SebaranNormal", sep=" ")
} else if(dist==2) {
  status <- paste("Distribusi Eksponensial(lambda =", lambda, ")\n#SebaranEksponensial", sep=" ")
} else if(dist==3){
  status <- paste("Distribusi F(df1=", df1, "df2 =", df2, ")\n#SebaranF", sep=" ")
}
  
## alt-text description
alt_text <- paste0(
  "Random distribution data generated using R"
)

# Post tweet
rtweet::post_tweet(
  status = status,
  media = histogram_pic,
  media_alt_text = alt_text,
  token = twitter_token
)

Jika tidak ada kesalahan maka saat script dijalankan sebuah tweet akan di-posting pada akun twitter terkait. Misalkan script dijalankan sebanyak 10 kali, maka akan membuat 10 tweet dengan berbagai variasi kurva sebaran dan warna. Adapun contoh hasilnya adalah seperti gambar di bawah ini.

Sampai di sini script R sudah berjalan dan berhasil mengirimkan tweet. Namun eksekusi script masih dilakukan secara manual. Untuk itu, dengan menggunakan fitur Github Action kita akan membuat script berjalan secara otomatis pada setiap periode waktu tertentu.

Membuat Github Workflow

Di dalam direktori kerja RStudio, buat direktori baru dengan nama ".github" kemudian di dalamnya buat lagi direktori dengan nama “workflows“. Di dalam direktori workflows tersebut buat file dengan ekstensi yaml, misalkan “post_tweet.yaml“. Kemudian masukkan kode berikut pada file tersebut.

YAML

name: post_tweet

on:
  schedule:
    - cron: '10 * * * *'  # dijalankan setiap  10 menit

jobs:
  post-tweet:
    runs-on: macos-latest
    env:
      TWITTER_CONSUMER_API_KEY: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
      TWITTER_CONSUMER_API_SECRET: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
      TWITTER_ACCESS_TOKEN: ${{ secrets.TWITTER_ACCESS_TOKEN }}
      TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
    steps:
      - uses: actions/checkout@v2
      - uses: r-lib/actions/setup-r@v2
      - name: Instal paket rtweet
        run: Rscript -e 'install.packages("rtweet", dependencies = TRUE)'
      - name: Instal paket ggplot2
        run: Rscript -e 'install.packages("ggplot2", dependencies = TRUE)'
      - name: Eksekusi Script R
        run: Rscript tweet-bot.R

Bagian pertama pada kode tersebut adalah name. Pada bagian ini tuliskan nama workflow yang akan dibuat, misalkan post_tweet.

Bagian kedua yaitu on. Bagian ini berisi informasi kapan action ini akan dieksekusi. Terdapat beberapa jenis penentuan waktu eksekusi, namun karena kita akan membuat posting twitter otomatis, maka kita dapat menggunakan schedule. Untuk proses penjadwalan kita menggunakan cron. Dalam contoh kode di atas, workflow dijadwalkan untuk berjalan setiap 10 menit.

Untuk yang belum familiar dengan cron, format penjadwalan memang tidak langsung mudah dipahami. Beruntung, kita dapat menemukan format yang tepat untuk penjadwalan yang diinginkan melalui website https://crontab.guru. Berikut ini contoh tampilannya.

Bagian ketiga yaitu jobs. Pada bagian ini kita menetapkan apa yang dilakukan saat workflow berjalan. kita dapat melakukan beberapa job dalam 1 waktu, dimana masing-masing job memiliki nama masing-masing. Pada kode di atas hanya memiliki 1 job yaitu post-tweet.

Di dalam setiap job, terdapat beberapa konfigurasi yang perlu dibuat yaitu:

  • runs-on : berisi image sistem operasi yang akan digunakan misalkan ubuntu-latest, macos-latest, dsb.
  • env : menentukan environment variabel yang digunakan, misal dalam contoh ini, kita memerlukan akses ke consumer API dan akses token Twitter melalui environmant variabel. Atau jika memerlukan akses ke database, kita dapat menyimpan info kredensialnya pada environment variabel.
  • steps : menentukan rangkaian aksi yang akan dikerjakan. Jika bekerja dengan R Script, action pada dua baris pertama (uses) perlu ditambahkan agar R Script dapat berjalan. Selanjutnya pada bagian run, berisi command untuk dieksekusi. Pada kode di atas, command yang dibuat meliputi penginstalan beberapa paket R dan diakhiri dengan mengeksekusi file R script (tweet-bot.R). Setiap proses run juga dapat kita berikan nama (opsional) menggunakan key - name.

Sebagai catatan untuk pembuatan file yaml, selalu pastikan indentasi (spasi) pada setiap baris kode telah sesuai secara hierarki, karena indentasi yang tidak tepat akan menyebabkan error sehingga workflow tidak dapat dijalankan.

Membuat Repositori Secret

Sebelumnya, data Consumer API dan Access Token Twitter dieksekusi pada environment variabel R melalui RStudio. Sekarang data tersebut perlu disimpan di github agar dapat diakses oleh workflow. Caranya adalah sebagai berikut:

Selanjutnya klik New repository secret:

Lalu isi kotak Name dan Secret. Pada bagian Name masukkan nama secret yang diinginkan, contoh TWITTER_CONSUMER_API_KEY, sesuai dengan nama yang kita buat pada file post_tweet.yaml misalkan pada bagian secrets.TWITTER_CONSUMER_API_KEY. Untuk kotak Secret, isi dengan data Consumer API Twitter yang dimililki. Jika sudah sesuai klik Add secret.

Ulangi lagi membuat New repository secret untuk data lainnya yang diperlukan misalkan TWITTER_CONSUMER_API_KEY_SECRET, TWITTER_ACCESS_TOKEN dan lainnya sesuai yang diperlukan.

Jika sudah menyelesaikan tahapan ini, maka tinggal satu langkah lagi yang diperlukan yaitu push kode ke github.

Push Kode ke Github

Langkah terakhir yang perlu kita lakukan adalah mengupdate repositori github dengan kode yang sudah kita buat di RStudio.

File yang harus kita push adalah tweet-bot.R, serta post_tweet.yaml.Pada tab Git klik Commit, selanjutnya isi kotak Commit message, dan klik Commit. Jika tidak ada permasalahan selanjutnya klik Push untuk mengupdate repositori.

Untuk memonitor apakah eksekusi workflow yang dibuat berhasil atau tidak saat periodenya tiba dapat dilakukan melalui tab Action pada halaman repositori. Juga sahkan coba lihat apa akun twitter terkait secara periodik untuk memastikan apakah tweet berhasil dikirimkan secara periodik.

Selamat mencoba.

Tulisan Lainnya

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Isi