- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
程式語言:Go
官方 API
telegram-bot-api GitHub
功能:Telegram Bot,可透過此介面實現資料的查詢與匯集
Webhook
使用 ngrok 測試,並設定 setWebhook
ngrok 只適用在測試,仍需架設伺服器較為穩定,例:GAE、Heroku ...等
Telegram.Bot.申請及Channel使用方式
從零開始的 Telegram Bot
Create a Telegram EchoBot
- Package:github.com/go-telegram-bot-api/telegram-bot-api
官方 API
telegram-bot-api GitHub
功能:Telegram Bot,可透過此介面實現資料的查詢與匯集
申請流程
- 私訊 @BotFather 並輸入 /newbot
- 輸入 bot 顯示的名稱(後續還可更改)、bot 的 username (必須為 bot 結尾)
- 得到 Token (例:12345:ABC_d-6)
- 私訊剛建立的 bot:@xxxBot
API Request
- 格式
- https://api.telegram.org/bot<Token>/<Method Name>
- 例如
- 得到機器人資訊
- https://api.telegram.org/bot12345:ABC_d-6/getMe
- 得到接收的訊息
- https://api.telegram.org/bot12345:ABC_d-6/getUpdates
- 支援 HTTPS GET 及 POST,四種方式
- URL query string
- https://api.telegram.org/bot12345:ABC_d-6/sendMessage?chat_id=109780439&text=Hello+World
- application/json
- application/x-www-form-urlencoded
- 無法上傳檔案
- multipart/form-data
- 用來上傳檔案
- Response
- JSON 格式
- 成功
- ok = True
- result = 回覆內容
- 失敗
- ok = False
- error_code
- description = 錯誤描述
- Method
- 無視大小寫
- getMe 等同 GeTmE
- 必須使用 UTF-8 編碼
- 輔助工具
- APP Telegram 機器人
- 實驗 method
- @RawDataBot
- 回覆原始格式
用戶聊天訊息
- 保存時間
- 只有 24 小時
- 兩種獲得方式 ,兩者無法並行使用
- 設定 Webhook
- 有新訊息時,Telegram 將會主動告知
- 需要 HTTPS (TLS 1.0) 伺服器
並且將埠開在 443, 8443, 80, 8080 其一 (就算 port 80 也要求 TLS) - setWebhook 設定伺服器
- https://api.telegram.org/bot<token>/setWebhook?url=<server>
- 留白表示刪除
- https://api.telegram.org/bot<token>/setWebhook?url=
- getWebhookInfo 得知設定
- https://api.telegram.org/bot<token>/getWebhookInfo
- deleteWebhook 刪除設定
- https://api.telegram.org/bot<token>/deleteWebhook
- 主動詢問
- getUpdates 請求,將會回傳一個 JSON 陣列
- https://api.telegram.org/bot<token>/getUpdates
- 接收模式
- 隱私模式 Privacy Mode (預設)
- 由 / 開頭的指令
- 對機器人 Reply 的訊息
- 系統訊息 (e.g., 新成員)
- 自己是管理員的頻道
- 關閉可收到全部訊息
- 私訊 @BotFather
- 輸入 /setprivacy 指令
- 選擇 Bot
- 點擊 Disable
程式碼
不同傳送訊息的方法,需設定 token & chat_id
- package main
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "net/url"
- )
- type APIResponse struct {
- Ok bool `json:"ok"`
- Result json.RawMessage `json:"result"`
- ErrorCode int `json:"error_code"`
- Description string `json:"description"`
- }
- type TeleBot struct {
- token string
- }
- const (
- apiURL = "https://api.telegram.org/bot%s/%s"
- token = "your token"
- )
- var (
- bot = TeleBot{token}
- // 執行 sendMessage API
- paras = map[string]string{
- "chat_id": "your chatID",
- "text": "",
- }
- )
- // get 方法
- func (t *TeleBot) get(method string, paras map[string]string) ([]byte, error) {
- paras["text"] = "get"
- // 建立 request
- urlrequest := fmt.Sprintf(apiURL, t.token, method)
- req, err := http.NewRequest("GET", urlrequest, nil)
- if err != nil {
- return nil, err
- }
- // 加入參數
- q := req.URL.Query()
- for key, value := range paras {
- q.Add(key, value)
- }
- req.URL.RawQuery = q.Encode()
- fmt.Println("Get", req.URL.String())
- // 執行 request
- rsp, err := http.DefaultClient.Do(req)
- if err != nil {
- return nil, err
- }
- defer rsp.Body.Close()
- // 讀取內容
- data, err := ioutil.ReadAll(rsp.Body)
- if err != nil {
- return nil, err
- }
- return data, err
- }
- // post x-www-form-urlencoded 方法
- func (t *TeleBot) postXW(method string, paras map[string]string) ([]byte, error) {
- paras["text"] = "post x-www-form-urlencoded"
- // 建立 request
- urlrequest := fmt.Sprintf(apiURL, t.token, method)
- fmt.Println("Post", urlrequest)
- // 加入參數
- payload := url.Values{}
- for key, value := range paras {
- payload.Add(key, value)
- }
- // 執行 request
- rsp, err := http.PostForm(urlrequest, payload)
- if err != nil {
- return nil, err
- }
- defer rsp.Body.Close()
- // 讀取內容
- data, err := ioutil.ReadAll(rsp.Body)
- if err != nil {
- return nil, err
- }
- return data, err
- }
- // post json方法
- func (t *TeleBot) postJSON(method string, paras map[string]string) ([]byte, error) {
- paras["text"] = "post json"
- // 建立 request
- urlrequest := fmt.Sprintf(apiURL, t.token, method)
- fmt.Println("Post", urlrequest)
- // 建立 json
- payload, err := json.Marshal(paras)
- if err != nil {
- return nil, err
- }
- // 執行 request
- rsp, err := http.Post(urlrequest, "application/json; charset=utf-8", bytes.NewBuffer(payload))
- if err != nil {
- return nil, err
- }
- defer rsp.Body.Close()
- // 讀取內容
- data, err := ioutil.ReadAll(rsp.Body)
- if err != nil {
- return nil, err
- }
- return data, err
- }
- func (t *TeleBot) decodeJSON(data []byte, container interface{}) error {
- err := json.Unmarshal(data, container)
- if err != nil {
- return err
- }
- return nil
- }
- func showResponse(data []byte) {
- // 解析 response
- var apiResponse APIResponse
- err := bot.decodeJSON(data, &apiResponse)
- if err != nil {
- panic(err)
- }
- fmt.Printf("OK:%v\n", apiResponse.Ok)
- }
- func sendMessage_byGet() {
- data, err := bot.get("sendMessage", paras)
- if err != nil {
- fmt.Println(err)
- return
- }
- showResponse(data)
- }
- func sendMessage_byPostXW() {
- data, err := bot.postXW("sendMessage", paras)
- if err != nil {
- fmt.Println(err)
- return
- }
- showResponse(data)
- }
- func sendMessage_byPostJSON() {
- data, err := bot.postJSON("sendMessage", paras)
- if err != nil {
- fmt.Println(err)
- return
- }
- showResponse(data)
- }
- func main() {
- sendMessage_byGet()
- sendMessage_byPostJSON()
- sendMessage_byPostXW()
- }
直接使用套件 tgbotapi,需設定 token
功能:回覆同樣的訊息
功能:回覆同樣的訊息
- package main
- import (
- "log"
- "github.com/go-telegram-bot-api/telegram-bot-api"
- )
- func main() {
- bot, err := tgbotapi.NewBotAPI("your token")
- if err != nil {
- log.Panic(err)
- }
- bot.Debug = true
- log.Printf("Authorized on account %s", bot.Self.UserName)
- u := tgbotapi.NewUpdate(0)
- u.Timeout = 60
- updates, err := bot.GetUpdatesChan(u)
- for update := range updates {
- if update.Message == nil {
- continue
- }
- log.Printf("[%s] %s", update.Message.From.UserName, update.Message.Text)
- msg := tgbotapi.NewMessage(update.Message.Chat.ID, update.Message.Text)
- msg.ReplyToMessageID = update.Message.MessageID
- bot.Send(msg)
- }
- }
Webhook
使用 ngrok 測試,並設定 setWebhook
ngrok 只適用在測試,仍需架設伺服器較為穩定,例:GAE、Heroku ...等
ngrok http 5000
https://api.telegram.org/bot<token>setWebhook?url=<ngrok url>
功能:印出收到的訊息
- package main
- import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "net/http"
- )
- type Message struct {
- MessageID int `json:"message_id"`
- Date int `json:"date"`
- Text string `json:"text"` // optional
- }
- type Update struct {
- UpdateID int `json:"update_id"`
- Message *Message `json:"message"`
- }
- func main() {
- http.HandleFunc("/", fooHandler)
- log.Fatal(http.ListenAndServe(":5000", nil))
- }
- func fooHandler(w http.ResponseWriter, r *http.Request) {
- var update Update
- data, _ := ioutil.ReadAll(r.Body)
- fmt.Println(string(data))
- json.Unmarshal(data, &update)
- fmt.Printf("%#v\n", update)
- fmt.Printf("%#v\n", update.Message)
- }
直接使用套件 tgbotapi 印出收到的訊息,需設定 token 跟 接收網址
- package main
- import (
- "log"
- "net/http"
- "github.com/go-telegram-bot-api/telegram-bot-api"
- )
- func main() {
- bot, err := tgbotapi.NewBotAPI("your token")
- if err != nil {
- log.Fatal(err)
- }
- bot.Debug = true
- log.Printf("Authorized on account %s", bot.Self.UserName)
- _, err = bot.SetWebhook(tgbotapi.NewWebhookWithCert(<ngrok url>, nil))
- if err != nil {
- log.Fatal(err)
- }
- info, err := bot.GetWebhookInfo()
- if err != nil {
- log.Fatal(err)
- }
- if info.LastErrorDate != 0 {
- log.Printf("[Telegram callback failed]%s", info.LastErrorMessage)
- }
- updates := bot.ListenForWebhook("/")
- go http.ListenAndServe(":5000", nil)
- for update := range updates {
- log.Printf("%+v\n", update)
- }
- }
參考
python-telegram-botTelegram.Bot.申請及Channel使用方式
從零開始的 Telegram Bot
Create a Telegram EchoBot
留言
張貼留言