如何使用Golang echo框架和电报机器人?

如何使用Golang echo框架和电报机器人?,go,telegram-bot,go-echo,Go,Telegram Bot,Go Echo,我想使用带有“echo框架”的“电报机器人”(当服务器启动时,echo和电报机器人一起工作)。我使用了下面的代码,但当我运行时,电报机器人没有启动 我的主要目标是: 主程序包 进口( “数据库/sql” “日志” “net/http” “字符串” tgbotapi“github.com/go电报机器人api/电报机器人api” “github.com/labstack/echo” _“github.com/mattn/go-sqlite3” ) func main(){ e:=echo.New(

我想使用带有“echo框架”的“电报机器人”(当服务器启动时,echo和电报机器人一起工作)。我使用了下面的代码,但当我运行时,电报机器人没有启动

我的主要目标是:

主程序包
进口(
“数据库/sql”
“日志”
“net/http”
“字符串”
tgbotapi“github.com/go电报机器人api/电报机器人api”
“github.com/labstack/echo”
_“github.com/mattn/go-sqlite3”
)
func main(){
e:=echo.New()
e、 GET(“/”,func(c echo.Context)错误{
返回c.String(http.StatusOK,“你好,世界!”)
})
_=e.开始(“:1323”)
db,err:=sql.Open(“sqlite3”,“/commission.db”)
如果错误!=零{
log.Fatal(错误)
}
延迟db.Close()
bot,err:=tgbotapi.NewBotAPI(“”)
如果错误!=零{
log.Fatal(错误)
}
bot.Debug=true
log.Printf(“在帐户%s上授权”,bot.Self.UserName)
u:=tgbotapi.NewUpdate(0)
u、 超时=60
更新,错误:=bot.getUpdateScan(u)
对于更新:=范围更新{
如果update.Message==nil{
持续
}
gp_msg:=tgbotapi.NewMessage(update.Message.Chat.ID,“Hi”)
bot.Send(gp\u msg)
}
}

问题在于,当您启动echo服务器时,代码不会再进一步

为了使用这两个线程,您需要将它们中的每一个都分离到不同的线程中,并停止程序以完成和停止所有操作

最简单的方法是分离web服务器和电报机器人并分别启动它们:

func StartEcho() { 
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    _ = e.Start(":1323")
}

func StartBot() {
    bot, err := tgbotapi.NewBotAPI("")
    if err != nil {
        log.Fatal(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
        }

        gp_msg := tgbotapi.NewMessage(update.Message.Chat.ID, "Hi")
        bot.Send(gp_msg)
    }
}
然后叫他们:

func main() {
    # Start the echo server in a separate thread
    go StartEcho()

    db, err := sql.Open("sqlite3", "./criticism.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    # Start the bot in a separate thread
    go StartBot()

    # To stop the program to finish and close
    select{}

    # You can also use https://golang.org/pkg/sync/#WaitGroup instead.
}
也可以只运行主线程中的最后一个线程:

func main() {
    # Start the echo server in a separate thread
    go StartEcho()

    db, err := sql.Open("sqlite3", "./criticism.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    # Start the bot
    StartBot()
}

但是如果最后一个停止了,那么整个程序和带有它的echo服务器也会停止。因此,您必须恢复恐慌,不允许恐慌停止。

这可能无法解决您的问题,但我注意到您正在使用echo lib v1.x,而最新版本是v4。您可能希望将要使用的版本号添加到echo导入路径中。
NewBotAPI
的参数必须是符合的有效电报API令牌。你给了一个空字符串。根据本文档,如果令牌无效,函数将死机。@chmike他删除了令牌,以便在此处发布代码。他的问题是它永远不会到达那个部分。@NavidZarepak因此问题不在电报机器人api中。OP没有说明程序在哪里以及如何失败。错误消息?如果没有这些信息,将无法提供太多帮助。@chmike You Can。您可以清楚地看到,进程在
\u=e.Start(“:1323”)
之后没有到达任何代码。问题是:“电报机器人没有启动。”。即使它可以到达代码(它不会),你关于令牌不存在的争论也不会解决任何问题,因为你知道为什么它不存在,即使你不知道,那么你应该问。如果没有任何错误信息,您无法提供帮助,那么请询问这些信息,这样他就可以告诉您,没有任何信息可以帮助您查看
\u=e.Start(“:1323”)
部分并了解实际问题。