C# 如何在c语言中使用dialogflow.ai中的webhook发送广播消息#

C# 如何在c语言中使用dialogflow.ai中的webhook发送广播消息#,c#,facebook-graph-api,bots,dialogflow-es,asp.net-webhooks,C#,Facebook Graph Api,Bots,Dialogflow Es,Asp.net Webhooks,我正在使用dialogflow(api.ai)和webhook在c#中使用visual studio创建一个机器人 我必须为所有请求订阅的用户创建广播消息选项 当用户调用intent subscribe时,我调用操作:subscribe.about我在哪里保存psid 代码如下: public ApiAiResponse Post([FromBody]JObject jsonRequest) { using (WebhookReceiverModelDataContex

我正在使用dialogflow(api.ai)和webhook在c#中使用visual studio创建一个机器人

我必须为所有请求订阅的用户创建广播消息选项

当用户调用intent subscribe时,我调用操作:subscribe.about我在哪里保存psid

代码如下:

 public ApiAiResponse Post([FromBody]JObject jsonRequest)
    {
        using (WebhookReceiverModelDataContext ctx = new 
      WebhookReceiverModelDataContext())
        {


            ApiAiRequest request = jsonRequest.ToObject<ApiAiRequest>();

            ApiAiResponse response = new ApiAiResponse();

            JObject jObject = 
            JObject.Parse(request.result.parameters.ToString());
         if ("subscribe.about".Equals(request.result.action.ToLower()))
            {

    using (WebhookReceiverModelDataContext cts = new 
       WebhookReceiverModelDataContext())
                {
                    string messageabout = request.result.resolvedQuery != null ? request.result.resolvedQuery : "";                  


                    speechLang = "You are subscribed";
                    source = "Broadcast";

                }

            }
public-apairesponse-Post([FromBody]JObject-jsonRequest)
{
使用(WebhookReceiverModelDataContext ctx=new)
WebhookReceiverModelDataContext())
{
apairequest request=jsonRequest.ToObject();
apairesponse response=新的apairesponse();
JObject JObject=
Parse(request.result.parameters.ToString());
if(“subscribe.about”.Equals(request.result.action.ToLower()))
{
使用(WebhookReceiverModelDataContext=new)
WebhookReceiverModelDataContext())
{
字符串messageabout=request.result.resolvedQuery!=null?request.result.resolvedQuery:“”;
speechLang=“您已订阅”;
source=“广播”;
}
}
我必须创建一个模块,在活动在线时向所有这些用户发送广播消息

我在一个表中存储了如下数据:Id、事件名称、事件日期

当:Event Date=now=>我必须向所有已订阅的用户发送消息

我开始使用主动消息,但它们似乎是使用botframework创建的。我只想使用webhook

我创建了一个控制器来在facebook上发送消息,但似乎不正常: 我打电话给这个控制器时收到了这样的信息:

<Error>
<Message>An error has occurred.</Message>
</Error>


     namespace WebhookReceiver.Controllers
     {
    public class WebhookController : ApiController
     {
    string pageToken = "xxxxxxx";
    string appSecret = "yyyyy";

    public HttpResponseMessage Get()
    {
        var querystrings = Request.GetQueryNameValuePairs().ToDictionary(x 
        => x.Key, x => x.Value);
         if (querystrings["hub.verify_token"] == "zzzzz")
        {
            return new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(querystrings["hub.challenge"], 
         Encoding.UTF8, "text/plain")
            };
        }
        return new HttpResponseMessage(HttpStatusCode.Unauthorized);
    }

    [HttpPost]
    public async Task<HttpResponseMessage> Post()
    {
        var signature = Request.Headers.GetValues("X-Hub- 
         Signature").FirstOrDefault().Replace("sha1=", "");
        var body = await Request.Content.ReadAsStringAsync();
        if (!VerifySignature(signature, body))
            return new HttpResponseMessage(HttpStatusCode.BadRequest);

        var value = JsonConvert.DeserializeObject<WebhookModel>(body);
        if (value._object != "page")
            return new HttpResponseMessage(HttpStatusCode.OK);

        foreach (var item in value.entry[0].messaging)
        {
            if (item.message == null && item.postback == null)
                continue;
            else
                await SendMessage(GetMessageTemplate(item.message.text, 
          item.sender.id));
        }

        return new HttpResponseMessage(HttpStatusCode.OK);
    }

    private bool VerifySignature(string signature, string body)
    {
        var hashString = new StringBuilder();
        using (var crypto = new HMACSHA1(Encoding.UTF8.GetBytes(appSecret)))
        {
            var hash = crypto.ComputeHash(Encoding.UTF8.GetBytes(body));
            foreach (var item in hash)
                hashString.Append(item.ToString("X2"));
        }

        return hashString.ToString().ToLower() == signature.ToLower();
    }

    /// <summary>
    /// get text message template
    /// </summary>
    /// <param name="text">text</param>
    /// <param name="sender">sender id</param>
    /// <returns>json</returns>
    private JObject GetMessageTemplate(string text, string sender)
    {
        return JObject.FromObject(new
        {
            recipient = new { id = sender },
            message = new { text = text }
        });
    }

    /// <summary>
    /// send message
    /// </summary>
    /// <param name="json">json</param>
    private async Task SendMessage(JObject json)
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Add(new 
     MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage res = await 
  client.PostAsync($"https://graph.facebook.com/v2.6/me/messages? 
     access_token={pageToken}", new StringContent(json.ToString(), 
       Encoding.UTF8, 
   "application/json"));
        }
    }
  }
 }

