Untuk membuat Bot Telegram yang bisa di ajak “ngobrol” tentunya anda diharuskan mempunyai web server dan setidaknya mengerti bahasa pemograman PHP, tentunya hal ini cukup rumit apabila anda tidak mempunyai ilmu dasar tentang Pemograman PHP maupun tidak mempunyai web server. Pada tutorial kali ini kita akan membuat Bot Telegram kita bisa di ajak “ngobrol” hanya dengan menggunakan fasilitas System Scheduler dan System Script pada Mikrotik yang bisa dimanfaatkan untuk memonitoring kondisi Mikrotik kita. Untuk menggunakan Bot Telegram PHP silahkan kunjungi Cara Konfigurasi MIKBOTAM untuk Monitoring Mikrotik dengan Menggunakan Bot Telegram PHP

Langkah

Langkah pertama yang perlu anda lakukan yaitu harus mempunyai Bot Telegram, untuk membuatnya silahkan baca artikel sebelumnya yang berjudul : Membuat Bot Telegram Untuk Monitoring Status Access Point Hotspot

Buat Script

Buat script dengan nama “tg_config”

Script ini sebagai konfigurasi awal yang berfungsi agar Mikrotik dan Bot anda bisa saling berkomunikasi, anda tinggal memasukkan API Key dan Chat ID. https://pastebin.com/VRj1KDv6

:put "tg: Load config"

:local config {

"botAPI"="(API BOT TELEGRAM ANDA)";
"defaultChatID"="(CHAT ID BOT ANDA)";
"trusted"="(CHAT ID YANG DIGUNAKAN UNTUK BERKOMUNIKASI DENGAN BOT)";
"storage"="";
"timeout"=1;
}

return $config

Buat script dengan nama “tg_getUpdates”

Skrip memeriksa pesan baru dari bot telegram dan memanggil skrip yang sesuai. Jika perintah tidak dikenal atau sumbernya tidak tepercaya, perintah pada telegram akan diabaikan. https://pastebin.com/UGVVRtAH

:global TGLASTMSGID
:global TGLASTUPDID

:local fconfig [:parse [/system script get tg_config source]]
:local http [:parse [/system script get func_fetch source]]
:local gkey [:parse [/system script get tg_getkey source]]
:local send [:parse [/system script get tg_sendMessage source]]

:local cfg [$fconfig]
:local trusted [:toarray ($cfg->"trusted")]
:local botID ($cfg->"botAPI")
:local storage ($cfg->"storage")
:local timeout ($cfg->"timeout")

:put "cfg=$cfg"
:put "trusted=$trusted"
:put "botID=$botID"
:put "storage=$storage"
:put "timeout=$timeout"

:local file ($storage."tg_get_updates.txt")
:local logfile ($storage."tg_fetch_log.txt")
#get 1 message per time
:local url ("https://api.telegram.org/bot".$botID."/getUpdates?timeout=$timeout&limit=1")
:if ([:len $TGLASTUPDID]>0) do={
  :set url "$url&offset=$($TGLASTUPDID+1)"
}

:put "Reading updates..."
:local res [$http dst-path=$file url=$url resfile=$logfile]
:if ($res!="success") do={
  :put "Error getting updates"
  return "Failed get updates"
}
:put "Finished to read updates."

:local content [/file get [/file find name=$file] contents]

:local msgid [$gkey key="message_id" text=$content]
:if ($msgid="") do={ 
 :put "No new updates"
 :return 0 
}
:set TGLASTMSGID $msgid

:local updid [$gkey key="update_id" text=$content]
:set TGLASTUPDID $updid

:local fromid [$gkey block="from" key="id" text=$content]
:local username [$gkey block="from" key="username" text=$content]
:local firstname [$gkey block="from" key="first_name" text=$content]
:local lastname [$gkey block="from" key="last_name" text=$content]
:local chatid [$gkey block="chat" key="id" text=$content]
:local chattext [$gkey block="chat" key="text" text=$content]

