Как обрабатывать входящие сообщения пользователя (так же такие события как, к примеру, смена аватарки беседы и т.п.) · vknet/vk · Discussion #1108 (original) (raw)

Здесь можно посмотреть коды событий

Здесь и Здесь можно посмотреть готовые обертки обработки входящих сообщений для пользователя и группы соответственно

Класс обработчика:

class VKMessageManager { private VkApi_api=newVkApi(); private ulongts; private ulong? pts;

//Событие для уведомления о новом сообщенииpublic event Action<Message, User> OnNewMessage;

public VKMessageManager() 
{
    //Авторизуемся с учетной записью пользователя. 
    //Для обхода блокировки сообщений используем ApplicationId какого-нибудь официально зарегистрированного приложения
    //либо используем Bypass. В примере ApplicationId приложения Kate Mobile. 
    _api.Authorize(new ApiAuthParams() {
        ApplicationId = 2685278,
        Login = "login", //email или телефон
        Password = "password", //пароль от учетной записи
        Settings = Settings.All //берем полный доступ
    });
}

public void StartMessagesHandling() 
{
    //Соединяемся с сервером Long Poll запросов и получаем необходимые ts и pts
    LongPollServerResponse longPoolServerResponse = _api.Messages.GetLongPollServer(needPts: true);
    ts = Convert.ToUInt64(longPoolServerResponse.Ts);
    pts = longPoolServerResponse.Pts;

    //В отдельном потоке запускаем метод, который будет постоянно опрашивать Long Poll сервер на наличие новых сообщений
    new Thread(LongPollEventLoop).Start();
}

public void LongPollEventLoop() 
{
    //Запускаем бесконечный цикл опроса
    while (true) {
        //Отправляем запрос на сервер
        LongPollHistoryResponse longPollResponse = _api.Messages.GetLongPollHistory(new MessagesGetLongPollHistoryParams() {
            Ts = ts,
            Pts = pts, 
            Fields = UsersFields.Photo100 //Указывает поля, которые будут возвращаться для каждого профиля. В данном примере для каждого отправителя сообщения получаем фото 100х100
        });

        //Получаем новый pts
        pts = longPollResponse.NewPts;

        //Здесь пробегаемся по массиву событий
        for (int i = 0; i < longPollResponse.History.Count; i++) {
            //И обрабатываем код события
            switch (longPollResponse.History[i][0]) {
                //Код 4 - новое сообщение
                case 4:
                    //Здесь логика обработки сообщения
                    //К примеру, возбуждаем (ахх~) событие
                    OnNewMessage?.Invoke(
                        longPollResponse.Messages[i], 
                        longPollResponse.Profiles
                         .Where(u => u.Id == longPollResponse.Messages[i].FromId)
                         .FirstOrDefault()
                    );

                    //longPollResponse.Messages[i] - сообщение
                    //longPollResponse.Profiles.Where(u => u.Id == longPollResponse.Messages[i].FromId).FirstOrDefault() - отправитель сообщения
                    break;
            }
        }
    }
}

}

Использование:

//В консольном приложении этот код помещается в public static void Main()VKMessageManager manager = new VKMessageManager(); manager.OnNewMessage += (message, sender) => { //Обрабатываем входящее сообщение }; manager.StartMessagesHandling();