发生了一个错误。
命名空间WebhookReceiver.Controllers
{
公共类WebhookController:ApicController
{
字符串pageToken=“xxxxxxx”;
字符串appSecret=“yyyyy”;
公共HttpResponseMessage Get()
{
var querystrings=Request.GetQueryNameValuePairs().ToDictionary(x
=>x.键,x=>x.值);
如果(查询字符串[“集线器验证令牌”]=“zzzzz”)
{
返回新的HttpResponseMessage(HttpStatusCode.OK)
{
Content=新的StringContent(querystring[“hub.challenge”],
Encoding.UTF8,“文本/普通”)
};
}
返回新的HttpResponseMessage(HttpStatusCode.Unauthorized);
}
[HttpPost]
公共异步任务Post()
{
var signature=Request.Headers.GetValues(“X-Hub-
签名”).FirstOrDefault().Replace(“sha1=”,“”);
var body=wait Request.Content.ReadAsStringAsync();
如果(!验证签名(签名,正文))
返回新的HttpResponseMessage(HttpStatusCode.BadRequest);
var value=JsonConvert.DeserializeObject(主体);
如果(值._对象!=“页面”)
返回新的HttpResponseMessage(HttpStatusCode.OK);
foreach(值中的变量项。条目[0]。消息传递)
{
if(item.message==null&&item.postback==null)
继续;
其他的
等待SendMessage(GetMessageTemplate)(item.message.text,
item.sender.id));
}
返回新的HttpResponseMessage(HttpStatusCode.OK);
}
私有布尔验证签名(字符串签名、字符串正文)
{
var hashString=新的StringBuilder();
使用(var crypto=new HMACSHA1(Encoding.UTF8.GetBytes(appSecret)))
{
var hash=crypto.ComputeHash(Encoding.UTF8.GetBytes(body));
foreach(散列中的变量项)
Append(item.ToString(“X2”));
}
返回hashString.ToString().ToLower()==signature.ToLower();
}
/// 
///获取文本消息模板
/// 
///正文
///发送者id
///json
私有JObject GetMessageTemplate(字符串文本,字符串发送者)
{
返回JObject.FromObject(新
{
收件人=新的{id=发件人},
message=new{text=text}
});
}
/// 
///发送消息
/// 
///json
专用异步任务SendMessage(JObject json)
{
使用(HttpClient=new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(新建)
MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage res=等待
client.PostAsync($)https://graph.facebook.com/v2.6/me/messages? 
access_token={pageToken}”,新的StringContent(json.ToString(),
Encoding.UTF8,
“应用程序/json”);
}
}
}
}

我怎样才能创建这个模块。我需要一些建议。使用postman,我已经测试过使用Facebook的API调用通过bot发送消息。我是c#新手,所以请帮助我:(

机器人客户端是什么?我是说FB messanger、网页、slack…等等?我认为您必须在dialogflow之外实现此广播功能。Facebook、thnx@Prason