// telegram — 透過 Telegram Bot 發送訊息 // 透過 host function 呼叫 Telegram Bot API // //go:build tinygo package main import ( "encoding/json" "io" "os" "unsafe" ) //go:wasmimport u6u http_request func hostHttpRequest( urlPtr uintptr, urlLen uint32, methodPtr uintptr, methodLen uint32, headersPtr uintptr, headersLen uint32, bodyPtr uintptr, bodyLen uint32, outPtr uintptr, outLenPtr uintptr, ) uint32 type Input struct { ChatID string `json:"chat_id"` Text string `json:"text"` BotToken string `json:"bot_token"` } func main() { raw, err := io.ReadAll(os.Stdin) if err != nil { writeError("failed to read stdin: " + err.Error()) return } var input Input if err := json.Unmarshal(raw, &input); err != nil { writeError("invalid input JSON: " + err.Error()) return } if input.ChatID == "" { writeError("chat_id 必填") return } if input.Text == "" { writeError("text 必填") return } if input.BotToken == "" { writeError("bot_token 必填") return } apiURL := "https://api.telegram.org/bot" + input.BotToken + "/sendMessage" method := "POST" headers := map[string]string{ "Content-Type": "application/json", } headersJSON, _ := json.Marshal(headers) bodyData, _ := json.Marshal(map[string]string{ "chat_id": input.ChatID, "text": input.Text, }) urlBytes := []byte(apiURL) methodBytes := []byte(method) bodyBytes := bodyData outBuf := make([]byte, 4096) var outLen uint32 result := hostHttpRequest( uintptr(unsafe.Pointer(&urlBytes[0])), uint32(len(urlBytes)), uintptr(unsafe.Pointer(&methodBytes[0])), uint32(len(methodBytes)), uintptr(unsafe.Pointer(&headersJSON[0])), uint32(len(headersJSON)), uintptr(unsafe.Pointer(&bodyBytes[0])), uint32(len(bodyBytes)), uintptr(unsafe.Pointer(&outBuf[0])), uintptr(unsafe.Pointer(&outLen)), ) if result != 0 { writeError("Telegram API 呼叫失敗") return } responseStr := string(outBuf[:outLen]) var responseData map[string]interface{} if err := json.Unmarshal([]byte(responseStr), &responseData); err != nil { responseData = map[string]interface{}{"raw": responseStr} } ok, _ := responseData["ok"].(bool) out, _ := json.Marshal(map[string]interface{}{ "success": true, "data": map[string]interface{}{"ok": ok}, }) os.Stdout.Write(out) } func writeError(msg string) { out, _ := json.Marshal(map[string]interface{}{"success": false, "error": msg}) os.Stdout.Write(out) }