使用go创建tgbot,并实现调用chatgpt的通用接口

可以使用go搭建一个api后端,用于转发chatgpt的结果,但同时也可以在该后端新建一个路由用于设置webhook
实际上,我的这个项目就是

  • post路由:https://your-website/post
  • webhook路由:https://your-website/tgbot/{your bot token}
    部署在paas平台,自带https

main

这是23/12月完成的,tgbotapi要使用v5,有很多结构体和函数都有变化,注意后续的tgbot官方的更新。
接下来说明一下实现过程,直接上main函数的代码:

func main() {
	var port = os.Getenv("PORT")

	// 设置 /post 路径的 HTTP 处理函数
	http.HandleFunc("/post", handlePost)

	// 启动 Web 服务器监听 port 端口
	go func() {
		err := http.ListenAndServe(":"+port, nil)
		if err != nil {
			log.Println("Error starting HTTP server:", err)
		}
		log.Println("HTTP server is running on port", port)
	}()

	//创建一个tgbot
	tgbot.CreateTgbot()
}

其中定义了两个函数,handlePost和CreateTgbot。
前者处理post请求,后者用于设置一个webhook,进而进行tgbot的通信。

handlePost

提取post中的msg字符串,调用chatgpt api,返回响应回答。
我使用了postform的方式发送post请求,故我再此使用了表单结构。

func handlePost(w http.ResponseWriter, r *http.Request) {
	if r.Method == http.MethodPost {
		// 获取表单数据
		err := r.ParseForm()
		if err != nil {
			http.Error(w, "Error parsing form data", http.StatusInternalServerError)
			return
		}
		// 读取请求体
		postmsg := r.Form.Get("usermsg")
		if postmsg != "" {
			log.Println("POST request,the usersmg:", postmsg)
		} else {
			http.Error(w, "Error:Don`t find the key:usersmg in the POST", http.StatusBadRequest)
		}
		// 调用ChatGPT API
		gptResponse, err := chatgpt.InvokeChatGPTAPI(postmsg)
		if err != nil {
			log.Printf("Error calling ChatGPT API: %v", err)
			gptResponse = "gpt调用失败了 错误信息:\n" + err.Error()
		}
		fmt.Fprintln(w, gptResponse)
	} else {
		http.Error(w, "Error: wrong HTTP method:"+r.Method+",required POST.", http.StatusMethodNotAllowed)
	}
}

CreateTgbot

这个函数来源于tgbot关于go的库的官方示例,我对其进行了必要的修改。
在设置webhook的过程中,不要设置监听端口,因为外层的main函数中已经在监听port端口了,这里只需要监听webhook就好了

func CreateTgbot() {
	// 初始化bot
	bot, err := tgbotapi.NewBotAPI(BOT_TOKEN)
	if err != nil {
		log.Fatal(err)
	}
	bot.Debug = true
	log.Printf("Authorized on account %s", bot.Self.UserName)
	//创建webhook,指向你的URL
	wh, _ := tgbotapi.NewWebhook(TG_WEBHOOK_URL + bot.Token)
	_, err = bot.Request(wh)
	if err != nil {
		log.Fatal(err)
	}
	//输出webhook信息,判断是否建立成功
	info, err := bot.GetWebhookInfo()
	if err != nil {
		log.Fatal(err)
	}
	if info.LastErrorDate != 0 {
		log.Printf("Telegram callback failed: %s", info.LastErrorMessage)
	}
	// 监听webhook是否有更新,更新存放到updates中
	// 此处的/tgbot/,是为了和URL匹配,URL:https://your-website/tgbot/
	updates := bot.ListenForWebhook("/tgbot/" + bot.Token)

	// 对监听到的updates遍历,并作出回应
	for update := range updates {
		log.Printf("get the message:%v", update.Message)
		if update.Message == nil {
			continue
		}
		//回复信息,定义你自己的消息处理函数
		HandleIncomingMessage(bot, update.Message)
	}
}

InvokeChatGPTAPI

使用了go-openai库,注意设置自己的必要变量,如:chatGPTAPIKey等

func InvokeChatGPTAPI(text string) (string, error) {
	config := openai.DefaultConfig(chatGPTAPIKey)
	config.BaseURL = chatGPTURL_broker

	client := openai.NewClientWithConfig(config)
	resp, err := client.CreateChatCompletion(
		context.Background(),
		openai.ChatCompletionRequest{
			Model: openai.GPT3Dot5Turbo,
			Messages: []openai.ChatCompletionMessage{
				{
					Role:    openai.ChatMessageRoleUser,
					Content: text,
				},
			},
		},
	)
	if err != nil {
		return "", err
	}

	return resp.Choices[0].Message.Content, err
}

目前我已经成功部署了,并且微信公众号和tg都可以正常返回结果,更多细节内容还在完善中,源码可以查看:Gobot-vio

你可能感兴趣的:(golang,chatgpt,开发语言)