:put "message id=$msgid"
:put "update id=$updid"
:put "from id=$fromid"
:put "first name=$firstname"
:put "last name=$lastname"
:put "username=$username"
:local name "$firstname $lastname"
:if ([:len $name]<2) do {
 :set name $username
}

:put "in chat=$chatid"
:put "command=$chattext"

:local allowed ( [:type [:find $trusted $fromid]]!="nil" or [:type [:find $trusted $chatid]]!="nil")
:if (!$allowed) do={
 :put "Unknown sender, keep silence"
 :return -1
}

:local cmd ""
:local params ""
:local ltext [:len $chattext]

:local pos [:find $chattext " "]
:if ([:type $pos]="nil") do={
 :set cmd [:pick $chattext 1 $ltext]
} else={
 :set cmd [:pick $chattext 1 $pos]
 :set params [:pick $chattext ($pos+1) $ltext]
}

:local pos [:find $cmd "@"]
:if ([:type $pos]!="nil") do={
 :set cmd [:pick $cmd 0 $pos]
}

:put "cmd=<$cmd>"
:put "params=<$params>"

:global TGLASTCMD $cmd

:put "Try to invoke external script tg_cmd_$cmd"
:local script [:parse [/system script get "tg_cmd_$cmd" source]]
$script params=$params chatid=$chatid from=$name

Buat script dengan nama “func_fetch”

Untuk perintah regular / tool fetch – memungkinkan Anda menunggu akhir dan mendapatkan hasil membaca melalui http. https://pastebin.com/1NqMkPrP

#########################################################
# Wrapper for /tools fetch
#  Input:
#    mode
#    upload=yes/no
#    user
#    password
#    address
#    host
#    httpdata
#    httpmethod
#    check-certificate
#    src-path
#    dst-path
#    ascii=yes/no
#    url
#    resfile

:local res "fetchresult.txt"
:if ([:len $resfile]>0) do={:set res $resfile}
#:put $res

:local cmd "/tool fetch"
:if ([:len $mode]>0) do={:set cmd "$cmd mode=$mode"}
:if ([:len $upload]>0) do={:set cmd "$cmd upload=$upload"}
:if ([:len $user]>0) do={:set cmd "$cmd user=\"$user\""}
:if ([:len $password]>0) do={:set cmd "$cmd password=\"$password\""}
:if ([:len $address]>0) do={:set cmd "$cmd address=\"$address\""}
:if ([:len $host]>0) do={:set cmd "$cmd host=\"$host\""}
:if ([:len $"http-data"]>0) do={:set cmd "$cmd http-data=\"$"http-data"\""}
:if ([:len $"http-method"]>0) do={:set cmd "$cmd http-method=\"$"http-method"\""}
:if ([:len $"check-certificate"]>0) do={:set cmd "$cmd check-certificate=\"$"check-certificate"\""}
:if ([:len $"src-path"]>0) do={:set cmd "$cmd src-path=\"$"src-path"\""}
:if ([:len $"dst-path"]>0) do={:set cmd "$cmd dst-path=\"$"dst-path"\""}
:if ([:len $ascii]>0) do={:set cmd "$cmd ascii=\"$ascii\""}
:if ([:len $url]>0) do={:set cmd "$cmd url=\"$url\""}

:put ">> $cmd"

:global FETCHRESULT
:set FETCHRESULT "none"

:local script "\
 :global FETCHRESULT;\
 :do {\
   $cmd;\
   :set FETCHRESULT \"success\";\
 } on-error={\
  :set FETCHRESULT \"failed\";\
 }\
"
:execute script=$script file=$res
:local cnt 0
#:put "$cnt -> $FETCHRESULT"
:while ($cnt<100 and $FETCHRESULT="none") do={ 
 :delay 1s
 :set $cnt ($cnt+1)
 #:put "$cnt -> $FETCHRESULT"
}
:local content [/file get [find name=$res] content]
#:put $content
if ($content~"finished") do={:return "success"}
:return $FETCHRESULT

Buat script dengan nama “tg_getkey”

