Langsung ke konten utama

Poll Telegram Dengan Apps Script

Survei Poll Telegram dapat digelar oleh user maupun bot. Dengan Apps Script kita bisa membuat sebuah poll sekaligus kolektif setiap responnya untuk disimpan dalam Google Sheets.

BAHAN BAKU

Untuk mengimplementasikan eksperimen ini perlu dipersiapkan beberapa hal:

  1. Bot Telegram berikut API Token, anda dapat menyimak cara membuatnya dan mendapatkan API Token pada artikel ini.
  2. Satu file Apps Script, anda bisa menyimak cara membuatnya dan deployment Web Apps di artikel ini.
  3. Script eksperimen ini yang dapat unduh atau salin dari repository.
  4. ID User anda sebagai admin bot yang akan digunakan untuk menampung keterangan error bila terjadi kendala, gunakan @simrsinfobot untuk mengetahui ID User anda.

Di dalam script terdapat beberapa konstata yang harus anda isi dengan ID, API TOKEN, dan URL file bahan baku milik anda:

Bila anda menemui kendala saat deployment silahkan simak cara penanganannya pada artikel iniSiLiKiDi
video courtesy of Telegram

MEMBUAT POLL DENGAN sendPoll

Minimal dengan 3 paramater sendPoll berikut anda sudah bisa membangun sebuah poll:

  • chat_id berupa string ID dari chat yang menjadi destinasi pengiriman poll
  • question berupa string pertanyaan dengan maksimal 300 karakter
  • options berupa array dari string pilihan jawaban dengan maksimal 10 jawaban dan maksimal 100 karakter untuk setiap jawabannya

var dataPoll = {
  method: "post",
  payload: {
    method: "sendPoll",
    chat_id: String( chatid ),
    question: "Your favorite color",
    options: JSON.stringify( [ "RED", "GREEN", "BLUE" ] )
  }
};
UrlFetchApp.fetch( telegramAPIURL + "/", dataPoll );

Metode sendPoll memungkinkan Bot untuk membuat poll dengan 6 variasi yang memadukan 3 unsur berikut:

  • Identitas peserta Anonymous [default] dan Non-anonymous
    is_anonymous: "true"
  • Tipe poll Regular [default] dan Quiz
    type: "regular"
  • Jumlah pilihan Single [default] dan Multiple-answer
    allows_multiple_answers: "false"
kecuali Quiz tidak bisa dipadukan dengan Multiple-answerSiLiKiDi

STRUKTUR JSON POLL

Bot tidak bisa mengakses pesannya sendiri begitu juga dengan poll yang dibuatnya sendiri segera setelah dirilis ke user atau grup. Sehingga sulit untuk mendapatkan struktur JSON dari poll tersebut.

Untuk menangkap struktur JSON dari poll, maka buatlah poll oleh pengguna bot, dengan begitu bot akan menerima kiriman JSON dari Telegram yang berisi poll tersebut, hanya saja bot tidak akan bisa mendapatkan JSON dari jawaban poll tersebut karena yang membuatnya adalah user.

Berikut contoh struktur JSON dari poll dengan tipe quiz yang dibuat user:


{
  "update_id":603402463,
  "message":{
    "message_id":156,
    "from":{
      "id":1650121229,
      "is_bot":false,
      "first_name":"JOHN",
      "last_name":"DOE",
      "username":"johndoe",
      "language_code":"en"
    },
    "chat":{
      "id":1650121229,
      "first_name":"JOHN",
      "last_name":"DOE",
      "username":"johndoe",
      "type":"private"
    },
    "date":1634525717,
    "poll":{
      "id":"6298828345723322379",
      "question":"Your favorite color",
      "options":[
        {
          "text":"RED",
          "voter_count":0
        },
        {
          "text":"GREEN",
          "voter_count":0
        },
        {
          "text":"BLUE",
          "voter_count":0
        }
      ],
      "total_voter_count":0,
      "is_closed":false,
      "is_anonymous":true,
      "type":"quiz",
      "allows_multiple_answers":false,
      "correct_option_id":2,
      "explanation":"Because BLUE is the color of Telegram.",
      "explanation_entities":[
        {
          "offset":8,
          "length":4,
          "type":"bold"
        },
        {
          "offset":29,
          "length":8,
          "type":"text_link",
          "url":"https://telegram.org/"
        }
      ]
    }
  }
}

Properti poll berada di dalam message sehingga untuk mengakses kandungan dari poll tersebut gunakan notasi data.message.poll sehingga untuk mendapatkan ID dari poll tersebut gunakan notasi data.message.poll.id

Khusus untuk mengakses pilihan jawaban poll yang berada di properti options, karena berbentuk array maka gunakan notasi data.message.poll.options[0].text Karena dalam array tersebut terdiri dari beberapa jawaban maka anda harus menerapkan iterasi seperti for... atau iterator lainnya.

Anda bisa melihat contoh respon JSON dari poll di repository Telegram-JSON-ResponseSiLiKiDi

STRUKTUR JSON JAWABAN POLL

Bot tidak bisa mengakses pesannya sendiri begitu juga dengan poll yang dibuatnya sendiri segera setelah dirilis ke user atau grup. Namun setiap kali user memberi pilihan dalam poll tersebut, Telegram akan mengirimkan jawabannya pada Bot dengan struktur JSON bervariasi tergantung jenis poll yang dibuat.

Jawaban dari poll akan dikirimkan oleh Telegram ke yang membuat poll tersebutSiLiKiDi

