tutorial
membuat bot telegram
persiapan
- pc server
- xampp server (apache, mysql)
- akun telegram
membuat user bot telegram
- masuk ke aplikasi telegram, bisa melalui web atau aplikasi
- pada bar pencarian, cari botfather
- 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
- di botFather ketikkan perintah
/mybots - pilih bot yang akan diedit
- pilih edit bot
- selanjutnya akan muncul menu edit dan info dari bot yang dapat diedit
- menu edit
- edit about
- edit description
- edit BotPic
- edit about
membuat backend bot telegram
- install nodejs
- install node module
sudo yum install npm- library tersebut yg nantinya akan mengatur library pihak ketiga yang diinstall ke aplikasi

Persiapan
- buat folder project “bot_teleg_01”
- buka terminal editor dan masuk ke folder project
cd bot_teleg_01
- 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

- install telegraf.js
npm i telegraf- https://telegraf.js.org/
- install nodemon
npm i -g nodemon
coding
- 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
- 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
- bot.start
- didalam handling function anda dapat memasukkan kode tertentu untuk menanggapi respon dari user yang mengirim pesan.
- untuk mengirim pesan balasan terdapat 2 cara :
- explicit
ctx.telegram.sendMessage(ctx.message.chat.id, 'text pesan anda')
- implicit
ctx.reply('text pesan anda')
- explicit
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
- install library html to image
npm i node-html-to-image
install puppeteernpm install puppeteer@19.7.5versi 19.7.5 stable, versi >20 bermasalah di headless: truejika 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
- jalankan kode tersebut diatas maka akan menghasilkan gambar seperti dibawah
koneksi ke database mysql
- 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
- install telegraf-session-local
- npm i telegraf-session-local
- https://www.npmjs.com/package/telegraf-session-local
- 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()- 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"]
}
}
- setelah selesai semua dan kode dijalankan maka akan dibuat file example_db.json untuk menampung data session
- 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
- pada BotFather, chat:
- /
setprivacy
- /
- masukkan id bot yang diawali dengan simbol @ atau pilih bot yang akan dikonfigurasi
- kemudian, chat:
disable
- selanjutnya coba masukkan bot anda ke group dan silahkan coba














