[go] 如何在VDS上部署Telegram机器人(Golang实现)

[go] 如何在VDS上部署Telegram机器人(Golang实现) 如何在VDS服务器(Ubuntu系统)上部署Telegram机器人(Go语言)?我遇到了错误(需要帮助)… 出现错误(dial tcp…),但在我的Mac+VPN环境下运行正常…如何正确部署我的机器人?

// 代码示例请在此处添加
9 回复

我自己编辑了IP地址…

更多关于[go] 如何在VDS上部署Telegram机器人(Golang实现)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


那么,在你和目标地址之间存在某种数据包过滤器。

你真是个天才!)) 简单的方法更换托管 😊 感谢各位,我更换了托管,现在一切运行正常

不,Telegram在俄罗斯被封锁了,我不知道如何在VDS上部署Telegram机器人(

嗯,如果您的服务器位于俄罗斯,您需要先通过VPN连接到俄罗斯境外。不过我不确定这样做是否合法。如果您的服务器位于俄罗斯境外,应该可以直接使用,前提是没有其他网络问题。

该IP地址以330结尾,这显然是无效的。

我的DNS查询显示,api.telegram.org的IP地址是149.154.167.220,所以或许可以从那里开始排查。 请检查/etc/resolv.conf文件查看您的域名服务器配置。

ext:

在VDS服务器上

你所说的"VDS"服务器是什么意思?

ext:

我遇到了错误(需要帮助)… 错误(dial tcp…)

有很多以"dial TCP"或类似内容开头的错误,你能说得更明确一些吗?

NobbZ:

你所说的"vds"服务器是指什么?

虚拟专用服务器,

bot, err := tgbotapi.NewBotAPI("mytoken")
if err != nil {
	log.Panic(err)
}

错误:

2019/04/21 20:07:42 Post https://api.telegram.org/mytoken/getUpdates: dial tcp 149.124.167.330:443: connect: connection refused

在VDS上部署Go语言实现的Telegram机器人时,dial tcp错误通常与网络连接、防火墙或代理设置有关。以下是一个完整的部署方案和错误排查步骤:

1. 基础部署代码示例

package main

import (
    "log"
    "net/http"
    "os"

    tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func main() {
    bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_BOT_TOKEN"))
    if err != nil {
        log.Panic("Bot API初始化失败:", err)
    }

    bot.Debug = true
    log.Printf("已授权账号: %s", bot.Self.UserName)

    u := tgbotapi.NewUpdate(0)
    u.Timeout = 60

    updates := bot.GetUpdatesChan(u)

    for update := range updates {
        if update.Message != nil {
            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

            if _, err := bot.Send(msg); err != nil {
                log.Printf("发送消息失败: %v", err)
            }
        }
    }
}

2. 系统配置和网络排查

# 检查网络连通性
curl -I https://api.telegram.org
nc -vz api.telegram.org 443

# 检查系统代理设置
env | grep -i proxy

# 检查防火墙规则
sudo ufw status
sudo iptables -L

# 必要时的防火墙开放
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

3. 使用HTTP客户端自定义配置

package main

import (
    "net"
    "net/http"
    "time"
    
    tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
)

func createCustomClient() *http.Client {
    return &http.Client{
        Timeout: time.Second * 30,
        Transport: &http.Transport{
            DialContext: (&net.Dialer{
                Timeout:   30 * time.Second,
                KeepAlive: 30 * time.Second,
            }).DialContext,
            TLSHandshakeTimeout: 10 * time.Second,
        },
    }
}

func main() {
    client := createCustomClient()
    bot, err := tgbotapi.NewBotAPIWithClient(
        os.Getenv("TELEGRAM_BOT_TOKEN"), 
        tgbotapi.APIEndpoint, 
        client,
    )
    if err != nil {
        log.Panic("Bot创建失败:", err)
    }
    // ... 其余代码同上
}

4. 完整的部署脚本

#!/bin/bash
# deploy_bot.sh

# 设置环境变量
export TELEGRAM_BOT_TOKEN="your_bot_token_here"

# 更新系统并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y git curl

# 安装Go
wget https://golang.org/dl/go1.19.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profile
source ~/.profile

# 部署应用
git clone your-bot-repo.git
cd your-bot-repo
go mod tidy
go build -o telegram-bot

# 使用systemd运行服务
sudo tee /etc/systemd/system/telegram-bot.service > /dev/null <<EOF
[Unit]
Description=Telegram Bot Service
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/your-bot-repo
Environment=TELEGRAM_BOT_TOKEN=your_bot_token_here
ExecStart=/home/ubuntu/your-bot-repo/telegram-bot
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable telegram-bot
sudo systemctl start telegram-bot

5. 连接测试代码

// connectivity_test.go
package main

import (
    "net"
    "testing"
    "time"
)

func TestTelegramAPIConnection(t *testing.T) {
    timeout := 10 * time.Second
    conn, err := net.DialTimeout("tcp", "api.telegram.org:443", timeout)
    if err != nil {
        t.Fatalf("连接Telegram API失败: %v", err)
    }
    defer conn.Close()
    t.Log("Telegram API连接测试通过")
}

运行测试:

go test -v connectivity_test.go

关键排查点:

  1. 确保VDS的DNS解析正常:cat /etc/resolv.conf
  2. 检查VPS供应商的网络策略(某些供应商可能限制出站连接)
  3. 验证时区设置:timedatectl status
  4. 使用strace跟踪系统调用:strace -f -e network ./your-bot

按照以上步骤部署和排查,应该能解决dial tcp连接问题。如果问题持续存在,需要检查VPS供应商的具体网络限制政策。

回到顶部