alexeyfv
@alexeyfv
.NET Developer

VK чат-бот не отвечает. В чём может быть проблема?

Написал простого чат-бота на ASP.NET Core. По задумке, бот должен ответить тем же самым сообщением, но ответа нет.
5db7423aa09d8759253250.png
Не могу понять, в чём проблема, т.к. метод Callback успешно отправил подтверждение, но в то же время на сообщения ответа нет.
5db742623cf90570531976.png
Добавил обработку запроса GET, в котором десериализуется одно из отправленных мною сообщений - всё работает. Когда перехожу по адресу контроллера получаю сообщение от группы. В чём может быть проблема?

Код контроллера
[Route("api/[controller]")]
[ApiController]
public class CallbackController : ControllerBase
{
    /// <summary>
    /// Конфигурация приложения
    /// </summary>
    private readonly IConfiguration _configuration;

    private readonly IVkApi _vkApi;

    public CallbackController (IConfiguration configuration, IVkApi vkApi)
    {
        _configuration = configuration;
        _vkApi = vkApi;
    }

    [HttpPost]
    public IActionResult Callback ([FromBody] VkEvent vkEvent)
    {
        // Проверяем, что находится в поле "type" 
        switch (vkEvent.Type)
        {
            // Если это уведомление для подтверждения адреса
            case "confirmation":
                // Отправляем строку для подтверждения 
                return Ok(_configuration["Config:Confirmation"]);
            case "message_new":
                {
                    // Десериализация
                    var msg = Message.FromJson(new VkResponse(vkEvent.Object));

                    // Отправим в ответ полученный от пользователя текст
                    _vkApi.Messages.Send(new MessagesSendParams
                    {
                        RandomId = new DateTime().Millisecond,
                        PeerId = msg.PeerId.Value,
                        Message = string.Format("Vk ChatBot Test App\nYour message: {0}", msg.Text)
                    });
                    // Возвращаем "ok" серверу Callback API
                    return Ok("ok");
                }
        }

        // Возвращаем "ok" серверу Callback API
        return Ok("ok");
    }

    [HttpGet]
    public IActionResult GetActionResult()
    {
        var jsonmsg = @"{""type"":""message_new"",""object"":{""date"":1572209977,""from_id"":19435491,""id"":40,""out"":0,""peer_id"":19435491,""text"":""Hello"",""conversation_message_id"":9,""fwd_messages"":[],""important"":false,""random_id"":0,""attachments"":[],""is_hidden"":false},""group_id"":172942884}";
            

        var vkEvent = JsonConvert.DeserializeObject<VkEvent>(jsonmsg);

        var msg = Message.FromJson(new VkResponse(vkEvent.Object));
        // Отправим в ответ полученный от пользователя текст
        _vkApi.Messages.Send(new MessagesSendParams
        {
            RandomId = new DateTime().Millisecond,
            PeerId = msg.PeerId.Value,
            Message = msg.Text
        });

        return Ok(msg.Text);

    }
}
  • Вопрос задан
  • 268 просмотров
Решения вопроса 1
alexeyfv
@alexeyfv Автор вопроса
.NET Developer
Вспомнил про своего бота спустя 3.5 месяца.

В классе VkEvent для сериализации используется Newtonsoft.Json.

Класс VkEvent

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;

namespace ChatBotTesting.Models
{
    [Serializable]
    public class VkEvent
    {
        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("object")]
        public JObject Object { get; set; }
        
        [JsonProperty("group_id")]
        public long GroupId { get; set; }
    }
}


Когда приходило событие от VK, то приложение выбрасывало исключение System.NotSupportedException: The collection type 'Newtonsoft.Json.Linq.JToken' is not supported. Для того, что бы приложение поддерживало Newtonsoft.Json необходимо сделать 2 вещи:
  1. Установить пакет Microsoft.AspNetCore.Mvc.NewtonsoftJson из NuGet
  2. В методе Startup.ConfigureServices написать: services.AddControllers().AddNewtonsoftJson();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы