WeChat Dialogue OpenPlatform実際の戦闘-コールバック関数とサービスインターフェイス呼び出しの詳細な説明

前書き

私のこの記事では:

WeChat Dialogue Open Platform Practical Combat——多くのスキルを備えた無料のエンタープライズインテリジェントカスタマーサービスロボットの構築

会話チャットボットを構築する詳細な手順を紹介しましたが、APIを呼び出す方法は紹介しませんでした(方法2を参照)。この記事は補足説明として役立ちます。
ここに画像の説明を挿入
WeChatが積極的にAPIを呼び出す方法も2つあります。

  1. 折り返し電話
  2. サービスインターフェース呼び出し

コールバック関数は一般的に通知として使用され、サービスインターフェースは天気や住宅価格などの動的な回答(回答の一部がリアルタイムで変化する)の表示を実現できます。

サービスインターフェース呼び出し

シーン

中古住宅のリアルタイムの平均価格を照会する場合(最初に住宅価格を入力し、次に照会する都市を入力します):
ここに画像の説明を挿入
サービスインターフェイスを呼び出す方法を使用できます。

ステップ

高度なスキルを作成する

  1. [高度なスキル]をクリックします。
    ここに画像の説明を挿入

  2. 名前を入力したら、[保存]をクリックします。ここに画像の説明を挿入

  3. BUGが表示されないようにするには、[戻る]をクリックします。
    ここに画像の説明を挿入

意図を高める(Q&A)

  1. [高度なスキルから編集]をクリックします。
    ここに画像の説明を挿入
  2. [新しいインテント]をクリックし、「価格に関するお問い合わせ」という質問を入力して、[OK]をクリックします。
    ここに画像の説明を挿入

補足ユーザーの質問

「住宅価格」と「住宅価格のお問い合わせ」の2つの質問を追加します。
ここに画像の説明を挿入

セマンティックスロット設定

ユーザーが「価格」を入力すると、ロボットは「そこで価格を確認する」ように要求します。このとき、ユーザーは「上海」を入力すると、「上海」がセマンティックスロットに保存されてさらに処理されます。

セマンティックスロットは実際にはコレクションです。たとえば、都市レベルの価格クエリをサポートするためにここにあります。組み込みのマイクロレターの都市セマンティックスロットを使用して、ユーザーが「北京」、「深セン」、「杭州」と入力できるようにすることができます。 、などを一致させることができます(つまり、ユーザーが入力した質問は、質問と正しく一致するためにこのセットに含まれている必要があります)。

  1. 新しいセマンティックスロット、都市を選択
    ここに画像の説明を挿入
  2. フォローアップ文を追加
    ここに画像の説明を挿入
  3. フォローアップを有効にするここに画像の説明を挿入

サービスインターフェイスの構成

  1. サービスインターフェイス呼び出しの追加
    ここに画像の説明を挿入
    2.カスタムインターフェイスをクリックして、カスタムインターフェイスを作成します
    ここに画像の説明を挿入
  2. インターフェイスを構成します(パブリックネットワークアクセスに注意してください)
    ここに画像の説明を挿入
  3. 今すぐインターフェースを選択してください
    ここに画像の説明を挿入
  4. [インターフェースの構成]をクリックします
    ここに画像の説明を挿入
  5. 入力セマンティックスロットをバインドすると、出力は構成なしで自動的に生成されます(このようにして、ユーザーが入力した都市は都市フィールドを介してAPIに渡され、出力する価格は住宅価格セマンティックスロットにバインドされます)
    ここに画像の説明を挿入
  6. インターフェイスをテストし(data_listと配列の下に配置する必要があります!!!これは非常に重要です)、[OK]をクリックします。
    ここに画像の説明を挿入
  7. もう1つの出力セマンティックスロットが見つかりました
    ここに画像の説明を挿入

回答を構成する

ここに画像の説明を挿入

最後に、クリックして構成を保存し、ロボットを解放します。

インターフェースの準備

ここでは、golangを使用してコードを記述しました。

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
)

const kListenPort = 8099