Adalah fungsi bantu untuk tg_getUpdates. https://pastebin.com/j3mKFMd4

:local cur 0
:local lkey [:len $key]
:local res ""
:local p

:if ([:len $block]>0) do={
 :set p [:find $text $block $cur]
 :if ([:type $p]="nil") do={
  :return $res
 }
 :set cur ($p+[:len $block]+2)
}

:set p [:find $text $key $cur]
:if ([:type $p]!="nil") do={
 :set cur ($p+lkey+2)
 :set p [:find $text "," $cur]
 :if ([:type $p]!="nil") do={
   if ([:pick $text $cur]="\"") do={
    :set res [:pick $text ($cur+1) ($p-1)]
   } else={
    :set res [:pick $text $cur $p]
   }
 } 
}
:return $res

Buat script dengan nama “tg_sendMessage”

Script ini berfungsi untuk mengirimkan pesan ke Bot Telegram anda. https://pastebin.com/YMYHmMWd

:local fconfig [:parse [/system script get tg_config source]]

:local cfg [$fconfig]
:local chatID ($cfg->"defaultChatID")
:local botID ($cfg->"botAPI")
:local storage ($cfg->"storage")

:if ([:len $chat]>0) do={:set chatID $chat}

:local url "https://api.telegram.org/bot$botID/sendmessage?chat_id=$chatID&text=$text"
:if ([:len $mode]>0) do={:set url ($url."&parse_mode=$mode")}

:local file ($tgStorage."tg_get_updates.txt")
:local logfile ($tgStorage."tg_fetch_log.txt")

/tool fetch url=$url keep-result=no

Buat script dengan nama “tg_cmd_hi”

Script ini bisa dipanggil dengan perintah /hi. https://pastebin.com/14FJ7qSU

:local send [:parse [/system script get tg_sendMessage source]]

:put $params
:put $chatid
:put $from

:local text "Router Id:* $[/system identity get name] * %0A\
==================%0A\
MENU TERSEDIA%0A\
==================%0A\
/cpu%0A\
/hotspotactive%0A\
/ping%0A\
/public%0A\
/PoeAdd%0A\
/dialing%0A\
/eHotspot%0A\
/dHotspot%0A\
/force"
 
$send chat=$chatid text=$text mode="Markdown"
:return true

Buat script dengan nama “tg_cmd_cpu”

Script ini bisa dipanggil dengan perintah /cpu, dimana fungsi ini sebagai monitoring dari kondisi Mikrotik anda. https://pastebin.com/SGCX15ac

:local send [:parse [/system script get tg_sendMessage source]]
:local hotspot [:len [/ip hotspot active find]]

:put $params
:put $chatid
:put $from
 
:local text "Router Id:* $[/system identity get name] * %0A\
Uptime: _$[/system resource get uptime]_%0A\
CPU Load: _$[/system resource get cpu-load]%_%0A \
RAM: _$(([/system resource get total-memory]-[/system resource get free-memory])/(1024*1024))M/$([/system resource get total-memory]/(1024*1024))M_%0A\
Voltage: _$[:pick [/system health get voltage] 0 2]V_%0A\
Temp: _$[ /system health get temperature]C_"
 
$send chat=$chatid text=$text mode="Markdown"
:return true

Buat script dengan nama “tg_cmd_hotspotactive”

Script ini bisa dipanggil dengan perintah /hotspot, dimana fungsi ini akan menampilkan jumlah user hotspot yang sedang online.

:local send [:parse [/system script get tg_sendMessage source]]
:local hotspot [:len [/ip hotspot active find]]

:put $params
:put $chatid
:put $from
 
:local text "Router Id:* $[/system identity get name] * %0A\
Hotspot users: _$hotspot online_"
 
$send chat=$chatid text=$text mode="Markdown"
:return true

Buat script dengan nama “tg_cmd_ping”

Script ini bisa dipanggil dengan perintah /ping.

