public void Call_NotMoreThen3CallsPerSecond() { int invocationCount = 0; var browser = new Mock<IBrowser>(); browser.Setup(m => m.GetJson(It.IsAny<string>())) .Returns(@"{ ""response"": 2 }") .Callback(() => invocationCount++); var api = new VkApi {Browser = browser.Object}; var start = DateTimeOffset.Now; while (true) { api.Call("someMethod", VkParameters.Empty, true); int total = (int)(DateTimeOffset.Now - start).TotalMilliseconds; if (total > 999) break; } // Не больше 4 раз, т.к. 4-ый раз вызывается через 1002 мс после первого вызова, а total выходит через 1040 мс // переписать тест, когда придумаю более подходящий метод проверки browser.Verify(m => m.GetJson(It.IsAny<string>()), Times.AtMost(4)); }
/// <summary> /// Получение json по url-адресу /// </summary> /// <param name="url">Адрес получения json</param> /// <returns>Строка в формате json</returns> public string GetJson(string url, VkApi vkApi) { var separatorPosition = url.IndexOf('?'); string methodUrl = separatorPosition < 0 ? url : url.Substring(0, separatorPosition); string parameters = separatorPosition < 0 ? string.Empty : url.Substring(separatorPosition + 1); return WebCall.PostCall(methodUrl, parameters, vkApi).Response; }
private WebCall(string url, Cookies cookies, VkApi vk) { Request = (HttpWebRequest)WebRequest.Create(url); Request.Accept = "text/html"; Request.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; Request.CookieContainer = cookies.Container; if (!vk.isDefaultVkApi) { createProxy(ProxyManager.getInstance().reserveOrGet(vk.email), Request); } Result = new WebCallResult(url, cookies); }
public static WebCallResult PostCall(string url, string parameters,VkApi vk) { var call = new WebCall(url, new Cookies(), vk); call.Request.Method = "POST"; call.Request.ContentType = "application/x-www-form-urlencoded"; var data = Encoding.UTF8.GetBytes(parameters); call.Request.ContentLength = data.Length; using (var requestStream = call.Request.GetRequestStream()) requestStream.Write(data, 0, data.Length); return call.MakeRequest(vk); }
public static WebCallResult Post(WebForm form, VkApi vk) { var call = new WebCall(form.ActionUrl, form.Cookies, vk); var request = call.Request; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var formRequest = form.GetRequest(); request.ContentLength = formRequest.Length; request.Referer = form.OriginalUrl; request.GetRequestStream().Write(formRequest, 0, formRequest.Length); request.AllowAutoRedirect = false; return call.MakeRequest(vk); }
public void Init() { var browser = new Mock<IBrowser>(); browser.Setup(m => m.GetJson(It.Is<string>(s => s == Url))) .Callback(Callback) .Returns(() => { if (string.IsNullOrWhiteSpace(Json)) { throw new ArgumentNullException(nameof(Json), @"Json не может быть равен null. Обновите значение поля Json"); } return Json; }); browser.Setup(o => o.Authorize( It.IsAny<ulong>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<Settings>(), It.IsAny<Func<string>>(), It.IsAny<long?>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int?>(), It.IsAny<string>(), It.IsAny<string>() ) ) .Returns(VkAuthorization.From(new Uri("https://vk.com/auth?__q_hash=qwerty&access_token=token&expires_in=1000&user_id=1"))); Api = new VkApi { Browser = browser.Object }; Api.Authorize(new ApiAuthParams { ApplicationId = 1, Login = "******", Password = "******", Settings = Settings.All }); Api.RequestsPerSecond = 10000; // Чтобы тесты быстрее выполнялись }
internal MessagesCategory(VkApi vk) { _vk = vk; }
public VKMessageSender(VkApi api) { this.api = api; }
internal FriendsCategory(VkApi vk) { _vk = vk; }
/// <summary> /// Методы для работы с подарками. /// </summary> /// <param name="vk">API.</param> internal GiftsCategory(VkApi vk) { _vk = vk; }
public static List <Video> GetVideos(VkApi vkApi, long?userId) => vkApi.Video.Get(new VideoGetParams { OwnerId = userId }) .ToList();
public void AuthorizeByTokenNegative() { Api = new VkApi(); // В базовом классе предопределено свойство AccessToken Api.Authorize("", 1); Assert.That(Api.UserId, Is.Null); }
/// <summary> /// Методы для работы с приложениями. /// </summary> /// <param name="vk">API.</param> internal AppsCategory(VkApi vk) { _vk = vk; }
/// <summary> /// Методы для работы с сообщениями. /// </summary> /// <param name="vk">API</param> internal MessagesCategory(VkApi vk) { _vk = vk; }
public VkMethods() { this.api = new VkApi(); this.db = new DbMethods(); }
private SingleAPI() { this.API = new VkApi(); }
/// <summary> /// Действия в 00 Минут каждого часа /// </summary> /// <param name="context"></param> /// <returns></returns> public Task Execute(IJobExecutionContext context) { Database database = new Database(); if (DateTime.Now.Hour == 00) { database.CleanTable("Votes"); database.SetWorkingVariable("VoteAcces", "open"); Dictionary <string, string> warnings = database.GetDictionaryString("WarningList"); foreach (var warning in warnings) { if (warning.Value != "опер") { string tempString = database.RandomResponse("RandomNewInfo"); tempString = tempString.Replace("{warning}", warning.Value); database.InfoUpdate(warning.Value, tempString); } } } else if ((DateTime.Now.Day == 31 && DateTime.Now.Month == 12) || (DateTime.Now.Day == 01 && DateTime.Now.Month == 01)) { VkApi client = new VkApi(); Database db = new Database(); client.Authorize(new ApiAuthParams() { AccessToken = db.GetWorkingVariable("BigBroKey") }); MessagesSendParams @params = new MessagesSendParams(); Audio Track = new Audio(); Track.OwnerId = -187905748; if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 14) { @params.Message = "Так)) ещё немного и у кого-то начнётся веселье))\nНастоятельно рекомендую слушать песни которые я буду отправлять))" + "99% что поднимут настроение, если не поднимут, то вы ещё недостаточно выпили!!"; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 15) { @params.Message = "С Новым годом! Пусть к чёрту катятся все проблемы! Пусть трезвый Дед Мороз подарит опьяняющее счастье трезвой реальности!" + " Желаю крутых подъёмов в новом году, максимальных доходов, желаемых результатов в делах и невероятно страстных чувств в отношениях!"; Track.Id = 456239033; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 16) { @params.Message = "Новый год стучится в двери, а это значит, что пора пинком под зад отправить все проблемы, запастись охапками продуктов и" + " с широкою, довольною улыбкой набираться позитива. Улыбайтесь же и веселитесь, гоните в шею все дурные мысли! Как шампанское, бурлите " + "от радости и мечтайте о великих перспективах!"; Track.Id = 456239018; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 17) { @params.Message = "С Новым годом! Желаю быть чудом весь чудесный год, желаю снегопада денег и вьюги удачи, вихря счастья и бурана любви. " + "Пусть этот год будет суперским и мега-крутым, а в нём пусть будет и драйв, и кайф, и роскошь!"; Track.Id = 456239020; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 18) { @params.Message = "С Новым годом! Желаю выбросить и носки с дырками, и мысли с глупостями, и сомнения по любому поводу. Надеюсь, твоё " + "поведение было прилежным, и Дед Мороз подарит тебе что-то хорошее. Желаю круто встретить новый год и провести его под громким девизом " + "постоянного счастья!"; Track.Id = 456239022; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 19) { @params.Message = "Пусть Дед Мороз не забудет исполнить все пожелания, президент в полночь пообещает что-то оригинальное, а соседи наберут " + "самых красочных петард для праздничного салюта. Отдайте уходящему году мешок со всеми долгами, неприятностями и невзгодами, обратный " + "адрес не указывайте. С Новым годом!"; Track.Id = 456239037; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 20) { @params.Message = "Поздравляю с Новым годом! Пусть всегда удаётся смотреть трезво на жизнь, но в то же время быть в опьянении от счастья. " + "Желаю, чтобы шампусик смыл прошлые обиды и печали, чтобы в новом году было столько удачи и веселья, сколько горошинок в самом большом " + "тазу оливье!"; Track.Id = 456239034; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 21) { @params.Message = "С Новым годом! Желаю встретить его без похмелья, но с весёлыми приключениями на пятую точку! Пусть всё будет, как в доброй" + " сказке, как в старом хорошем фильме. Желаю, чтобы заливная рыба была совсем не гадостью, чтобы тебя никто не поливал из чайника, чтобы " + "не потянуло ни в баню, ни в Ленинград. Пусть новый год сорит деньгами и бьёт битой всех обидчиков!"; Track.Id = 456239035; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 22) { @params.Message = "Поздравляю с Новым годом и от души желаю если хреновины, то только к холодцу, если падения, то только в объятия любимого " + "человека, если страха, то только у врагов, если мусора, то только в виде бутылок от дорогого алкоголя и контейнеров от обалденной икры."; Track.Id = 456239036; } else if (DateTime.Now.Day == 31 && DateTime.Now.Hour == 23) { @params.Message = "Пусть на утро января не болит голова от выпитого, чтобы желания сбываться начали уже с этого дня. Желаю под елкой найти мешок" + " с деньгами, чтобы хватало на многие года вперед. С Новым годом!"; Track.Id = 456239032; } else if (DateTime.Now.Day == 01 && DateTime.Now.Hour == 00) { @params.Message = "Желаю в Новом году всем крепкой печени и внутреннего навигатора, чтобы точно знать как вы пришли туда, где проснулись."; Track.Id = 456239028; } else if (DateTime.Now.Day == 01 && DateTime.Now.Hour == 01) { @params.Message = "С Новым годом. Желаю «не ударить» в Оливье лицом, желаю шампанское и прочие горючие хорошенько закусывать холодцом, желаю" + " в Новом году быть огурцом, желаю утро нового календаря встретить радостно и без похмелья. А ещё желаю здоровья, ума и денег!"; Track.Id = 456239023; } List <long> Chats = db.GetListLong("MainMakara"); foreach (var chat in Chats) { if (Track.Id != null) { @params.Attachments = new[] { Track } } ; @params.RandomId = new Random().Next(); @params.PeerId = chat; client.Messages.Send(@params); } } database.CleanTable("ComandsFromUser"); return(null); } }
/// <summary> /// /// </summary> /// <param name="vk"></param> public WallCategory(VkApi vk) { _vk = vk; }
/// <summary> /// /// </summary> /// <param name="vk"></param> public UsersCategory(VkApi vk) { _vk = vk; }
public VkccService(VkApi api) { _api = api; }
internal UtilsCategory(VkApi vk) { _vk = vk; }
private void InitializeVKAPI() { VKAPIApplicationID = ulong.Parse(Resources[VK_API_APP_ID_KEY] as String); VKAPI = new VkApi(); VKAPI.OnTokenExpires += VKAPI_OnTokenExpires; }
internal FaveCategory(VkApi vk) { _vk = vk; Ex = new FaveCategoryExtended(this, _vk); }
private void VKAPI_OnTokenExpires(VkApi api) { this.SignOut(); }
internal UsersCategory(VkApi vk) { _vk = vk; }
/// <summary> /// Методы для работы с документами (получение списка, загрузка, удаление и т.д.). /// </summary> /// <param name="vk">API.</param> public DocsCategory(VkApi vk) { _vk = vk; }
internal DocsCategory(VkApi vk) { _vk = vk; Ex = new DocsCategoryExtended(this, _vk); }
public void Search_EmptyAccessToken_ThrowAccessTokenInvalidException() { var vk = new VkApi(); int count; This.Action(() => vk.Users.Search(Query, out count)).Throws<AccessTokenInvalidException>(); }
private RenderPass CreateRenderpass() { AttachmentDescription *pAttachments = stackalloc AttachmentDescription[2] { //Color Attachment new AttachmentDescription { Format = SwapchainImageFormat, Samples = SampleCountFlags.SampleCount1Bit, LoadOp = AttachmentLoadOp.Clear, StoreOp = AttachmentStoreOp.Store, StencilLoadOp = AttachmentLoadOp.DontCare, StencilStoreOp = AttachmentStoreOp.DontCare, InitialLayout = ImageLayout.Undefined, FinalLayout = ImageLayout.PresentSrcKhr }, //Depth Attachment new AttachmentDescription { Format = DepthFormat, Samples = SampleCountFlags.SampleCount1Bit, LoadOp = AttachmentLoadOp.Clear, StoreOp = AttachmentStoreOp.DontCare, StencilLoadOp = AttachmentLoadOp.DontCare, StencilStoreOp = AttachmentStoreOp.DontCare, InitialLayout = ImageLayout.Undefined, FinalLayout = ImageLayout.DepthStencilAttachmentOptimal } }; var colorAttachmentRef = new AttachmentReference(0, ImageLayout.ColorAttachmentOptimal); var depthAttachmentRef = new AttachmentReference(1, ImageLayout.DepthStencilAttachmentOptimal); var subpass = new SubpassDescription { PipelineBindPoint = PipelineBindPoint.Graphics, ColorAttachmentCount = 1, PColorAttachments = &colorAttachmentRef, PDepthStencilAttachment = &depthAttachmentRef }; var dependency = new SubpassDependency { SrcSubpass = Vk.SubpassExternal, DstSubpass = 0, SrcStageMask = PipelineStageFlags.PipelineStageColorAttachmentOutputBit, SrcAccessMask = 0, DstStageMask = PipelineStageFlags.PipelineStageColorAttachmentOutputBit, DstAccessMask = AccessFlags.AccessColorAttachmentReadBit | AccessFlags.AccessColorAttachmentWriteBit }; var renderPassInfo = new RenderPassCreateInfo { SType = StructureType.RenderPassCreateInfo, AttachmentCount = 2, PAttachments = pAttachments, SubpassCount = 1, PSubpasses = &subpass, DependencyCount = 1, PDependencies = &dependency }; RenderPass rPass; var res = VkApi.CreateRenderPass(Device, &renderPassInfo, null, &rPass); if (res != Result.Success) { throw new VMASharp.VulkanResultException("Failed to create RenderPass!", res); } return(rPass); } }
/// <summary> /// Методы для работы с аудиозаписями. /// </summary> /// <param name="vk"> Api vk.com </param> public AudioCategory(VkApi vk) { _vk = vk; }
public OnlineAlways(VkApi api, MainView mainView) { Api = api; MainView = mainView; }
public void Call_ThrowsCaptchaNeededException() { const string json = @"{ 'error': { 'error_code': 14, 'error_msg': 'Captcha needed', 'request_params': [ { 'key': 'oauth', 'value': '1' }, { 'key': 'method', 'value': 'messages.send' }, { 'key': 'uid', 'value': '242508553' }, { 'key': 'message', 'value': 'hello10' }, { 'key': 'type', 'value': '0' }, { 'key': 'access_token', 'value': '1fe7889c3395722934b1' } ], 'captcha_sid': '548747100691', 'captcha_img': 'http://api.vk.com/captcha.php?sid=548747100284&s=1' } }"; var browser = Mock.Of<IBrowser>(m => m.GetJson(It.IsAny<string>()) == json); var api = new VkApi {Browser = browser}; var ex = This.Action(() => api.Call("messages.send", VkParameters.Empty, true)).Throws<CaptchaNeededException>(); ex.Sid.ShouldEqual(548747100691); ex.Img.ShouldEqual(new Uri("http://api.vk.com/captcha.php?sid=548747100284&s=1")); }
/// <summary> /// Методы для работы с подарками. /// </summary> /// <param name="vk">API.</param> public AuthCategory(VkApi vk) { _vk = vk; }
public override void ExecutePL(RootObject update, VkApi client, SqlConnection Con) { MessagesSendParams @params = new MessagesSendParams(); var chatId = [email protected]_id; var keyboardBuilder = new KeyboardBuilder().Clear(); UserObject user = new UserObject(); UInt64 lvlExp = 100; int i = 0; try { SqlCommand getUser = new SqlCommand("SELECT * FROM Users WHERE chatId = @chatId;", Con); getUser.Parameters.AddWithValue("@chatId", chatId); SqlDataReader rgetUser = getUser.ExecuteReader(); rgetUser.Read(); user.state = Convert.ToInt32(rgetUser["state"]); user.study = Convert.ToInt32(rgetUser["study"]); rgetUser.Close(); if (user.study == 1) { SqlCommand updTag = new SqlCommand("UPDATE Users SET tag = @tag WHERE chatId = @chatId;", Con); updTag.Parameters.AddWithValue("@chatId", chatId); updTag.Parameters.AddWithValue("@tag", "Новичок - Обучение - ЦифраБанк"); //updTag.Parameters.AddWithValue("@state", 2); updTag.ExecuteNonQuery(); @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.Message = "В ЦифраБанке можно открыть счёт, а также взять кредит на свои цели."; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); Thread.Sleep(1000); keyboardBuilder .AddButton("Открыть счет", "selectGetBankCard", KeyboardButtonColor.Positive); @params.Message = "🎓 Открой счёт в банке, будешь хранить своё золото на данном счету"; @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } else { SqlCommand updTag = new SqlCommand("UPDATE Users SET tag = @tag WHERE chatId = @chatId;", Con); updTag.Parameters.AddWithValue("@chatId", chatId); updTag.Parameters.AddWithValue("@tag", "Новичок - Обучение - ЦифраБанк"); //updTag.Parameters.AddWithValue("@state", 2); updTag.ExecuteNonQuery(); @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.Message = "В ЦифраБанке можно открыть счёт, а также взять кредит на свои цели."; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } } catch (Exception ee) { @params.Message = "Ошибка в SelectBankCommand: " + ee.Message; @params.Attachments = null; @params.Keyboard = null; @params.UserId = 59111081; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } }
public override void Dispose() { VkApi.DestroyRenderPass(this.Device, this.RenderPass, null); base.Dispose(); }
/// <summary> /// Методы для работы с закладками. /// </summary> /// <param name="vk">API.</param> internal FaveCategory(VkApi vk) { _vk = vk; }
private unsafe void CreateBuffers() { PositionColorVertex[] positionData = VertexData.IndexedCubeData; ushort[] indexData = VertexData.CubeIndexData; InstanceData[] instanceData = new InstanceData[] { new InstanceData(new Vector3(0, 0, 0)), new InstanceData(new Vector3(2, 0, 0)), new InstanceData(new Vector3(-2, 0, 0)) }; CreateHostBufferWithContent <PositionColorVertex>(positionData, out var hostBuffer1, out var hostAlloc1); CreateHostBufferWithContent <ushort>(indexData, out var hostBuffer2, out var hostAlloc2); CreateHostBufferWithContent <InstanceData>(instanceData, out var hostBuffer3, out var hostAlloc3); CreateDeviceLocalBuffer(BufferUsageFlags.BufferUsageVertexBufferBit, GetByteLength(positionData), out this.VertexBuffer, out this.VertexAllocation); CreateDeviceLocalBuffer(BufferUsageFlags.BufferUsageIndexBufferBit, GetByteLength(indexData), out this.IndexBuffer, out this.IndexAllocation); CreateDeviceLocalBuffer(BufferUsageFlags.BufferUsageVertexBufferBit, GetByteLength(instanceData), out this.InstanceBuffer, out this.InstanceAllocation); var cbuffer = AllocateCommandBuffer(CommandBufferLevel.Primary); BufferCopy *copies = stackalloc BufferCopy[1]; BeginCommandBuffer(cbuffer, CommandBufferUsageFlags.CommandBufferUsageOneTimeSubmitBit); copies[0] = new BufferCopy(0, 0, (ulong)GetByteLength(positionData)); VkApi.CmdCopyBuffer(cbuffer, hostBuffer1, this.VertexBuffer, 1, copies); copies[0] = new BufferCopy(0, 0, (ulong)GetByteLength(indexData)); VkApi.CmdCopyBuffer(cbuffer, hostBuffer2, this.IndexBuffer, 1, copies); copies[0] = new BufferCopy(0, 0, (ulong)GetByteLength(instanceData)); VkApi.CmdCopyBuffer(cbuffer, hostBuffer3, this.InstanceBuffer, 1, copies); EndCommandBuffer(cbuffer); var subInfo = new SubmitInfo(commandBufferCount: 1, pCommandBuffers: &cbuffer); var fence = CreateFence(); var res = VkApi.QueueSubmit(GraphicsQueue, 1, &subInfo, fence); if (res != Result.Success) { throw new Exception("Unable to submit to queue. " + res); } var bufferTmp = cbuffer; //Allows the capture of this command buffer in a lambda BufferCopyPromise = this.scheduler.WaitForFenceAsync(fence); BufferCopyPromise.GetAwaiter().OnCompleted(() => { VkApi.DestroyFence(Device, fence, null); FreeCommandBuffer(bufferTmp); VkApi.DestroyBuffer(Device, hostBuffer1, null); VkApi.DestroyBuffer(Device, hostBuffer2, null); VkApi.DestroyBuffer(Device, hostBuffer3, null); hostAlloc1.Dispose(); hostAlloc2.Dispose(); hostAlloc3.Dispose(); }); this.VertexCount = (uint)positionData.Length; this.IndexCount = (uint)indexData.Length; this.InstanceCount = (uint)instanceData.Length; }
internal DatabaseCategory(VkApi vk) { _vk = vk; }
internal GroupsCategory(VkApi vk) { _vk = vk; }
/// <summary> /// Методы для работы с wiki. /// </summary> /// <param name="vk">API.</param> internal PagesCategory(VkApi vk) { _vk = vk; }
/// <summary> /// Метод работающий с API VK /// </summary> static void SolverApi() { string logFileBot = $@"logs\{DateTime.Now.ToString("yyyyMMdd")}_vkbot.log "; string logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; Console.WriteLine($"{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")} initialization "); logStringBot += "[initialization]"; File.AppendAllText(logFileBot, logStringBot); //параметры подключения //для безопасности и универсальности вынесены за пределы компилируемого кода в отдельные файлы //процесс настройки и получения значений описан в документации "VK-RMEbot server settings.ppt" string apikey = File.ReadAllText("_apikey"); ulong appid = Convert.ToUInt64(File.ReadAllText("_appid")); string login = File.ReadAllText("_login"); string password = File.ReadAllText("_password"); string groupid = File.ReadAllText("_groupid"); // цикл создания сеансов обращений к серверу VK // первый запуск, перезапуск после обработанной ошибки, перезапуск по таймеру while (true) { //используем функционал VkNet VkApi vkClient = new VkApi(); WebClient webClient = new WebClient(); vkClient.Authorize(new ApiAuthParams { ApplicationId = appid, Login = login, Password = password, Settings = Settings.All }); var param = new VkParameters(new Dictionary <string, string>() { { "group_id", groupid } }); //получить id группы https://vk.com/dev/utils.resolveScreenName dynamic longPoll = JObject.Parse(vkClient.Call("groups.getLongPollServer", param).RawJson); // https://vk.com/dev/groups.getLongPollServer // https://vk.com/dev/using_longpoll // key - секретный ключ сессии // server - адрес сервера // ts - номер последнего события, начиная с которого надо получать данные // https://{$server}?act=a_check&key={$key}&ts={$ts}&wait=25&mode=2&version=1 string json = String.Empty; string url = String.Empty; // специальная метка времени для принудительного перезапуска сеанса работы с VK // иначе сеанс зависает и перестаёт принимать и отправлять сообщения // по умолчанию перезапуск сеанса идёт каждые 30 минут DateTime watchDog = DateTime.Now; Console.WriteLine($"WatchDog set to {watchDog.ToString("dd.MM.yyyy HH:mm:ss")}"); logStringBot = @$ "[WatchDog set to {watchDog.ToString(" dd.MM.yyyy HH : mm : ss ")}]"; File.AppendAllText(logFileBot, logStringBot); //обращение к longPoll сервису VK while (true) { //строка запроса url = string.Format("{0}?act=a_check&key={1}&ts={2}&wait=10", longPoll.response.server.ToString(), longPoll.response.key.ToString(), json != String.Empty ? JObject.Parse(json)["ts"].ToString() : longPoll.response.ts.ToString() ); // https://lp.vk.com/wh193815240?act=a_check&key=9.......2&wait=25&mode=2&ts=1 //ответ сервера json = webClient.DownloadString(url); //Console.WriteLine(url); //Console.WriteLine(json); //пустой ответ #region Empty Json //{ // ts: "500", // updates: [ ] //} #endregion // проверяем ответ на пустоту, а так же некоторые сообщения об ошибках var jsonMsg = json.IndexOf(":[]}") > -1 ? "" : $"{json} \n"; // обрабатываем ошибки и перезапускаем сеанс работы с VK if (json.IndexOf("failed\":2}") > -1) { Console.WriteLine($"{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")} json failed 2 "); logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; logStringBot += $"[Error: json failed 2]"; File.AppendAllText(logFileBot, logStringBot); break; } if (json.IndexOf("failed\":3}") > -1) { Console.WriteLine($"{DateTime.Now.ToString()} json failed 3 "); logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; logStringBot += $"[Error: json failed 3]"; File.AppendAllText(logFileBot, logStringBot); break; } // Парсим ответ сервера в список-коллекцию (List) var col = JObject.Parse(json)["updates"].ToList(); // Проходим по списку foreach (var item in col) { if (item["type"].ToString() == "message_new") { string key = apikey; // ВАЖНО - функциональность API VK зависит от запрошенной версии // например "v=5.69" даёт кнопки и возвращает их payload // а "v=5.41" - нет string urlBotMsg = $"https://api.vk.com/method/messages.send?v=5.69&access_token={key}&user_id="; //string urlBotMsg = $"https://api.vk.com/method/messages.send?v=5.41&access_token={key}&user_id="; // парсим ответ сервера в переменные, часть сохраняем в файл для отладки string usr = item["object"]["message"]["from_id"].ToString(); string logFile = $@"logs\{DateTime.Now.ToString("yyyyMMdd")}_vkbot_msg.log "; string logString = $@"[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; logString += $"[From ID: {usr}]"; Console.WriteLine($"From ID: {usr}"); string msg = item["object"]["message"]["text"].ToString(); logString += $"[Inbound msg: { msg}]"; Console.WriteLine($"Inbound msg: {msg}"); //парсим payload нажатой пользователем кнопки (если есть) string payload = String.Empty; if (!String.IsNullOrEmpty(item["object"]["message"]["payload"]?.ToString())) { payload = item["object"]["message"]["payload"].ToString(); logString += $"[Payload: {payload}]"; Console.WriteLine($"Payload: {payload}"); } //если нет - пльзователь не нажал кнопку, а написал боту текст вручную else { logString += $"[Payload: ]"; Console.WriteLine("No payload"); } File.AppendAllText(logFile, logString); //Console.WriteLine(GetMessage(msg, payload)); // формируем строку запроса к longPoll API VK // в том числе добавляем кнопки вариантов // из сценария, вызывая метод GetMessage(msg, payload) string post = string.Format(urlBotMsg + "{0}{1}", item["object"]["message"]["from_id"].ToString(), $"{GetMessage(msg, payload)}" ); //Console.WriteLine(post); //отправляем наш ответ пользователю webClient.DownloadString(post); logString = $"\n+\n"; File.AppendAllText(logFile, logString); logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}]"; logStringBot += $"[+]"; File.AppendAllText(logFileBot, logStringBot); Console.WriteLine("+"); // ждём одну секунду, чтобы не спамить VK частыми запросами (могут забанить за DDOS) Thread.Sleep(1000); } } // проверяем метку времени принудительного перезапуска // каждые полчаса выходим из цикла работы с longPoll API // для перезапуска сеанса работы с VK if (DateTime.Now > watchDog.AddMinutes(30)) { Console.WriteLine($"{DateTime.Now.ToString()} WatchDog timeout break "); logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}][Status: WatchDog timeout break]"; File.AppendAllText(logFileBot, logStringBot); break; } } // регистрируем в логах штатный выход из внутреннего цикла, ждём 0.1 сек и перезапускаем сеанс Console.WriteLine($"{DateTime.Now.ToString()} inner cycle exited. try to restart "); logStringBot = $"\n[{DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss")}][Status: inner cycle exited. try to restart]"; File.AppendAllText(logFileBot, logStringBot); Thread.Sleep(100); } }
/// <summary> /// Методы для работы со статистикой. /// </summary> /// <param name="vk">API.</param> internal StatsCategory(VkApi vk) { _vk = vk; }
public static List <People> GetPeopleFromAlbum(int SelectedAlbum, VkNet.Utils.VkCollection <PhotoAlbum> AllAlbums, VkApi api, DateTime TimeFrom, DateTime TimeTo) { ulong offset = 0, count = 500; List <VkNet.Model.Attachments.Photo> AllPhoto = new List <VkNet.Model.Attachments.Photo>(); try { while (true) { var photos = api.Photo.Get(new PhotoGetParams { OwnerId = AllAlbums[SelectedAlbum].OwnerId, Extended = true, Count = count, Offset = offset, AlbumId = VkNet.Enums.SafetyEnums.PhotoAlbumType.Id(AllAlbums[SelectedAlbum].Id) }); for (int i = 0; i < photos.Count; i++) { AllPhoto.Add(photos[i]); } if (AllPhoto.Count == AllAlbums[SelectedAlbum].Size) { break; } else if (AllPhoto.Count > AllAlbums[SelectedAlbum].Size) { throw new OutOfBorderPhotoException(); } else { offset = offset + count; } } } catch { throw new ErrorFindPhotoException(AllAlbums[SelectedAlbum].Title); } List <List <VkNet.Model.Comment> > AllComents = new List <List <VkNet.Model.Comment> >(); for (int i = 0; i < AllPhoto.Count; i++) { AllComents.Add(new List <VkNet.Model.Comment>()); if (AllPhoto[i].Comments.Count != 0) { count = 100; offset = 0; bool stop = true; try { while (true) { var Comments = api.Photo.GetComments(new PhotoGetCommentsParams { Sort = VkNet.Enums.SafetyEnums.CommentsSort.Desc, Count = count, Offset = offset, OwnerId = AllAlbums[SelectedAlbum].OwnerId, PhotoId = (ulong)AllPhoto[i].Id }); for (int j = 0; j < Comments.Count; j++) { if (Comments[j].Date >= TimeFrom && Comments[j].Date <= TimeTo) { AllComents[i].Add(Comments[j]); } else { stop = false; break; } } if (AllComents[i].Count == AllPhoto[i].Comments.Count || !stop) { break; } else if (AllComents[i].Count > AllPhoto[i].Comments.Count) { throw new OutOfBorderCommentsException(); } else { offset = offset + count; } } } catch { throw new ErrorFindCommentsException(i, AllAlbums[SelectedAlbum].Title); } } } List <People> peoples = new List <People>(); for (int i = 0; i < AllComents.Count; i++) { for (int j = 0; j < AllComents[i].Count; j++) { People buff; if ((buff = peoples.Find(x => x.Id == AllComents[i][j].FromId)) != null) { buff.CommentsText[i].Add(AllComents[i][j].Text); buff.CommentsData[i].Add(AllComents[i][j].Date.Value); } else { peoples.Add(new People(AllComents.Count, "", AllComents[i][j].FromId)); peoples[peoples.Count - 1].CommentsText[i].Add(AllComents[i][j].Text); peoples[peoples.Count - 1].CommentsData[i].Add(AllComents[i][j].Date.Value); } } } return(peoples); }
internal VideoCategory(VkApi vk) { _vk = vk; }
public static void deleteComments(int selectedIndex, VkNet.Utils.VkCollection <PhotoAlbum> AllAlbums, VkApi api, DateTime TimeFrom2, DateTime TimeTo2) { ulong offset = 0, count = 500; List <VkNet.Model.Attachments.Photo> AllPhoto = new List <VkNet.Model.Attachments.Photo>(); try { while (true) { var photos = api.Photo.Get(new PhotoGetParams { OwnerId = AllAlbums[selectedIndex].OwnerId, Extended = true, Count = count, Offset = offset, AlbumId = VkNet.Enums.SafetyEnums.PhotoAlbumType.Id(AllAlbums[selectedIndex].Id) }); for (int i = 0; i < photos.Count; i++) { AllPhoto.Add(photos[i]); } if (AllPhoto.Count == AllAlbums[selectedIndex].Size) { break; } else if (AllPhoto.Count > AllAlbums[selectedIndex].Size) { throw new OutOfBorderPhotoException(); } else { offset = offset + count; } } } catch (Exception ex) { throw new ErrorFindPhotoException(AllAlbums[selectedIndex].Title, "ErrorFindPhotoException. " + ex.ToString()); } for (int i = 0; i < AllPhoto.Count; i++) { if (AllPhoto[i].Comments.Count != 0) { count = 100; offset = 0; int delete_comment = 0; bool stop = true; try { while (true) { var Comments = api.Photo.GetComments(new PhotoGetCommentsParams { Sort = VkNet.Enums.SafetyEnums.CommentsSort.Desc, Count = count, Offset = offset, OwnerId = AllAlbums[selectedIndex].OwnerId, PhotoId = (ulong)AllPhoto[i].Id }); for (int j = 0; j < Comments.Count; j++) { if (Comments[j].Date >= TimeFrom2 && Comments[j].Date <= TimeTo2) { api.Photo.DeleteComment(commentId: Convert.ToUInt64(Comments[j].Id), ownerId: -167157478); delete_comment++; } else { if (Comments[j].Date < TimeFrom2) { stop = false; break; } } } if (!stop || Comments.Count == 0) { break; } else { offset = offset + count; } } } catch (Exception ex) { throw new ErrorFindCommentsException(i, AllAlbums[selectedIndex].Title, "ErrorFindCommentsException. " + ex.ToString()); } } } }
internal DocsCategoryExtended(DocsCategory docsCategory, VkApi vk) { _docs = docsCategory; _vk = vk; }
public override void Execute(RootObject update, VkApi client, SqlConnection Con) { }
/// <summary> /// API для работы с лайками. /// </summary> /// <param name="vk">The vk.</param> internal LikesCategory(VkApi vk) { _vk = vk; }
public override void ExecutePL(RootObject update, VkApi client, SqlConnection Con) { MessagesSendParams @params = new MessagesSendParams(); var chatId = [email protected]_id; var keyboardBuilder = new KeyboardBuilder().Clear(); UserObject user = new UserObject(); UInt64 lvlExp = 100; int i = 0; try { SqlCommand getUser = new SqlCommand("SELECT * FROM Users WHERE chatId = @chatId;", Con); getUser.Parameters.AddWithValue("@chatId", chatId); SqlDataReader rgetUser = getUser.ExecuteReader(); rgetUser.Read(); user.state = Convert.ToInt32(rgetUser["state"]); user.study = Convert.ToInt32(rgetUser["study"]); rgetUser.Close(); if (user.study == 1) { SqlCommand updTag = new SqlCommand("UPDATE Users SET tag = @tag WHERE chatId = @chatId;", Con); updTag.Parameters.AddWithValue("@chatId", chatId); updTag.Parameters.AddWithValue("@tag", "Новичок - Обучение - ДокУслуги"); //updTag.Parameters.AddWithValue("@state", 2); updTag.ExecuteNonQuery(); @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.Message = "ДокУслуги - позаимствованная с Земли технология. На нашей планете она телепортирует документы за считанные секунды🚀"; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); Thread.Sleep(1000); keyboardBuilder .AddButton("Получить паспорт", "selectGetPassport", KeyboardButtonColor.Positive); @params.Message = "🎓 Давай получим паспорт и проверим скорость работы сервиса!"; @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } else { SqlCommand updTag = new SqlCommand("UPDATE Users SET tag = @tag WHERE chatId = @chatId;", Con); updTag.Parameters.AddWithValue("@chatId", chatId); updTag.Parameters.AddWithValue("@tag", "Новичок - Обучение - ДокУслуги"); //updTag.Parameters.AddWithValue("@state", 2); updTag.ExecuteNonQuery(); @params.Keyboard = keyboardBuilder.Build(); @params.UserId = chatId; @params.Message = "ДокУслуги - позаимствованная с Земли технология. На нашей планете она телепортирует документы за считанные секунды🚀"; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } } catch (Exception ee) { @params.Message = "Ошибка в SelectHomeCommand: " + ee.Message; @params.Attachments = null; @params.Keyboard = null; @params.UserId = 59111081; @params.RandomId = GetRandomId(); client.Messages.SendAsync(@params); } }
/// <summary> /// Методы для работы с новостной лентой пользователя. /// </summary> /// <param name="vk">API.</param> internal NewsFeedCategory(VkApi vk) { _vk = vk; }
public APIController(IHostingEnvironment _environment, IHttpContextAccessor _httpContextAccessor, IMemoryCache _memoryCache, IOptions <AppSetting> _appSettings, VkApi vkApi, UnitOfWork <ApplicationDbContext> _unit) : base(_environment, _httpContextAccessor, _memoryCache, _appSettings) { VkApi = vkApi; Unit = _unit; }
public ResponserBotAdmin(string _confirmation, long _groupId, VkApi _vkApi) : base(_confirmation, _groupId, _vkApi) { keyboardBuilder.AddButton("current_time", "", VkNet.Enums.SafetyEnums.KeyboardButtonColor.Negative); keyboardBuilder.AddLine(); }
internal StatusCategoryExtended(StatusCategory statusCategory, VkApi vk) { _status = statusCategory; _vk = vk; }
public void GetUserSettings_EmptyAccessToken_ThrowAccessTokenInvalidException() { var vk = new VkApi(); This.Action(() => vk.Users.GetUserSettings(100)).Throws<AccessTokenInvalidException>(); }
internal WallCategory(VkApi vk) { _vk = vk; }
public void Search_EmptyQuery_ThrowArgumentException() { int count; var vk = new VkApi { AccessToken = "token" }; This.Action(() => vk.Users.Search("", out count)).Throws<ArgumentException>() .Message.ShouldEqual("Query can not be null or empty."); }
public VkPostsReader(VkApi api) { this.api = api; }