func main() {
    
    
	// 服务接口方式测试
	// 官网文档:https://developers.weixin.qq.com/doc/aispeech/platform/di-san-fang-api-diao-yong.html
	// 输出格式:https://developers.weixin.qq.com/doc/aispeech/platform/3rdparty_api.html
	// 房价:https://hangzhou.anjuke.com/market/
	// GET 输入:city,输出:price
	http.HandleFunc("/house/price2", func(writer http.ResponseWriter, request *http.Request) {
    
    
		if request.Method != "GET" {
    
    
			log.Println("not support http post")
			return
		}

		city := request.URL.Query().Get("city")
		if city == "" {
    
    
			log.Println("invalid city")
			return
		}

		log.Println(fmt.Sprintf("/house/price2 city:%s", city))

		price := 52624
		switch city {
    
    
		case "北京":
			price = 57192
		case "深圳":
			price = 56569
		case "杭州":
			price = 28148
		}

		res := map[string]interface{
    
    }{
    
    
			"data_list": []interface{
    
    }{
    
    
				map[string]interface{
    
    }{
    
    
					"price": price,
				},
			},
			"err_code": 0,
			"err_msg":  "success",
		}
		data, err := json.Marshal(res)
		if err != nil {
    
    
			log.Println(err.Error())
			return
		}

		log.Println(fmt.Sprintf("/house/price2 response:%s", string(data)))

		_, err = writer.Write(data)
		if err != nil {
    
    
			log.Println(err.Error())
		}
	})

	log.Print("server start on :", kListenPort)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", kListenPort), nil))
}

コードは次のとおりです。

https://github.com/xmcy0011/MyWeChatRobot

  1. go1.13以降をインストールする必要があります
  2. gomodを有効にする必要があります

使用方法は次のとおりです(例としてCentOS 7、mac / windowsは似ています):

$ git clone https://github.com/xmcy0011/MyWeChatRobot
$ cd MyWeChatRobot
$ cd robot_srv
$ go mod tidy
$ go build
$ ./robot_srv

テスト

ロボットをクリックしてデバッグし、価格と都市を入力して、効果を確認します。
ここに画像の説明を挿入

折り返し電話

作成する

ここに画像の説明を挿入

インターフェイスを構成します

ここに画像の説明を挿入

APIコード

package main

import (
	"fmt"
	"github.com/bitly/go-simplejson"
	"io/ioutil"
	"log"
	"net/http"
)

const kListenPort = 8099

func main() {
    
    
	// 接口回调测试
	http.HandleFunc("/house/price", func(writer http.ResponseWriter, request *http.Request) {
    
    
		if request.Method != "POST" {
    
    
			_, _ = fmt.Fprintf(writer, "not support http get")
			return
		}
		if request.ContentLength > 10*1024*1024 {
    
    
			log.Printf("content length to large,> 10MB")
			return
		}

		body, err := ioutil.ReadAll(request.Body)
		if err != nil {
    
    
			log.Println(err.Error())
			return
		}
		root, err := simplejson.NewJson(body)
		if err != nil {
    
    
			log.Println(err.Error())
			return
		}

		nulValue := root.Get("nlu")
		answerValue, err := nulValue.Get("answer").String()
		if err != nil {
    
    
			log.Println(err.Error())
			return
		}

		nulValue.Set("answer", fmt.Sprintf("%s 再加工----------", answerValue))

		resData, err := nulValue.Encode()
		if err != nil {
    
    
			log.Println(err.Error())
			return
		}

		log.Printf("/house/price method:%s,header:%v,body:%s \n", request.Method, request.Header, string(body))

		_, err = writer.Write(resData)
		if err != nil {
    
    
			log.Println(err.Error())
		}
		//_, _ = fmt.Fprintf(writer, string(resData))
	})
	
	log.Print("server start on :", kListenPort)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", kListenPort), nil))
}

詳細については、公式文書を参照してください。

効果(問題)

ここに画像の説明を挿入
理由はわかりませんが、何も出力されません。

戻り値jsonは次の
入力です。

