Отправить сообщение боту с веб-сервиса - PullRequest
0 голосов
/ 26 июня 2018

Я запускаю веб-страницу от моего бота .NET. Страница взаимодействует с пользователем из одной из наших внутренних систем. Как только взаимодействие закончится, мне нужно сообщить боту об обновлении статуса - он находится в контексте. Подождите, пока это сообщение.

В настоящее время бот использует канал Facebook и запускает страницу с помощью кнопки URL-адреса Facebook, но в конечном итоге ему необходимо будет работать по нескольким каналам.

С веб-сайта я могу легко отправлять сообщения, которые отправляются пользователю, но, несмотря на то, что я потратил часы на поиск и отработку различных механизмов, я не нашел способа отправить сообщение боту.

Последняя попытка на основе https://docs.botframework.com/en-us/csharp/builder/sdkreference/d1/df2/_conversation_reference_ex_8cs_source.html, (cr кэшировал подробности разговора):

string MicrosoftAppId = ConfigurationManager.AppSettings["MicrosoftAppId"];
            string MicrosoftAppPassword = ConfigurationManager.AppSettings["MicrosoftAppPassword"];

            var account = new MicrosoftAppCredentials(MicrosoftAppId, MicrosoftAppPassword);
            MicrosoftAppCredentials.TrustServiceUrl(cr.serviceUrl);

            var connector = new ConnectorClient(new Uri(cr.serviceUrl), account);

            Activity activity = new Activity
            {
                Type = ActivityTypes.Message,
                Id = Guid.NewGuid().ToString(),
                Recipient = new ChannelAccount
                {
                    Id = cr.bot.id,
                    Name = cr.bot.name
                },
                ChannelId = cr.channelId,
                ServiceUrl = cr.serviceUrl,
                Conversation = new ConversationAccount
                {
                    Id = cr.conversation.id,
                    IsGroup = false,
                    Name = null
                },
                From = new ChannelAccount
                {
                    Id = cr.bot.id,
                    Name = cr.bot.name
                },
                Text = "Test send message to bot from web service"
            };

            try
            {
                await connector.Conversations.SendToConversationAsync(activity);
            }
            catch (Exception ex)
            {
                var s = ex.Message;
            }

Но комбинация From / Recipient, похоже, не отправляет боту.

Я уверен, что мне не хватает чего-то простого, и вы, ребята, можете сказать мне, что это такое!

1 Ответ

0 голосов
/ 27 июня 2018

Вот пример отправки сообщения боту из другого приложения. В этом случае я делал это из веб-API, который был прокси-сервером, перехватывавшим сообщения от пользователя и отправляющим их боту. В этот код не входит описание того, как создать действие, но похоже, что эта часть уже отсортирована. Обратите внимание, что в этом дополнительном приложении я использовал Bot.Builder, поэтому я мог использовать объекты деятельности и другие функции.

//get a token (See below)
var token = GetToken();

//set the service url where you want this activity to be replied to
activity.ServiceUrl = "http://localhost:4643/api/return";

//convert an activity to json to send to bot
var jsonActivityAltered = JsonConvert.SerializeObject(activity);

//send a Web Request to the bot
using (var client = new WebClient())
{
    //add your headers
    client.Headers.Add("Content-Type", "application/json");
    client.Headers.Add("Authorization", $"Bearer {token}");

    try
    {
        //set where to to send the request {Your Bots Endpoint}
        var btmResponse = client.UploadString("http://localhost:3971/api/messages", jsonActivityAltered);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

чтобы получить токен:

private static string GetToken()
{
    string token;
    using (var client = new WebClient())
    {
        var values = new NameValueCollection();
        values["grant_type"] = "client_credentials";
        values["client_id"] = "{MS APP ID}";
        values["client_secret"] = "{MS APP SECRET}";
        values["scope"] = "{MS APP ID}/.default";

        var response =
            client.UploadValues("https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token", values);

        var responseString = Encoding.Default.GetString(response);
        var result = JsonConvert.DeserializeObject<ResponseObject>(responseString);
        token = result.access_token;
    }

    return token;
}

Класс объекта ответа:

public class ResponseObject
{
    public string token_type { get; set; }
    public int expires_in { get; set; }
    public int ext_expires_in { get; set; }
    public string access_token { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...