Golang实现轻量级无依赖Telegram机器人
Golang实现轻量级无依赖Telegram机器人 你好,
我正在为一位客户测试一款用于远程数据监测的原型单板计算机。由于客户无法提供用于远程访问的静态IP,我使用Go语言准备了一个简单、无依赖、轻量级的Telegram机器人,以便在Telegram中查看我们的应用程序日志。
ermanimer/telegram_bot
Go Telegram Bot. 通过在GitHub上创建账户来为ermanimer/telegram_bot的开发做出贡献。
请审阅并提出意见,我从你们的反馈中学到了很多。
此致
更多关于Golang实现轻量级无依赖Telegram机器人的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang实现轻量级无依赖Telegram机器人的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个非常实用的轻量级Telegram机器人实现,代码结构清晰且无外部依赖。以下是关键代码片段的解析和改进建议:
核心实现分析
// 机器人配置结构体
type Config struct {
Token string
ChatID int64
}
// 消息发送函数
func (c Config) SendMessage(text string) error {
endpoint := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", c.Token)
body, err := json.Marshal(map[string]interface{}{
"chat_id": c.ChatID,
"text": text,
})
if err != nil {
return err
}
resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(body))
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
增强功能示例
1. 支持Markdown格式
func (c Config) SendMarkdownMessage(text string) error {
endpoint := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", c.Token)
body, err := json.Marshal(map[string]interface{}{
"chat_id": c.ChatID,
"text": text,
"parse_mode": "MarkdownV2",
})
if err != nil {
return err
}
resp, err := http.Post(endpoint, "application/json", bytes.NewBuffer(body))
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
2. 添加重试机制
func (c Config) SendMessageWithRetry(text string, maxRetries int) error {
var lastErr error
for i := 0; i < maxRetries; i++ {
if err := c.SendMessage(text); err == nil {
return nil
} else {
lastErr = err
time.Sleep(time.Second * time.Duration(i+1))
}
}
return fmt.Errorf("发送失败,重试%d次后仍错误: %v", maxRetries, lastErr)
}
3. 文件上传功能
func (c Config) SendFile(filePath, caption string) error {
endpoint := fmt.Sprintf("https://api.telegram.org/bot%s/sendDocument", c.Token)
file, err := os.Open(filePath)
if err != nil {
return err
}
defer file.Close()
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile("document", filepath.Base(filePath))
if err != nil {
return err
}
io.Copy(part, file)
writer.WriteField("chat_id", strconv.FormatInt(c.ChatID, 10))
writer.WriteField("caption", caption)
writer.Close()
req, err := http.NewRequest("POST", endpoint, body)
if err != nil {
return err
}
req.Header.Set("Content-Type", writer.FormDataContentType())
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
return nil
}
4. 日志监控集成示例
type LogMonitor struct {
bot Config
logFile string
}
func (lm *LogMonitor) MonitorAndSend(tailLines int) {
cmd := exec.Command("tail", "-f", "-n", strconv.Itoa(tailLines), lm.logFile)
stdout, _ := cmd.StdoutPipe()
cmd.Start()
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
line := scanner.Text()
if strings.Contains(line, "ERROR") || strings.Contains(line, "CRITICAL") {
lm.bot.SendMessage(fmt.Sprintf("⚠️ 发现错误日志:\n```\n%s\n```", line))
}
}
}
使用示例
func main() {
bot := telegram_bot.Config{
Token: "YOUR_BOT_TOKEN",
ChatID: YOUR_CHAT_ID,
}
// 发送简单消息
bot.SendMessage("系统启动完成")
// 发送带格式的消息
bot.SendMarkdownMessage("*系统状态*: ✅ 运行正常\n`CPU使用率`: 45%")
// 监控日志文件
monitor := LogMonitor{
bot: bot,
logFile: "/var/log/app.log",
}
go monitor.MonitorAndSend(10)
}
这个实现很好地解决了无静态IP环境下的远程监控需求。代码简洁高效,适合嵌入式设备或资源受限环境使用。