Berikut contoh respon JSON setiap kali user memberikan pilihan dari poll yang dibuat Bot dengan sendPoll:

JSON Poll Anonymous

JSON Poll Anonymous Multiple-answer

JSON Poll Anonymous Quiz

JSON Poll Non-anonymous Quiz

JSON Poll Non-anonymous Multiple-answer

JSON Poll Non-anonymous

Anda bisa bereksperimen dengan variasi poll melalui @simrsjsonbotSiLiKiDi

MENGAKSES JAWABAN POLL

Dari gambar contoh JSON jawaban di atas dapatlah disimpulkan:

  • Jawaban poll tidak lagi berada dalam properti message sebagaimana pada struktur JSON poll
  • Ciri khas poll Anonymous adalah properti poll
  • Ciri khas poll Non-Anonymous adalah properti poll_answer

Untuk mengakses jumlah pemilih dari poll Anonymous, gunakan notasi data.poll.options[0].voter_count

Untuk mengakses jawaban apa saja yang dipilih dari user dari poll Non-Anonymous, gunakan notasi data.poll_answer.option_ids[i] di mana i adalah numerik urutan jawaban dimulai dengan 0 untuk jawaban .

PENERAPAN DALAM BOT

Memasang Command Poll

Bot bekerja bila ada interaksi dari user, oleh karena itu perlu trigger dari user berupa mengetikkan command tertentu atau buat command menu dengan BotFather sehingga tampak seperti di bawah ini:

Sebagai contoh untuk akan kita sediakan poll dengan 6 variasi melalui command menu berikut:


/poll000 - Poll anonymous regular single answer
/poll001 - Poll anonymous regular multiple answer
/poll010 - Poll anonymous quiz single answer
/poll011 - Poll anonymous quiz multiple answer
/poll100 - Poll non anonymous regular single answer
/poll101 - Poll non anonymous regular multiple answer
/poll110 - Poll non anonymous quiz single answer
/poll111 - Poll non anonymous quiz multiple answer

Sekalipun telah disebutkan sebelumnya bahwa Quiz tidak bisa dipadukan dengan Multiple-answer, namun perlu kita lihat mana yang akan lebih diprioritaskan Telegram bila kedua variasi tersebut dipaksa untuk dipadukan.

Mendeteksi Command Poll


function doPost(e) {
  var data = JSON.parse( e.postData.contents );
  
  //cek apakah kiriman Telegram mengandung command poll
  if ( 
    data.message.text
    && data.message.text.substring(0,5) === "/poll"
    && /^\d+$/.test( data.message.text.substring(5,8) ) 
  ){
    
    //proses command poll selanjutnya di sini
    
  }
}

Memilah Command Poll

Command /poll101 terdiri dari dua bagian: /poll sebagai ciri khas pembeda dari command non-poll, dan tiga digit 101 adalah rangkaian kode variasi poll.

  • Digit pertama kode Anynomous[0] Non-Anonymous[1]
  • Digit kedua kode Regular[0] Quiz[1]
  • Digit ketiga kode Single[0] Multiple-answer[1]

Untuk memilah notasi /poll digunakan notasi script berikut:

data.message.text.substring( 0, 5 ) === "/poll"

Untuk memilah tiga digit variasi poll digunakan penguji regex:

/^\d+$/.test( data.message.text.substring( 5, 8 ) ) )

Untuk mendapatkan kode Anonymous/NA:

data.message.text.substring( 5, 6 )

Untuk mendapatkan kode Regular/Quiz:

data.message.text.substring( 6, 7 )

Untuk mendapatkan kode Single/Multiple:

data.message.text.substring( 7, 8 )

Mengolah Command Poll

Sebagai panduan untuk script, dibuat 3 array dari masing-masing variasi:


const pollAnonymous = ["true","false"];
const pollType = ["regular","quiz"];
const pollMultiple = ["false","true"];

Dengan demikian masing-masing properti variasi diisi dengan 3 array panduan tersebut:


var pesan = data.message.text;
var dataPoll = {
  method: "post",
  payload: {
    method: "sendPoll",
    chat_id: String( chatid ),
    question: "Your favorite color",
    options: JSON.stringify( [ "RED", "GREEN", "BLUE" ] ),
    is_anonymous: pollAnonymous[ pesan.substring(5,6) ],
    type: pollType[ pesan.substring(6,7) ],
    allows_multiple_answers: pollMultiple[ pesan.substring(7,8) ]
  }
};
UrlFetchApp.fetch( telegramAPIURL + "/", dataPoll );

FINAL SCRIPT

Final Script dari artikel ini dapat diunduh di repository. Dalam script kali ini hasil pengolahan JSON jawaban poll akan dikirim balik ke Telegram sehingga anda bisa melihat bukti hasil pengolahannya di Chat Bot Telegram:

Artikel selanjutnya bereksperimen menyimpan jawaban poll ke Google SheetsSiLiKiDi
Dapatkan skrip semua materi di repository

Dukung donasi agar tutorial ini tetap operasional:
Trakteer Saya SiLiKiDi

Komentar

Postingan populer dari blog ini

Kirim Pesan Ke Telegram Dengan Apps Script

Dengan koneksi webhook anda bisa mulai ujicoba mengirim pesan pertama ke Telegram dari Google Apps Script.

Input User Dengan ForceReply Di Telegram

Metode ForceReply memungkinkan Bot memaksa user untuk memberikan input sebelum melanjutkan proses, dengan demikian anda dapat menggelar Step-by-Step formulir di Telegram.