:local send [:parse [/system script get tg_sendMessage source]]
:put $params
:put $chatid
:put $from
#Ping Variables
:local avgRtt;
:local pin
:local pout
:local datetime "$[/system clock get date] $[/system clock get time]"
#Ping it real good
/tool flood-ping 8.8.8.8 count=10 do={
  
:if ($sent = 10) do={
    
:set avgRtt $"avg-rtt"
    
:set pout $sent
    
:set pin $received
  }

}

:local ploss (100 - (($pin * 100) / $pout))

:local logmsg ("Ping Average for 8.8.8.8 - ".[:tostr $avgRtt]."ms - packet loss: ".[:tostr $ploss]."%")

:log info $logmsg

:local text "Router Id:* $[/system identity get name] * %0A\
Tanggal : _$datetime_%0A\
Ping : _8.8.8.8_%0A\
Log : _$logmsg_"
$send chat=$chatid text=$text mode="Markdown"
:return true

Buat schedule

Baca juga : Membuat dan Mengatur User Hotspot Mikrotik dengan Bot Telegram Tanpa PHP

Membuat Firewall Rule pada Mikrotik dengan Menggunakan Bot Telegram tanpa PHP

Schedule ini akan menjalankan setiap 10 detik sekali script dengan nama tg_getUpdates

Tambahkan pada On Event script dibawah ini:

/system script run tg_getUpdates

Import script ke Mikrotik

Untuk mempermudah dalam membuat script diatas, lakukan langkah-langkah berikut ini:

Download file “script_telegram.rsc” dengan menggunakan perintah di New Terminal:

/tool fetch url="https://labkom.co.id/file/script_telegram.rsc" mode=http

Lalu import file “script_telegram.rsc” dengan menggunakan perintah di New Terminal:

/import file=script_telegram.rsc

Download Script

Sumber : coders.in.ua

