tutorial

membuat bot telegram

persiapan

  1. pc server
  2. xampp server (apache, mysql)
  3. akun telegram

membuat user bot telegram

  1. masuk ke aplikasi telegram, bisa melalui web atau aplikasi
  2. pada bar pencarian, cari botfather
  3. selanjutnya lakukan chat dengan botFather
    • untuk membuat bot baru : /newbot
    • masukkan nama bot
    • masukkan username bot
    • jika berhasil anda akan mendapatkan token dari bot yang anda buat

Edit bot

  1. di botFather ketikkan perintah /mybots
  2. pilih bot yang akan diedit
  3. pilih edit bot
  4. selanjutnya akan muncul menu edit dan info dari bot yang dapat diedit
  5. menu edit
    • edit about
    • edit description
    • edit BotPic

membuat backend bot telegram

  1. install nodejs
  2. install node module
    • sudo yum install npm
    • library tersebut yg nantinya akan mengatur library pihak ketiga yang diinstall ke aplikasi

Persiapan

  1. buat folder project “bot_teleg_01”
  2. buka terminal editor dan masuk ke folder project
    • cd bot_teleg_01
  3. insialisasi project aplikasi
    • npm init -y
    • kode ini akan membuat file package.json yang berisi deskripsi dari aplikasi kita
    • jika anda ingin menginput manual deskripsi proyek anda hilangkan -y diakhir kode.
    • anda juga dapat mengedit deskripsi setelah file dibuat
  4. install telegraf.js
    • npm i telegraf
    • https://telegraf.js.org/
  5. install nodemon
    • npm i -g nodemon

coding

  1. selanjutnya pada folder project buat file baru dengan nama app.js dan masukkan kode berikut
    • import telegraf library
    • inisialisasi variabel bot telegraf dengan <TOKEN_TELEGRAM> anda yang sebelumnya telah dibuat
  2. masukkan perintah2 dasar dari bot telegraf
    • bot.start
      • handling function ketika user pertama kali membuka bot atau mengirimkan pesan /start
    • bot.command
      • handling function ketika user mengirimkan pesan berupa command (pesan yag diawali tanda ‘/’)
      • contoh /hello
    • bot.on(message)
      • handling function ketika user mengirimkan pesan text
    • bot.launch
      • menjalankan bot
  3. didalam handling function anda dapat memasukkan kode tertentu untuk menanggapi respon dari user yang mengirim pesan.
  4. untuk mengirim pesan balasan terdapat 2 cara :
    • explicit
      • ctx.telegram.sendMessage(ctx.message.chat.id, 'text pesan anda')
    • implicit
      • ctx.reply('text pesan anda')
const { Telegraf } = require('telegraf')
const { message } = require('telegraf/filters')

const bot = new Telegraf('TOKEN_BOT_TELEGRAM')

bot.start(async (ctx) => { 
    // console.log(ctx.from);
    ctx.reply('Selamat Datang '+ctx.from.first_name+'. Anda berada di Bot Telegram'); 
}) 

bot.command('hello', (ctx) => ctx.reply('Hello juga'));
 
bot.on(message('text'), async (ctx) => { 
    // Explicit usage
    await ctx.telegram.sendMessage(ctx.message.chat.id, `anda mengirimkan: `+ctx.message.text);
  
    // Using context shortcut
    await ctx.reply(`anda mengirimkan: `+ctx.message.text);
});
  

bot.launch()
  • isi dari variabel ctx
    • anda dapat menggunakan data yang diperoleh dari variabel ctx
    • menampilkan pesan dari user : ctx.message.text
    • menampilkan id user : ctx.message.chat.id
    • menampilkan first name user: ctx.from.first_name
    • dan banyak lagi yang dapat anda tampilkan, anda dapat melihat semua data yang ada pada ctx tersebut pada gambar dibawah:

Testing

menu text

...

let state = 0;