{
    
    
    "touser":"o9U-85owe0wsywkZibHBf8UBU5NQ",
    "nlu":{
    
    
        "ans_node_id":8405354,
        "ans_node_name":"测试",
        "answer":"{"callback":{"url":"http://106.14.172.35:8099/house/price"}}",
        "answer_open":1,
        "answer_type":"text",
        "article":"",
        "bid_stat":{
    
    
            "curr_time":"20201116-15:28:23",
            "err_msg":"",
            "latest_time":"20201116-15:28:23",
            "latest_valid":true,
            "up_ret":0
        },
        "confidence":1,
        "create_time":"1605512089886",
        "dialog_session_status":"COMPLETE",
        "dialog_status":"COMPLETE",
        "event":"",
        "from_user_name":"o9U-85owe0wsywkZibHBf8UBU5NQ",
        "intent_confirm_status":"",
        "list_options":false,
        "msg":[
            {
    
    
                "ans_node_id":8405354,
                "ans_node_name":"测试",
                "article":"",
                "confidence":1,
                "content":"{"callback":{"url":"http://106.14.172.35:8099/house/price"}}",
                "debug_info":"",
                "event":"",
                "list_options":false,
                "msg_type":"text",
                "opening":"",
                "request_id":32599,
                "resp_title":"房价回调",
                "scene_status":"s_Not_Started@",
                "session_id":"",
                "status":"GENERAL_FAQ",
                "take_options_only":false
            }
        ],
        "msg_id":"ac7bd7089003df1931c3de382371af4555c23e79",
        "opening":"",
        "request_id":32599,
        "ret":0,
        "scene_status":"s_Not_Started@",
        "session_id":"",
        "slot_info":[

        ],
        "slots_info":[

        ],
        "status":"GENERAL_FAQ",
        "take_options_only":false,
        "title":"房价回调",
        "to_user_name":"37471"
    },
    "query":"房价回调",
    "authtoken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b3VzZXIiOiJvOVUtODVvd2Uwd3N5d2taaWJIQmY4VUJVNU5RIiwiYXBwaWQiOiJGaTE2aG16QWdnUHFxSmYiLCJ0b2tlbiI6IkRERHlNakNYcVpiakRMS0ZQU1FuT29uOFdtVmtXSSIsImlhdCI6MTYwNTUxMjA5MH0._Vk7OWPYGWQQs8ywfmv_AEnLXIV8lPcEklCPy8dqTSg"
}

出力:

{
    
    
    "ans_node_name": "小微闲聊",
    "answer": "你好呀! 再加工----------",
    "answer_type": "text",
    "bid_stat": {
    
    
        "curr_time": "20190515-18:07:37",
        "err_msg": "微信通用意图.肯定[email protected]'s element.slot slot does not exist!",
        "latest_time": "20190523-16:06:33",
        "latest_valid": false,
        "up_ret": -1
    },
    "from_user_name": "o9U-85tEZToQxIF8ht6o-KkagxO0",
    "msg": [
        {
    
    
            "ans_node_id": 6666,
            "ans_node_name": "小微闲聊",
            "confidence": 1,
            "content": "你好呀!",
            "debug_info": "",
            "msg_type": "text",
            "resp_title": "小薇兄你好",
            "status": "FAQ"
        }
    ],
    "status": "FAQ",
    "title": "小薇兄你好",
    "to_user_name": "xalsjfasf1ljasjdf1"
}

オン

純粋なGolangで書かれた独自のオープンソースIMをお勧めします。

CoffeeChat:
https //github.com/xmcy0011/CoffeeChat
オープンソースim with server(go)and client(flutter + swift)

サーバー(go)とクライアント(flutter + swift)、シングルチャットとロボット(micro、Turing、Sizhi)のチャット機能を含む、TeamTalkやGuazi IMなどの有名なプロジェクトが完了し、現在グループチャット機能が実行されています。開発された、より多くの注意を払うためにフラッターテクノロジーのgolangとクロスプラットフォーム開発に興味を持っているWelcomefriendsStar。

————————————————
著作権表示:この記事はCSDNブロガー「XuFei」のオリジナル記事であり、CC 4.0BY-SA著作権表示に準拠しています。元のソースを添付してくださいリンクとこれを再印刷します。ステートメント。
元のリンク:https://blog.csdn.net/xmcy001122/article/details/109720877

おすすめ

転載: blog.csdn.net/xmcy001122/article/details/109720877