Membuat Bot Telegram Dengan Golang

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.

Sebelum memulai diharapkan teman-teman sudah paham basic golang terutama dalam hal go module https://blog.golang.org/migrating-to-go-modules  karena contoh aplikasinya akan menggunakan go module.


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

Posting Komentar

1 Komentar