Некорректная работа VK бота

81
23 декабря 2021, 17:00

Решил попробовать написать своего первого бота (надеюсь не последнего) для Vk, используя VKNet и на языке C#. Найдя несколько гайдов, я приступил к его разработке: создал группу, приложение, получил токены и тд и тп.
Трудность с которой я столкнулся состоит в том, что бот постоянно шлёт сообщения. В представленном ниже коде, я задаю условие: если полученное событие является новым сообщением, но при этом оно не является исходящим сообщением, то уже отправить написавшему "test". Я создал переменную replyMessage, которая показывает является ли событие исходящим сообщением, и вывожу её в консоль. Значение переменной всегда False, хотя новое сообщение только одно -- моё, остальные сообщения от бота. Скорее всего нужно использовать как-то уникальные модификаторы сообщений (которые задаются случайно), но я не могу догадаться как. Пожалуйста, помогите с решением проблемы безостановочной отправки сообщений ботом.

    public static void SendMessage(string message, long? userID, long? PeerID, long? ChatID, VkApi api)
    {
        Random rnd = new Random();           
        int RandomID = rnd.Next();
        api.Messages.Send(new MessagesSendParams
        {
            RandomId = RandomID,
            UserId = userID,
            PeerId = PeerID,
            ChatId = ChatID,
            Message = message
        });          
    }
    static void Main(string[] args)
    {
        var api = new VkApi();
        Random testran = new Random();
        api.Authorize(new ApiAuthParams() { AccessToken = MyAppToken });
        var s = api.Groups.GetLongPollServer(MyGroupId);

        while (true)
        {
            try
            {                   
                var poll = api.Groups.GetBotsLongPollHistory(
                                  new BotsLongPollHistoryParams()
                                  { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 25});
                if (poll?.Updates == null) continue;
                foreach (var a in poll.Updates)
                {
                    bool replyMessage = (a.Type == GroupUpdateType.MessageReply);
                    long? peerID = a.Message.PeerId;
                    long? userID = a.Message.FromId;
                    long? chatID = a.Message.ChatId;
                    if (a.Type == GroupUpdateType.MessageNew)
                    {
                        SendMessage("test", userID, peerID, chatID, api);
                        Console.WriteLine(replyMessage);
                    }



                    //bool t = (a.Type == GroupUpdateType.MessageNew);
                    //if (a.Type == GroupUpdateType.MessageReply)
                    //{
                    //    Console.WriteLine(t);
                    //    continue;
                    //}
                    //if (t)
                    //{
                    //    long? peerID = a.Message.PeerId;
                    //    long? userID = a.Message.FromId;
                    //    long? chatID = a.Message.ChatId;
                    //    api.Messages.MarkAsRead(peerID.ToString());
                    //    if (a.Message.Text == "лох")
                    //        SendMessage("g", userID, peerID, chatID, api);
                    //}                       




                    //if (a.Type == GroupUpdateType.MessageReply)
                    //    break;
                    //if (a.Type != GroupUpdateType.MessageReply)
                    //{
                    //    if (a.Type == GroupUpdateType.MessageNew)
                    //    {
                    //        long? peerID = a.Message.PeerId;
                    //        long? userID = a.Message.FromId;
                    //        long? chatID = a.Message.ChatId;
                    //        //long? messID = a.Message.ConversationMessageId;
                    //        //long? RandomID = ;
                    //        string userMessage = a.Message.Text;
                    //        // Console.WriteLine("user is {0} and message is: {1}", a.Message.PeerId, userMessage);
                    //        SendMessage("@" + userID, chatID, peerID, chatID, api);                               
                    //    }
                    //}
                    //continue;
                    //long? peerID = a.Message.PeerId;
                    //long? userID = a.Message.UserId;
                    //long? chatID = a.Message.ChatId;
                    //long? messID = a.Message.ConversationMessageId;
                    //long? RandomID = a.Message.RandomId;
                    //if ((userMessage == "1") && ((check[0] != check[1]) || (check[1] == null)))
                    //{
                    //    SendMessage("я сосал", userID, peerID, chatID, api);
                    //    check[1] = check[0];
                    //    //api.Messages.MarkAsRead(peerID.ToString(), messID);                                                         
                    //}
                    //else
                    //    check[1] = check[0];
                }
                // continue;
            }



            catch (LongPollException exception)
            {
                if (exception is LongPollOutdateException outdateException)
                    s.Ts = outdateException.Ts;
                else
                {
                    s = api.Groups.GetLongPollServer(MyGroupId);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                // }
                // }
            }
        }
    }
}

}

Answer 1

Всё оказалось довольно просто. Заводим переменную s в цикле

static void Main(string[] args)
    {
        var api = new VkApi();
        Random testran = new Random();
        api.Authorize(new ApiAuthParams() { AccessToken = MyAppToken });

        while (true)
        {
            try
            {   
                var s = api.Groups.GetLongPollServer(MyGroupId);
                var poll = api.Groups.GetBotsLongPollHistory(
                                  new BotsLongPollHistoryParams()
                                  { Server = s.Server, Ts = s.Ts, Key = s.Key, Wait = 25});
                if (poll?.Updates == null) continue;
READ ALSO
Где взять знания? [закрыт]

Где взять знания? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

269
Проблема с индексами элементов массива

Проблема с индексами элементов массива

Почему у меня высвечивается ошибка с индексом: Array index is out of range

195
Десериализация в dynamic .net core 3.0

Десериализация в dynamic .net core 3.0

Есть необходимость получить объект типа dynamic из Json наNET Core 3

148
ObservableCoolection RemoveAt

ObservableCoolection RemoveAt

Проблема в том что DataGrid после удаления из коллекции (ObservableCollection) какого то слова, в DataGrid коллекция остается не измененнымРаботает в другом...

99