60 COMMENTS

    • kalau hanya menampilkan jumlah yg online saja pakai dibawah ini dengan nama tg_cmd_hotspot, nanti dipanggil di bot telegramnya menggunakan perintah /hotspot

      :local send [:parse [/system script get tg_sendMessage source]]
      :local hotspot [:len [/ip hotspot active find]]
      
      :put $params
      :put $chatid
      :put $from
       
      :local text "Router Id:* $[/system identity get name] * %0A\
      Hotspot users: _$hotspot online_"
       
      $send chat=$chatid text=$text mode="Markdown"
      :return true
      
  1. pak kalau kita mau tambah perintah masukkinnya bagaimana? misal kita akan menjalankan script tertenetu langsung dipanggil lewat telegram

    • dengan mengetikan di telegram dengan perintah /hi, atau /cpu untuk monitoring kondisi cpu,, apabila ingin menambahkan script lain yg akan di jalankan di telegram buat script tersebut dengan nama tg_cmd_(namascript), lalu untuk menjalankan di telegram dengan perintah /namascript

      • alhamdulillah sudah jalan, saya menjalankan perintah sederhana dengan script: /ip hotspot ip-binding set numbers=13 type=regular (untuk mengubah binding ke regular) dan /ip hotspot ip-binding set numbers=13 type=bypassed (untuk bypass) . cuma saya gak tau cara nambahin agar telegram dapat respond bahwa script tersebut status regular/bypass, kalau dari script2 punya bapak diatas adakah sebagai contoh buat script ini? terimakasih

  2. Pak mau tanya lagi, didalam group saya tambahkan user lain, kenapa ketika user tersebut merintah bot milik kita gak bisa ya? apa ada yang salah dengan setingan group? atau memang bot hanya bisa diperintah oleh sipembuat? Terimakasih

  3. Om, mau tanya.. Router Utama saya dikasih DNS Statik ke Switch_A –> 192.168.88.1
    menggunakan terminal, bisa ping menggunakan “ping Switch_A” dan responnya reply.

    Yang jadi pertanyaan, apakah menggunakan bot telegram bisa ping menggunakan Switch_A?
    saya coba hanya bisa menggunakan IP 192.168.88.1.

    Mohon pencerahannya.

    Terima kasih..

    • Masih belum faham gan, scriptnya nanti disimpan di rrouter apa di switch_A.. switch_A ini apakah sebuah dns name static dengan ip 192.168.88.1? kalau untuk ping apakah menggunakan ip atau dns name static saya rasa sama saja

  4. Halo bang….
    Kalau script buat monitoring sistem log di mikorik gimana ya bang?….
    maunya kalau ada new log di mikrotik itu bisa send 1 baris otomatis ke telegram.
    Thanks responnya

  5. Permisi mas, Kok ini yang bisa cuma ping ya ? hi maupun cmd salah , padahal sudah saya input script maupun di telegram bot nya benar

  6. pak mau nanya, waktu coba jalanin di terminal yg /system script run tg_getUpdates kok ktnya syntax error (line 30 column 27) ya, yg salah dmn nya ya pak?

  7. permisi, thanks tutornya sebebelumnya, tapi saya misal ingin membuat command input ping dengan ip sesuai keinginan saja bagaimana pak. misal: ping 192.168.1.100, nanti muncul result ping ke ip tsb. jadi ip-nya ditentukan waktu ngetik, kasarannya ping sembarang device dude lewat telegram. terima kasih.

    • :local send [:parse [/system script get tg_sendMessage source]]
      :local param1 [:pick $params 0 [:find $params " "]]
      :local param2 [:pick $params ([:find $params " "]+1) [:len $params]]
      
      :put $params
      :put $param1
      :put $param2
      :put $chatid
      :put $from
      
      :if ($param1="ip") do={
      #Ping Variables
      :local avgRtt;
      :local pin
      :local pout
      :local datetime "$[/system clock get date] $[/system clock get time]"
      #Ping it real good
      /tool flood-ping $param2 count=10 do={
        
      :if ($sent = 10) do={
          
      :set avgRtt $"avg-rtt"
          
      :set pout $sent
          
      :set pin $received
        }
      
      }
      
      :local ploss (100 - (($pin * 100) / $pout))
      
      :local logmsg ("Ping Average for $param2 - ".[:tostr $avgRtt]."ms - packet loss: ".[:tostr $ploss]."%")
      
      :log info $logmsg
      
      :local text "Router Id:* $[/system identity get name] * %0A\
      Tanggal : _$datetime_%0A\
      Ping : _$param2_%0A\
      Log : _$logmsg_"
      $send chat=$chatid text=$text mode="Markdown"
      :return true
      }
      

      sudah saya tes berhasil.. dengan perintah /ping ip (ip addressnya)
      script bisa di copas disini https://pastebin.com/7N4XmQfr
      /ping ip 8.8.8.8

  8. alhamdulillah, jazaakallahukhair, manteb pak, berhasil saya coba,
    sebelumnya sempet bingung kok ip nya 88 semua waktu ping, eh ternyata script diatas di replace ke ‘tg_cmd_ping”, kirain buat script baru, hehehe. terima kasih master.

  9. Selamat Pagi Pak Yayan Sopyan, saya ingin bertanya perihal Script Hostpot dan CPU itu tidak jalan pak, Untuk Error nya berupa seperti ini pak, Kira-kira errornya di bagian mana ya pak ? (Untuk yang bintang-bintang itu saya sensor pak) Terimakasih

    Finished to read updates.
    message id=52
    update id=**********
    from id=*********
    first name=*****
    last name=
    username=
    in chat=***********
    command=/cpu
    cmd=
    params=
    Try to invoke external script tg_cmd_cpu
    ********
    Reyota
    ambiguous value of value-name, more than one possible value matches input

  10. Saya Pakai Router OS v6.36 pak

    untuk hasil pengecek an system healt seperti ini pak hasilnya

    system health print
    state: disabled
    state-after-reboot: enabled

  11. Pak saya ingin Bertanya perihal penambahan parameter pada script tersebut, misal saya ingin menambahkan param4 dan param5 apa yang haru saya edit Pak Terimakasih. apakah yang harus saya pelajari agar paham perihal penambahan parameter tersebut

    :local send [:parse [/system script get tg_sendMessage source]]
    :local param1 [:pick $params 0 [:find $params ” “]]
    :local param2 [:pick $params ([:find $params ” “]+1) [:len $params]]
    :local param3 [:pick [:pick $params ([:find $params ” “]+1) [:len $params]] ([:find [:pick $params ([:find $params ” “]+1) [:len $params]] ” “]+1) [:len [:pick $params ([:find $params ” “]+1) [:len $params]]]]

    :if ([:len [:find $param2 ” “]]>0) do={
    :set param2 [:pick [:pick $params ([:find $params ” “]+1) [:len $params]] 0 [:find [:pick $params ([:find $params ” “]+1) [:len $params]] ” “]]
    } else={
    :set param3 “”
    }

    :put $params
    :put $param1
    :put $param2
    :put $param3
    :put $chatid
    :put $from

    • Kira-kira begini di bot telegram ketika mengetikan perintah “/tes dd dd dd dd” ketika script dijalankan kira kira muncul seperti ini. jadi untuk menambahkan param4 di edit saja dari param3

      Finished to read updates.
      message id=400
      update id=xxx
      from id=xxxx
      first name=Yayan
      last name=(Labkom.co.id)
      username=LabkomTV
      in chat=xxx
      command=/tes dd dd dd dd
      cmd=tes
      params=dd dd dd dd
      Try to invoke external script tg_cmd_tes
      no such item

      baris ini diabaikan saja dulu karena ini hanya kondisional saja kalau param terbaca 0, atau bisa dicoba di hapus biar ga bingung
      :if ([:len [:find $param2 ” “]]>0) do={
      :set param2 [:pick [:pick $params ([:find $params ” “]+1) [:len $params]] 0 [:find [:pick $params ([:find $params ” “]+1) [:len $params]] ” “]]
      } else={
      :set param3 “”
      }

      • Sebentar Pak saya masih kurang mengerti apa yang harus ditambahkan saat kita mendeklarasikan :local param4, yang dasarnya kita dapat dari :local param3

  12. Saya Coba Menambahkan 5 Param pada script pak yayan sopyan, yang menjelaskan tentang ppp . tetapi hasilnya seperti ini pak. ketika saya mengirim pesan seperti ini /ppp test2 test2 default 172.17.17.1 172.17.17.2

    Finished to read updates.
    message id=89
    update id=xxxxxxxxx
    from id=xxxxxxxxxx
    first name=Reyota
    last name=
    username=
    in chat=xxxxxxxxx
    command=/ppp test test default 172.17.17.1 172.17.17.2
    cmd=
    params=
    Try to invoke external script tg_cmd_ppp
    test test default 172.17.17.1 172.17.17.2
    test
    test
    default 172.17.17.1/32 172.17.17.2/32
    default 172.17.17.1/32 172.17.17.2/32
    default 172.17.17.1/32 172.17.17.2/32
    954109239
    Reyota
    invalid value for argument address

    • ini perintah untuk menambahkan di ppp secret (nama, password, profile, local address, remote address) seperti itu ya? kalau di coba di new terminal udah benar belum perintahnya? kayanya variabel address dia ga di kenali, coba pakai “local”?

      • Jika Saya coba secara langsung di terminal benar seperti itu pak tulisannya
        /ppp secret add name=test password=test service=pptp pro
        file=default local-address=172.17.17.1 remote-address=172.17.17.2 dan bisa terbuat di secret

        untuk penambahan di script botnya seperti ini pak di script line paling bawah
        :if ($param1!=”password” and $param1!=”profile” and $param1!=”enable” and $param1!=”disable” and $param1!=”delete” and $param1!=”print”) do={
        /ppp secret add name=$param1 password=$param2 service=pptp profile=$param3 local-address=$param4 remote-address=$param5
        $send chat=$chatid text=(“User PPP %0AUsername: $param1 %0APassword: $param2 %0AProfile: $param3 %0ABerhasil dibuat…”) mode=”Markdown”
        }

Leave a Reply