Golang实现轻量级无依赖Telegram机器人

Golang实现轻量级无依赖Telegram机器人 你好,

我正在为一位客户测试一款用于远程数据监测的原型单板计算机。由于客户无法提供用于远程访问的静态IP,我使用Go语言准备了一个简单、无依赖、轻量级的Telegram机器人,以便在Telegram中查看我们的应用程序日志。

GitHub GitHub

Avatar

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环境下的远程监控需求。代码简洁高效,适合嵌入式设备或资源受限环境使用。

回到顶部