- 取得連結
- 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
留言
張貼留言