bot.command('menu', ctx=>{
    ctx.telegram.sendMessage(ctx.chat.id, 'Silahkan Pilih Menu Tracking Berikut :',
    {
        reply_markup:{
            inline_keyboard:[
                [{text:"1. 🏠 Menu A", callback_data:"MENU_1"}], 
                [{text:"2. 📲 Menu B", callback_data:"MENU_2"}], 
                [{text:"3. 📈 Menu C", callback_data:"MENU_3"}],  
            ]
        } 
    })
}) 

bot.action('MENU_1', (ctx) =>{ 
    state = 1;
    ctx.reply('Silahkan masukkan input untuk menu A')
})

bot.action('MENU_2', (ctx) =>{ 
    state = 2;
    ctx.reply('Silahkan masukkan input untuk menu B')
})
 
bot.on(message('text'), async (ctx) => { 
    var userText = ctx.message.text.toLowerCase()
    if(state!==0){
        if(userText=='stop'){
            state = 0
            ctx.reply("bot menu stop")
        }else{
            cekResult(state,ctx,userText) 
            state = 0
        }
    }
});

bot.launch()

function cekResult(state,ctx,input){
    if(state==1){
        ctx.reply("menu A")
    }else if(state==2){
        ctx.reply("menu B")
    }
}

html code to image

  1. install library html to image
    • npm i node-html-to-image
  2. install puppeteer
    • npm install puppeteer@19.7.5
    • versi 19.7.5 stable, versi >20 bermasalah di headless: true
    • jika page browser dengan versi 19.7.5 masih gagal start maka coba tutup browser yang sedang terbuka atau restart server kemungkinan kita membuat browsernya force close saat uji coba kode
    • note: puppeter tidak perlu diinstall, karena otomatis terinstall bersamaan dengan node-html-to-image library dan disertakan dengan chromium juga.
    • jika suatu saat puppeteer nya bermasalah yang diupdate library yang menggunakan puppeteer yaitu node-html-to-image
const nodeHtmlToImage = require('node-html-to-image')  
const puppeteer = { args: [ 
  '--no-sandbox', 
  '--disable-setuid-sandbox', 
  '--disable-dev-shm-usage', 
  '--disable-accelerated-2d-canvas', 
  '--no-first-run', 
  '--headless', 
  '--no-zygote', 
  '--disable-gpu' ], 
  headless: false, 
  ignoreHTTPSErrors: true };

async function image(){
  await nodeHtmlToImage({
      output: 'image001.png',
      html: '<h1>hallo aswin</h1>',
      puppeteerArgs: puppeteer
  })
}

image()
  • pastikan anda menggunakan fungsi async dan await pada nodeHtmlToImage khusunya jika anda mengirimkan gambar lebih dari 1 agar prosesnya dijalankan secara antrian menunggu proses gambar sebelumnya selesai agar prosesnya tidak error.
  • contoh mengirim gambar lebih dari 1
sendImage(){
  handlingSendImage()
}

async function handlingSendImage(){
  await image() 
  await image() 
  await image() 
}
  • If you are running your program with root privileges, you should use the flag:
    • --no-sandbox
    • --disable-setuid-sandbox 
  • since chromium doesn’t support running root with no sandbox by default
  1. jalankan kode tersebut diatas maka akan menghasilkan gambar seperti dibawah

koneksi ke database mysql

  1. install mysql library
    • npm i mysql
// telegraf
const { Telegraf } = require('telegraf')
const { message } = require('telegraf/filters')
const bot = new Telegraf('TOKEN_BOT_TELEGRAM')

// mysql
const mysql = require('mysql');
const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'bot_telegram'
}) 
 
conn.connect(function(err){
    if(err){  throw err;  }  
    console.log('connected'); 
}) 

// core

contoh penggunaan

