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:
- Memiliki Akun Twitter Developer dan sudah memiliki level akses Elevated (jika belum silahkan buat dengan mengikuti Langkah-Langkah Membuat Akun Twitter Developer)
- Memiliki Akun Github
- RStudio sudah terhubung dengan akun github
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 File – New 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 bagianrun
, 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:
- Buka halaman repositori github misal https://github.com/cahyaalkahfi/random-tweet-bot. Klik pada tab Settings, selanjutnya pada menu bagian kiri pilih Secrets dan klik Actions.
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.