命令记不住

登陆

基于图灵 API 一个简单的聊天机器人

基于图灵API一个简单的聊天机器人

从命令行中读取用户输入,然后调用远程聊天机器人的API进行分析,使用API中返回的结果反馈给用户,图灵机器人官网

package main

// 引入相关依赖
import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"math/rand"
	"net/http"
	"time"
)

// HelloGo.go
// 基于图灵API一个简单的聊天机器人

// 请求体结构体
type requestBody struct {
	Key    string `json:"key"`
	Info   string `json:"info"`
	UserId string `json:"userid"`
}

// 结果体结构体
type responseBody struct {
	Code int      `json:"code"`
	Text string   `json:"text"`
	List []string `json:"list"`
	Url  string   `json:"url"`
}

// 请求机器人
func process(inputChan <-chan string, userid string) {
	for {
		// 从通道中接受输入
		input := <-inputChan
		if input == "EOF" {
			break
		}
		// 构建请求体
		reqData := &requestBody{
			Key:    "792bcf45156d488c92e9d11da494b085",
			Info:   input,
			UserId: userid,
		}
		// 转义为json
		byteData, _ := json.Marshal(&reqData)
		// 请求聊天机器人接口
		req, err := http.NewRequest("POST",
			"http://www.tuling123.com/openapi/api",
			bytes.NewReader(byteData))

		req.Header.Set("Content-Type", "application/json;charset=UTF-8")

		client := http.Client{
			Timeout: 2 * time.Second,
		}

		resp, err := client.Do(req)

		if err != nil {
			fmt.Println("Network Error!")
			fmt.Println(err)
		} else {
			// 将结果从json中解析并输出到命令行
			body, _ := ioutil.ReadAll(resp.Body)
			var respData responseBody
			json.Unmarshal(body, &respData)
			fmt.Println("AI: " + respData.Text)

		}
		if resp != nil {
			resp.Body.Close()
		}
	}
}

func main() {

	var input string
	fmt.Println("Enter 'EOF' to shut down: ")
	// 创建通道
	channel := make(chan string)
	// main结束时关闭通道
	defer close(channel)
	// 启动goroutine运行机器人回答线程
	go process(channel, string(rand.Int63()))

	for {
		// 从命令行中读取输入
		fmt.Scanf("%s", &input)
		// 将输入放到通道中
		channel <- input
		// 结束程序
		if input == "EOF" {
			fmt.Println("Bye!")
			break
		}

	}

}