function getData_1(input, ctx){

    // get data from database and build html view
    var userID = ctx.chat.id
    var siteID = input
    sql = "select id from tabel where id='"+siteID+"' limit 1";

    conn.query(sql, function (err, result){   
        if(err){
            ctx.reply('error, silahkan coba lagi')
        } else{
            if(result.length>0){ 
                let dataHtml

                result.forEach(item =>{     
                   dataHtml = `<!DOCTYPE html>
                   <html>
                   <body>
                    <table>
                       <tr> <th>No</th> <th>Biodata</th>  <th>Detail</th>  </tr>
                       <tr> <td>4 </td>   <td>Regional</td>       <td>`+item.Regional+`</td> </tr>
                       <tr> <td>5 </td>   <td>Branch</td>         <td>`+item.Branch+`</td> </tr>
                       <tr> <td>6 </td>   <td>Cluster</td>        <td>`+item.Cluster+`</td> </tr>
                       <tr> <td>7 </td>   <td>Kota/Kab</td>       <td>`+item.Kabupaten+`</td> </tr>
                       <tr> <td>8 </td>   <td>Kecamatan</td>      <td>`+item.Kecamatan+`</td> </tr>
                       <tr> <td>9 </td>   <td>Kelurahan</td>      <td>`+item.Kelurahan+`</td> </tr>
                    </table>
                            
                    </body>
                    </html>`
                });  

                nodeHtmlToImage({
                    output: 'images/image_'+userID+'.png',
                    html: dataHtml,
                    puppeteerArgs: puppeteer,

                }).then(() =>  
                    ctx.replyWithPhoto({ source: './images/image_'+userID+'.png' })   
                )   
            }else{
                ctx.reply('data tidak ditemukan, pastikan site id yang dimasukkan benar')
            }
        }
    })
}

menggunakan session

  1. install telegraf-session-local
    • npm i telegraf-session-local
    • https://www.npmjs.com/package/telegraf-session-local
  1. berikut contoh penggunaan session
// telegraf
const { Telegraf } = require('telegraf')
const { message } = require('telegraf/filters')
const LocalSession  = require('telegraf-session-local'); 
const bot = new Telegraf('<TOKEN_BOT_TELEGRAM>')

bot.use((new LocalSession({ database: 'example_db.json' })).middleware())

bot.command('menu', ctx=>{
    ctx.telegram.sendMessage(ctx.chat.id, 'Silahkan Pilih Menu Tracking Berikut :',
    {
        reply_markup:{
            inline_keyboard:[
                [{text:"1. 🏠 Profil Site Branch Sorong_042023", callback_data:"MENU_1"}], 
            ]
        } 
    })
}) 

bot.action('MENU_1', (ctx) =>{  
    ctx.session.state = 1
    ctx.reply('Silahkan masukkan SITE ID')
})
 
bot.on(message('text'), async (ctx) => { 
    var state = ctx.session.state
    var userText = ctx.message.text.toLowerCase()
    if(state!==0){
        if(userText=='stop'){
            ctx.session.state = 0
            ctx.reply("bot menu stop")
        }else{
            handlingMenu(state,ctx,userText) 
            ctx.session.state = 0
        }
    }
});

 
bot.launch()
  1. karena file example_db.json ini akan terus update maka kita perlu mengecualikan watcthing perubahan file tersebut oleh nodemon
{
  "name": "bot_teleg_01",
  "version": "1.0.0",
  
  ...

  "nodemonConfig": {
    "ignore": ["example_db.json"]
  }
}
  1. setelah selesai semua dan kode dijalankan maka akan dibuat file example_db.json untuk menampung data session
  1. contoh isi dari file json tersebut ketika ada user yang menggunakan
{
  "sessions": [
    {
      "id": "123",
      "data": {
        "state": 0
      }
    },
    {
      "id": "124",
      "data": {
        "state": 0
      }
    }
  ]
}

membuat bot bisa merespon dari dalam group

  1. pada BotFather, chat:
    • /setprivacy
  2. masukkan id bot yang diawali dengan simbol @ atau pilih bot yang akan dikonfigurasi
  3. kemudian, chat:
    • disable
  4. selanjutnya coba masukkan bot anda ke group dan silahkan coba

Related Articles

Leave a Reply

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

Back to top button
Index