private static void Main(string[] args) { const string accessToken = ""; var album = new VkAlbum(171831917) { OwnerId = Int32.Parse("-51777326") }; var photosMgr = new PhotosManager(accessToken); var um = new UsersManager(accessToken); var photos = photosMgr.GetAlbumPhotos(album); var sb = new StringBuilder(); var dic = new Dictionary<Int64, List<VkPhoto>>(); var comments = new Dictionary<VkPhoto, List<VkComment>>(); var usersCache = new Dictionary<Int64, VkUser>(); foreach (VkPhoto vkPhoto in photos) { if (vkPhoto.CommentsCount == 0) continue; sb.AppendLine(String.Format("({0}) {1}:", vkPhoto.Id, vkPhoto.Text)); Console.WriteLine("Looking in " + vkPhoto.Id); comments.Add(vkPhoto, new List<VkComment>()); foreach (var comment in photosMgr.GetPhotoComments(vkPhoto)) { if (!usersCache.ContainsKey(comment.SenderId)) { var sender = um.GetUserById(comment.SenderId); usersCache.Add(comment.SenderId, sender); } sb.AppendLine(String.Format("\t[{0}]: {1}", usersCache[comment.SenderId].GetFullName(), comment.Message)); comments[vkPhoto].Add(comment); if (!dic.ContainsKey(comment.SenderId)) { dic.Add(comment.SenderId, new List<VkPhoto>()); } if (!dic[comment.SenderId].Contains(vkPhoto)) dic[comment.SenderId].Add(vkPhoto); } sb.AppendLine(); } sb.AppendLine(); foreach (KeyValuePair<Int64, List<VkPhoto>> pair in dic) { VkUser user = usersCache[pair.Key]; sb.AppendLine(user.GetFullName() + ":"); foreach (VkPhoto photo in pair.Value) { sb.AppendLine(String.Format("\t{0}", photo.Text)); foreach (KeyValuePair<VkPhoto, List<VkComment>> valuePair in comments) { if (valuePair.Key.Id != photo.Id) continue; foreach (VkComment vkComment in valuePair.Value) { if (vkComment.SenderId != user.Id) continue; sb.AppendLine(String.Format("\t\t[{0}]: {1}", vkComment.Date, vkComment.Message)); } } } sb.AppendLine(); } File.WriteAllText(@"f:\temp\result1.txt", sb.ToString(), Encoding.UTF8); }
private void UpdatePhotosInAlbumThreadProc(object sender, DoWorkEventArgs args) { var worker = sender as BackgroundWorker; var album = args.Argument as Album; if (album == null) return; var vkWraper = new VkObjectsWrapper(); var photosMgr = new PhotosManager(m_settings.AccessToken); var usersMgr = new UsersManager(m_settings.AccessToken); var commentsRepo = DbManger.GetInstance().GetCommentsRepository(); var customersRepo = DbManger.GetInstance().GetCustomersRepository(); var ordersRepo = DbManger.GetInstance().GetOrderRepository(); var prodsRepo = DbManger.GetInstance().GetProductRepository(); var workGroup = vkWraper.GetVkGroupObject(m_settings.WorkGroupId, m_settings.LoggedUserId); List<VkPhoto> vkPhotos; try { worker.ReportProgress(0, "Загрузка фотографий альбома"); vkPhotos = photosMgr.GetAlbumPhotos(vkWraper.GetVkGroupAlbum(workGroup, album.VkId)); } catch (VkMethodInvocationException vkError) { m_logger.ErrorException(vkError); throw new BgWorkerException(vkError.Message); } catch (Exception e) { m_logger.ErrorException(e); throw new BgWorkerException("Ошибка. Не удалось загрузить фотографии для альбома '" + album.Title + "'"); } int total = vkPhotos.Count; for (var n = 0; n < vkPhotos.Count; n++) { worker.ReportProgress(0, String.Format("Обработка {0} из {1}", (n + 1), total)); if (vkPhotos[n].CommentsCount == 0) continue; Product productInfo = null; try { var products = prodsRepo.GetByVkId(vkPhotos[n].Id); if (products.Count > 0) { // по этому коду найдены продукты, найдем продукт из текущего альбома productInfo = products.FirstOrDefault(product => product.AlbumId == album.Id); if (productInfo == null) { // продукты с таким кодом есть, но они не в этом альбоме -> скопируем любую (первую) запись var p = products[0].CopyToAlbum(album); prodsRepo.Add(p); productInfo = p; m_logger.DebugFormat("Создан дубликат продукта '{0}' с ID={1}", p.Title, p.Id); } } } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка. Не удалось загрузить описание продукта из БД."); } #region Добавление нового продукта в репозиторий если productInfo = null if (productInfo == null) { // добавим продукт в репозиторий productInfo = new Product { AlbumId = album.Id, VkId = vkPhotos[n].Id, MinAmount = 1 }; #region если есть url к изображению, надо его закачать if (!String.IsNullOrEmpty(vkPhotos[n].SourceUrl)) { var name = String.Format("{0}_{1}", album.VkId, vkPhotos[n].Id); var imgExtensions = new List<string> { ".jpg", ".png", ".gif", ".bmp" }; foreach (string imgExtension in imgExtensions) { if (!vkPhotos[n].SourceUrl.EndsWith(imgExtension)) continue; name += imgExtension; break; } var remoteFile = new FileDownloader(new Uri(vkPhotos[n].SourceUrl)); try { var file = System.IO.Path.Combine(m_settings.GalleryPath, name); remoteFile.DownloadTo(file); productInfo.ImageFile = name; } catch (Exception) { } } #endregion // парсинг описания productInfo.ParsePhotoDescription(vkPhotos[n].Text); // проверка пользователем var dialogResult = ProductCheckWindow.Result.Ignore; var sourceText = vkPhotos[n].Text; var handler = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { var f = new ProductCheckWindow(this, productInfo, sourceText); f.ShowDialog(); dialogResult = f.GetResult(); })); handler.Wait(); if (dialogResult == ProductCheckWindow.Result.Break) { break; } else if (dialogResult == ProductCheckWindow.Result.Accept) { try { prodsRepo.Add(productInfo); } catch (Exception e) { m_logger.ErrorException(e); throw new BgWorkerException("Ошибка. Не удалось сохранить информацию о товаре."); } } } #endregion // загрузить комменты к этой фотографии List<VkComment> vkComments; try { vkComments = photosMgr.GetPhotoComments(vkPhotos[n]); } catch (VkMethodInvocationException vkError) { m_logger.ErrorException(vkError); throw new BgWorkerException(vkError.Message); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Не удалось получить комментарии к фото."); } foreach (VkComment vkComment in vkComments) { // создание объекта хранимого комментария var parsedComment = new ParsedComment { ParsingDate = DateTime.Now, VkId = vkComment.Id, ProductId = productInfo.Id }; try { // проверка, не обрабатывался ли этот комментарий раньше if (commentsRepo.Contains(parsedComment)) continue; } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка: Не удалось получить данные из БД."); } // поиск юзера оставившего этот комментарий Customer customer; try { customer = customersRepo.GetByVkId(vkComment.SenderId); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Не удалось получить информацию о пользователе из БД!"); } #region заведение заказчика в базе if (customer == null) { // если нашего заказчика нет в базе, значит он заказывает первый раз - добавим его в базу VkUser vkUser; try { // скачиваем инфо из Вконтакте vkUser = usersMgr.GetUserById(vkComment.SenderId); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Не удалось получить информацию о пользователе из Вконтакте."); } customer = new Customer { FirstName = vkUser.FirstName, LastName = vkUser.LastName, VkId = vkUser.Id, }; try { customersRepo.Add(customer); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка. Не удалось сохранить информацию в БД."); } DispatcherOperation h = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { var f = new CustomerEditWindow(this, customer); f.ShowDialog(); })); h.Wait(); } #endregion parsedComment.Message = vkComment.Message; parsedComment.SenderName = customer.GetFullName(); parsedComment.PostingDate = vkComment.Date.ToString(); // начальная инициализация var orderObj = new Order { ProductId = productInfo.Id, CustomerId = customer.Id, Comment = "", Date = vkComment.Date, Amount = 0 }; var requestedOperation = OrderOperation.Add; #region парсинг текста комментария /* * ищем чтото типа "+N", "-N" * */ var msg = vkComment.Message; for (var i = 0; i < msg.Length; i++) { if (!Char.IsDigit(msg[i]) && msg[i] != '-' && msg[i] != '+' && msg[i] != ' ') { msg = msg.Replace(msg[i], ' '); } } msg = msg.Replace(" ", ""); if (msg.Length > 0) // если чтото осталось от сообщения { if (msg[0] == '+') { // добавляем чтото к заказу requestedOperation = OrderOperation.Add; for (int i = 0; i < msg.Length; i++) { if (!Char.IsDigit(msg[i]) && msg[i] != ' ') { msg = msg.Replace(msg[i], ' '); } msg = msg.Replace(" ", ""); } if (msg.Length > 0) { try { orderObj.Amount = Int32.Parse(msg); } catch (Exception) { orderObj.Amount = 0; } } } else if (msg[0] == '-') { requestedOperation = OrderOperation.Remove; for (int i = 0; i < msg.Length; i++) { if (!Char.IsDigit(msg[i]) && msg[i] != ' ') { msg = msg.Replace(msg[i], ' '); } msg = msg.Replace(" ", ""); } if (msg.Length > 0) { try{orderObj.Amount = Int32.Parse(msg);} catch (Exception) { orderObj.Amount = 0; } } } } #endregion // открыть форму проверки комметнария var dialogResult = CommentCheckWindow.Result.Reject; var resultAction = OrderOperation.Add; msg = vkComment.Message; DispatcherOperation ch = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => { var f = new CommentCheckWindow(this, msg, customer, orderObj, productInfo, requestedOperation); f.ShowDialog(); dialogResult = f.GetResult(); resultAction = f.GetRequestedOperation(); })); ch.Wait(); if (dialogResult == CommentCheckWindow.Result.Accept) { // сохранить объект комметария в БД try { commentsRepo.Add(parsedComment); orderObj.InitialVkCommentId = parsedComment.Id; } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } if (resultAction == OrderOperation.Add) { #region сохранить заказ в БД или добавить к существующему List<Order> personOrders; try { personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } var storedOrder = personOrders.FirstOrDefault(t => t.ProductId == orderObj.ProductId); if (storedOrder == null) { try { ordersRepo.Add(orderObj); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } } else { storedOrder.Amount += orderObj.Amount; if(!String.IsNullOrEmpty(orderObj.Comment)) storedOrder.Comment += String.Format("; {0}", orderObj.Comment); try { ordersRepo.Update(storedOrder); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } } #endregion } else if (resultAction == OrderOperation.Remove) { #region удалить в БД из заказов все что связано с этим товаром у этого заказчика List<Order> personOrders; try { personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } bool clean = true; for (int i = 0; i < personOrders.Count; i++) { if (personOrders[i].ProductId == orderObj.ProductId) { try { ordersRepo.Delete(personOrders[i]); } catch (Exception exception) { m_logger.ErrorException(exception); clean = false; } } } if (!clean) { throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } #endregion } else if (resultAction == OrderOperation.Decrease) { #region уменьшить кол-во заказаного товара в позиции List<Order> personOrders; try { personOrders = ordersRepo.GetOrdersForCustomerFromAlbum(customer, album); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } var storedOrder = personOrders.FirstOrDefault(t => t.ProductId == orderObj.ProductId); if (storedOrder != null) { storedOrder.Amount -= orderObj.Amount; if (storedOrder.Amount > 0) { try { ordersRepo.Update(storedOrder); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } } else { // позиция нулевая, можно удалить try { ordersRepo.Delete(storedOrder); } catch (Exception exception) { m_logger.ErrorException(exception); throw new BgWorkerException("Ошибка соединения с БД. Операция не выполнена"); } } } else { m_logger.DebugFormat("Внимание! Невозможно уменьшить заказ которого нет!"); } #endregion } else { // 'Forget' action is skiped too! } } } } }
private static void Main(string[] args) { Console.CancelKeyPress += ConsoleOnCancelKeyPress; Console.CursorVisible = false; Console.Title = "VK"; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); log4net.Config.XmlConfigurator.Configure(); Status("Загрузка..."); try { s_db = DbManger.GetInstance(); ParseArguments(args); ReadConfiguration(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.ini")); } catch (Exception e) { Error(e.Message); return; } Status("Авторизация..."); var af = new AuthForm(s_appId); if (af.ShowDialog() != DialogResult.OK) { Error("Для работы нужно авторизоваться в сети!"); return; } var usrManager = new UsersManager(af.GetAccessToken()); try { var currentuser = usrManager.GetUserById(af.GetTokenUserId()); Console.Title = String.Format("AppID: {0} - {1}", s_appId, currentuser.GetFullName()); } catch (Exception e) { Error(e.Message); return; } var offset = 0; var random = new Random(); var query = new VkUsersSearchQuery(); query.SetParameter(UserSearchParam.HomeTown, "Снежинск"); query.SetParameter(UserSearchParam.Count, RES_COUNT); query.SetParameter(UserSearchParam.Fields, new List<VkProfile.EntryType> {VkProfile.EntryType.Sex, VkProfile.EntryType.Contacts}); Status("Выполнение..."); for (int age = 10; age < 60; age++) { query.SetParameter(UserSearchParam.AgeFrom, age); query.SetParameter(UserSearchParam.AgeTo, age); offset = 0; while (true) { query.SetParameter(UserSearchParam.Offset, offset); List<VkUser> result; try { result = usrManager.Search(query); } catch (Exception e) { Error(e.Message); break; } if (result.Count == 0) break; foreach (VkUser user in result) { Status("({0}) {1}... ", user.Id, user.GetFullName()); using (var session = s_db.OpenSession()) { using (var t = session.BeginTransaction()) { try { session.Save(new User { FirstName = user.FirstName, LastName = user.LastName, VkId = user.Id, Sex = user.Sex, HomePhone = user.HomePhone, MobilePhone = user.MobilePhone, BirthYear = user.BirthYear }); } catch (Exception e) { if (e.InnerException != null && e.InnerException is System.Data.SqlClient.SqlException) { if ( !(e.InnerException as System.Data.SqlClient.SqlException).Message.Contains( "Violation of UNIQUE KEY")) { Error(e.Message); } else { Error("({0}) {1}: Уже сохранено!", user.Id, user.GetFullName()); } } continue; } t.Commit(); Print("({0}) {1}: Сохранено", user.Id, user.GetFullName()); } } } offset += result.Count; // sleep 1 - 20 seconds var secs = random.Next(1000, 20000); Status("Ожидание {0} сек.", secs/1000); Thread.Sleep(secs); } var asecs = random.Next(1000, 20000); Status("Ожидание {0} сек.", asecs/1000); Thread.Sleep(asecs); } Status("Готово"); }