Membuat bot telegram dengan golang
Kali ini kita akan membuat bot telegram menggunakan golang, penggunaan bot saat ini sangat melaju pesat berfungsi untuk menghandle user secara 24jam, bot yanh sering digunakan yaitu telegram karena di telegram rule nya tidak terbatas berbeda dengan tetangga sebelah jika kita broadcast message atau spam message dalam jumlah banyak akan di banned hehehe.
Dalam penggunaan bot telegram ini biasanya ada dua cara sih yang pertama menggunakan library existing yang support untuk bahasa pemrograman kita, yang kedua custom buat sendiri mengambil api yang tersedia di telegramnya.
Disini saya mencontohkan membuat yang custom ya di mulai dari awal untuk dokumentasi lengkapnya teman-teman bisa mengunjungi situs nya langsung di
https://core.telegram.org/.
Hal yang perlu disiapkan
Pertama pastikan teman-teman sudah menginstall aplikasi telegram nya di smartphone teman-teman atau bisa menggunakan telegram web.
Setup bot telegram
Masuk ke telegram ke menu pencarian lalu cari BotFather
|
BotFather
|
Setelah BotFather ketemu klik dan typing /start dan klik send untuk mengetaui apa aja sih list command-command yang tersedia
|
Command /start |
Lalu kita akan membuat bot dengan menggunakan perintah /newbot lalu klik send seperti pada gambar di bawah ini
|
Command /newbot
|
Setelah itu kita buat nama bot dengan nama contoh example
catatan : yang perlu di perhatikan ketika kita membuat nama bot akhiran katanya harus mengunakan nama_bot contoh : example_bot
Ketika berhasil membuat bot nya BotFather akan membalas dan memberikan token dari bot yang telah kita buat tadi
|
Token bot
|
Sampai disini teman teman sudah berhasil membuat bot cari di pencarian telegram nama bot teman-teman tadi ketika kita chat disitu si bot yang kita buat belum merespon apapun karena kita belum inisiasikan si bot itu bisa melakukan apa saja ketika user mengetik perintah.
Let's coding with golang
Disini saya akan membuat aplikasi sederhananya menggunakan golang, sebenarnya lebih mudah menggunakan nodejs sih dikarenakan banyak library nya ada telegraf atau node-telegram-api kenapa menggunakan golang karena ini sebagai latihan aja dan memperdalam ilmu di golang hehehe.
Inisiasi projek
Buat sebuah folder baru dengan nama bebas atau bisa mengikuti contoh nama go-bot-telegram, setelah itu ketikan perintah berikut di terminal
go mod init github.com/firmanJS/go-bot-telegram
Untuk nama mod atau module disesuaikan aja dengan nama github teman-teman sih biar nanti kedepan nya akan menggunakan module ini akan enak. Selanjutnya buat file dengan nama server.go dan struktur projek kita nanti kurang lebih akan seperti ini
|
Struktur Aplikasi
|
package main
import (
"log"
"net/http"
"github.com/firmanJS/go-bot-telegram/utils"
)
func main() {
webhook := utils.WebHookHandler
err := http.ListenAndServe(":8080", http.HandlerFunc(webhook))
if err != nil {
log.Fatal(err)
return
}
}
Lalu buat file dengan nama responseBot.go di folder models dengan nama package models. Disini kita akan membuat struct untuk ambil response dari telegram API.
package models
type WebHookReqBody struct {
Message struct {
Message_id int `json:message_id`
From struct {
Username string `json:"username"`
Id int `json:"Id"`
} `json:"from"`
Text string `json:"text"`
Chat struct {
ID int `json:"id"`
} `json:"chat"`
} `json:"message"`
}
type SendMessageReqBody struct {
ChatID int `json:"chat_id"`
Text string `json:"text"`
}
Lalu buat file dengan nama .env dibagian telegram token isi dengan token bot yang tadi kita buat.
TELEGRAM_TOKEN=# your telegram token
TELEGRAM_API=https://api.telegram.org/bot
File utils/config.go
Di dalam folder utils buat file dengan nama confg.go disini berisikan baris code untuk meload environment variable token bot dan api telegram.
package utils
import (
"fmt"
"os"
"github.com/joho/godotenv"
)
// Config func to get env value
func Config(key string) string {
// load .env file
err := godotenv.Load(".env")
if err != nil {
fmt.Print("Error loading .env file")
}
return os.Getenv(key)
}
File utils/webhook.go
Buat file dengan nama webhook.go file ini berguna untuk running api telegram di background aplikasi kita
package utils
import (
"encoding/json"
"fmt"
"log"
"net/http"
"strings"
"github.com/firmanJS/go-bot-telegram/models"
)
func WebHookHandler(rw http.ResponseWriter, req *http.Request) {
// Create our web hook request body type instance
body := &models.WebHookReqBody{}
// Decodes the incoming request into our cutom webhookreqbody type
if err := json.NewDecoder(req.Body).Decode(body); err != nil {
log.Printf("An error occured (webHookHandler)")
log.Panic(err)
return
}
fmt.Println("sending request")
action := strings.ToLower(body.Message.Text)
chatId := body.Message.Chat.ID
msgId := body.Message.Message_id
SendingReply(chatId, msgId, action)
}
func SendingReply(chatID int, msgId int, command string) error {
//get message in request command
msg := RequestCommand(command)
reqBody := &models.SendMessageReqBody{
ChatID: chatID,
Text: msg,
}
// Convert our custom type into json format
reqBytes, err := json.Marshal(reqBody)
if err != nil {
return err
}
RequestApiTelegram(reqBytes, chatID, msgId)
return err
}
File utils/command.go
Lanjut buat file dengan nama command.go di folder utils, nah disini lah tempat kita menerima request dari pesan user contoh disini saya akan mendefinisikan ketika user mengetik /joke ke bot telegram kita akan mendapatkan message seperti pada code di bawah ini.
package utils
func RequestCommand(command string) (action string) {
if command == "/joke" {
action = "imam ganteng"
} else {
action = "command not found"
}
return
}
File utils/botRequest.go
Buat file dengan nama botRequest.go file ini berguna untuk merequest ke telegram API menggunakan url sendMessage?chat_id=&reply_to_message_id= dengan method post dokumetnasi lengakpnya di liat aja di
https://core.telegram.org/methods
package utils
import (
"bytes"
"errors"
"fmt"
"net/http"
)
func RequestApiTelegram(reqBytes []byte, chatID int, msgId int) error {
// Make a request to send our message using the POST method to the telegram bot API
var API = Config("TELEGRAM_API")
var TOKEN = Config("TELEGRAM_TOKEN")
oriApi := API + TOKEN + "/" + "sendMessage?chat_id="
concat := fmt.Sprintf("%s%d", oriApi, chatID)
// reply message
apiUrls := concat + "&reply_to_message_id="
concatedApi := fmt.Sprintf("%s%d", apiUrls, msgId)
// fmt.Println(concatedApi)
resp, err := http.Post(
concatedApi,
"application/json",
bytes.NewBuffer(reqBytes),
)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return errors.New("unexpected status" + resp.Status)
}
return err
}
Menjalankan webhook
Setelah semua code sudah siap lanjut kita akan membuat sebuah webhook untuk merunning api bot kita di local disini saya menggunakan tools http://localhost.run/ . Buka terminal lalu ketikan code seperti dibawah ini
Perlu diperhatikan di bagian localhost:8080 itu samakan dengan port aplikasi kita disini saya menggunakan port 8080 di golangnya. Jika terjadi error ketika melakukan ssh disitu teman-teman berarti belum generate ssh key nya disitu teman-teman akan diasi link instruksi untuk mengaktifkan nya ikuti saja langkah-langkahnya atau klik url ini https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent.
ssh -R 80:localhost:8080 ssh.localhost.run
Setelah melakukan ssh dan mendapatkan sebuah url contoh seperti pada gambar di bawah ini
|
ssh tunnel |
Setelah berhasil di buat lalu buka terminal tab baru dan ketikan perintah seperti ini curl -F "url=your-tunnel-localhost.run" https://api.telegram.org/botYOUR_BOT_TOKEN_HERE/setWebhook
nanti akan mendapatkan response seperti ini
{"ok":true,"result":true,"description":"Webhook was set"}
Bagian url isi dengan url hasil generate ssh localhost.run tadi di bot token isi dengan bot token kita
Next running aplikasi go kita
go run server.go
masuk telegram dan ketikan sembarangan kepada bot kita dan ketikan /joke sesuai dengan tadi yang di definisikan bahwa bot hanya menerima perintah /joke selain itu akan dianggap notfound
|
Bot Response
|
Okay mungkin segitu yang bisa aku share tentang membuat bot telegram dengan golang source code lengkap ada disini
1 Komentar
Sangat membantu thanks
BalasHapus