public WallGetObject GetWallInfo(ParserParams @params) { try { long groupId; var w_pars = new WallGetParams(); if (long.TryParse(@params.Domain, out groupId)) { w_pars.OwnerId = groupId; } else { w_pars.Domain = @params.Domain; } WallGetObject wall = api.Wall.Get( new WallGetParams { OwnerId = groupId, Count = 0 }); return(wall); } catch (Exception e) { Console.WriteLine(e.Message); } return(null); }
public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions) { List <Post> res = new List <Post>(); ulong offset = 0; int loadCount = downloadingPostsOptions.CountInFirstLoad; while (true) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); foreach (var post in wallPosts.WallPosts) { res.Add(post); } if (wallPosts.WallPosts.Count < loadCount) { break; } offset += (ulong)loadCount; loadCount = MaxLoadCount; } return(res); }
static async public void WallDisplay() { Mform.listView1.Items.Clear(); WallGetObject WGO = await api.Wall.GetAsync(new VkNet.Model.RequestParams.WallGetParams { OwnerId = -186834007, Extended = true }); /*foreach (User user in WGO.Profiles) * { * MessageBox.Show(user.Id.ToString()); * }*/ foreach (VkNet.Model.Attachments.Post post in WGO.WallPosts) { User u = (WGO.Profiles.ToList()).Find(x => x.Id == post.FromId); // № автор текст дата ListViewItem item = new ListViewItem(new[] { u.FirstName + " " + u.LastName, post.Text, post.Date.ToString() }) { Name = u.Id.ToString(), Tag = post.Id }; Mform.listView1.Items.Add(item); //Mform.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); } }
/// <summary> /// Вызывает метод загрузки постов и следит чтобы загрузка прошла успешно. /// </summary> private WallGetObject getWall(CancellationToken cancellationToken, uint offset, uint count) { WallGetObject tmp = null; byte brokeToken = 0; string ErrorLog = ""; while (tmp == null && brokeToken < 5) { cancellationToken.ThrowIfCancellationRequested(); brokeToken++; try { tmp = getWallPosts(offset, count); } catch (TooManyRequestsException) { Task.Delay(TooManyRequestsDelay); continue; } catch (Exception Ex) { ErrorLog += string.Format("{0} - {1}{2}", brokeToken, Ex.Message, Environment.NewLine); } } if (tmp == null) { throw new NotImplementedException("Ошибка при загрузке записей со стены\r\n" + ErrorLog); } return(tmp); }
public static InternalVkApiWallGetObject ToInternal(this WallGetObject wallGetObject) { return(new InternalVkApiWallGetObject { WallApiPosts = wallGetObject.WallPosts.Select(ToInternal).ToArray() }); }
/// <summary> /// This methods gets all posts from clients wall /// </summary> /// <returns> WallObject instance </returns> public virtual List <Post> GetAllPosts(DateTime timeFrom, DateTime timeTo) { List <Post> curPosts = new List <Post>(); WallGetParams wallParams = new WallGetParams { OwnerId = VkId }; try { WallGetObject wall = Api.Get().Wall.Get(wallParams, true); foreach (Post post in wall.WallPosts) { var innerPosts = post.CopyHistory; foreach (var innerPost in innerPosts) { if (innerPost.Date.Value.Date <= timeTo && post.Date.Value.Date >= timeFrom) { curPosts.Add(innerPost); } } if (post.Date.Value.Date <= timeTo && post.Date.Value.Date >= timeFrom) { curPosts.Add(post); } } } catch { // bug in library caused by generic casting // https://github.com/vknet/vk/pull/744 } return(curPosts); }
public DataToProcessingModel(WallGetObject wallObject, RequestPostsModel baseRequest, string _name, DateTime time) { requestBody = baseRequest; utcDateLoad = time; name = _name; foreach (var post in wallObject.WallPosts) { postsText.Add(post.Text); } }
public static Dictionary <char, double> GetFreqAnalysis(WallGetObject posts) { var chars = posts.WallPosts.Select(_ => _.Text) .SelectMany(_ => _.Where(c => Char.IsLetter(c)) .Select(_ => Char.ToLower(_))); var count = chars.Count(); var freqs = chars.GroupBy(_ => _) .OrderBy(_ => _.Key) .ToDictionary(g => g.Key, g => Math.Round((double)g.Count() / count, 3)); return(freqs); }
/// <summary> /// Загрузка постов по лимитам установленным в модели (Все посты за период ИЛИ заданное кол-во постов) /// </summary> /// <param name="wall"></param> /// <param name="downloadingPostsOptions"></param> /// <param name="monitoringLimits"></param> /// <param name="logger"></param> /// <returns></returns> public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions, MonitoringLimits monitoringLimits) { List <Post> res = new List <Post>(); int loadCount = downloadingPostsOptions.CountInFirstLoad; bool allPostsReceived = true; ulong offset = 0; long? monitoringNumBorder = null; DateTime? monitoringTimeBorder = null; if (monitoringLimits.MonitoringLimit != null) { monitoringNumBorder = 0; } if (monitoringLimits.MonitoringPeriod != null) { monitoringTimeBorder = DateTime.UtcNow - monitoringLimits.MonitoringPeriod; } while (allPostsReceived) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); if (wallPosts.WallPosts.Count != 0) { if (monitoringNumBorder == null) { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, monitoringTimeBorder.Value)); } else if (monitoringTimeBorder == null) { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, ref monitoringNumBorder, monitoringLimits.MonitoringLimit.Value)); } else { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, monitoringTimeBorder.Value, ref monitoringNumBorder, monitoringLimits.MonitoringLimit.Value)); } if (wallPosts.WallPosts.Count < loadCount) { allPostsReceived = false; } offset += (ulong)loadCount; loadCount = MaxLoadCount; } } return(res); }
void SaveLikesFromPostToFile(long GroupID, long PostID, FileStream fstream) { int AllLikesCount = 0; WallGetParams wallParam = new WallGetParams(); wallParam.OwnerId = GroupID; wallParam.Count = maxPostFromVkDatabase; WallGetObject wallObjects = vkApi.Wall.Get(wallParam); foreach (var post_it in wallObjects.WallPosts) { AllLikesCount = post_it.Likes.Count; if (post_it.Id != PostID) { continue; } LikesGetListParams likeParams = new LikesGetListParams(); likeParams.Type = LikeObjectType.Post; likeParams.ItemId = PostID; likeParams.Extended = true; likeParams.OwnerId = GroupID; likeParams.Count = 1000; uint i = 0; while (AllLikesCount > 0) // выбираем по 1000 id(максимум) { VkCollection <long> likes = vkApi.Likes.GetList(likeParams); foreach (var itLike in likes) { PrintFoFile(fstream, itLike.ToString()); //запись каждого id в файл } AllLikesCount -= (int)maxSingleOffser; i++; likeParams.Offset = i * maxSingleOffser; // увеличиваем каждый раз смещение Thread.Sleep(300); // чтобы избежать "Too many requests per second } Console.WriteLine(post_it.Likes.Count); Console.WriteLine(AllLikesCount); ; } }
private static Post GetLatestPost(VkApi api, ApiConfiguration apiConfiguration) { var wallGetParams = new WallGetParams { Domain = apiConfiguration.TargetGroup, Count = WallGetCount, Offset = WallGetOffset, Filter = WallFilter.All }; WallGetObject getResult = api.Wall.Get(wallGetParams); Post latestPost = getResult.WallPosts.FirstOrDefault(x => !x.IsPinned.HasValue || !x.IsPinned.Value); return(latestPost); }
SortedSet <long> SaveUsersIDFromPostToList(long GroupID, long PostID) { SortedSet <long> UsersID = new SortedSet <long>(); int AllLikesCount = 0; WallGetParams wallParam = new WallGetParams(); wallParam.OwnerId = GroupID; wallParam.Count = maxPostFromVkDatabase; WallGetObject wallObjects = vkApi.Wall.Get(wallParam); foreach (var post_it in wallObjects.WallPosts) { AllLikesCount = post_it.Likes.Count; if (post_it.Id != PostID) { continue; } LikesGetListParams likeParams = new LikesGetListParams(); likeParams.Type = LikeObjectType.Post; likeParams.ItemId = PostID; likeParams.Extended = true; likeParams.OwnerId = GroupID; likeParams.Count = 1000; uint i = 0; while (AllLikesCount > 0) // выбираем по 1000 id(максимум) { VkCollection <long> likes = vkApi.Likes.GetList(likeParams); foreach (var itLike in likes) { UsersID.Add(itLike); } AllLikesCount -= (int)maxSingleOffser; i++; likeParams.Offset = i * maxSingleOffser; // увеличиваем каждый раз смещение Thread.Sleep(300); // чтобы избежать "Too many requests per second } } return(UsersID); }
int GetNumberOfComments(long PostID) { WallGetParams wallGetParams = new WallGetParams(); wallGetParams.OwnerId = chosenGroup().groupID; wallGetParams.Count = ulong.Parse(numberOfPosts.Text); WallGetObject wallObjects = vkApi.Wall.Get(wallGetParams); foreach (var post_it in wallObjects.WallPosts) { if (post_it.Id == PostID) { return(post_it.Comments.Count); } } return(-1); }
private void ShowPostsButton_Click(object sender, EventArgs e) { Posts.Name = "Posts"; Posts.Rows.Clear(); this.Controls.Add(Posts); Posts.ColumnCount = 2; Posts.ColumnHeadersDefaultCellStyle.BackColor = Color.Navy; Posts.ColumnHeadersDefaultCellStyle.ForeColor = Color.White; Posts.ColumnHeadersDefaultCellStyle.Font = new Font(Posts.Font, FontStyle.Bold); Posts.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders; Posts.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; Posts.CellBorderStyle = DataGridViewCellBorderStyle.Single; Posts.GridColor = Color.Black; Posts.RowHeadersVisible = false; Posts.Columns[0].Name = "Post ID"; Posts.Columns[1].Name = "Text"; try { uint AllLikesCount = 0; WallGetParams wallParam = new WallGetParams(); wallParam.OwnerId = chosenGroup().groupID; wallParam.Count = ulong.Parse(numberOfPosts.Text); WallGetObject wallObjects = vkApi.Wall.Get(wallParam); foreach (var post_it in wallObjects.WallPosts) { AllLikesCount = (uint)post_it.Likes.Count; long PostID = long.Parse(post_it.Id.ToString()); string[] row = { PostID.ToString(), post_it.Text }; Posts.Rows.Add(row); } Posts.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; Posts.Columns[0].Width = 60; Posts.Columns[1].Width = 360; } catch (Exception except) { MessageBox.Show(except.Message, "Error!\n"); } }
/// <summary> /// Из загруженных постов выбирает все, начиная с самого нового и заканчивая постом с датой публикации не больше monitoringTimeBorder /// </summary> /// <param name="wallPosts">Посты, из которых надо выбрать необходимые</param> /// <param name="allPostsReceived">Флаг, отвечающий, что все необходимые посты выбраны</param> /// <param name="monitoringTimeBorder">Временная граница</param> /// <returns></returns> private static List <Post> SelectionLoadedPosts(WallGetObject wallPosts, ref bool allPostsReceived, DateTime monitoringTimeBorder) { List <Post> res = new List <Post>(); for (int i = 0; i < wallPosts.WallPosts.Count; i++) { var post = wallPosts.WallPosts.ElementAt(i); if (post.Date >= monitoringTimeBorder) { res.Add(post); } else { allPostsReceived = false; break; } } return(res); }
/// <summary> /// Из загруженных постов выбирает максимальное количество не превышающий параметр monitoringLimit(количество). Назад возвращает сколько постов выбрано (monitoringNumBorder) /// </summary> /// <param name="wallPosts">Посты, из которых надо выбрать необходимые</param> /// <param name="allPostsReceived">>Флаг, отвечающий, что все необходимые посты выбраны</param> /// <param name="monitoringNumBorder"></param> /// <param name="monitoringLimit"></param> /// <returns></returns> private static List <Post> SelectionLoadedPosts(WallGetObject wallPosts, ref bool allPostsReceived, ref long?monitoringNumBorder, int monitoringLimit) { List <Post> res = new List <Post>(); for (int i = 0; i < wallPosts.WallPosts.Count; i++) { var post = wallPosts.WallPosts.ElementAt(i); if (monitoringNumBorder < monitoringLimit) { res.Add(post); monitoringNumBorder++; } else { allPostsReceived = false; break; } } return(res); }
/// <summary> /// Выделить из полученных записей те, что удовлетворяют условиям /// </summary> /// <param name="wall">Стена с записями</param> /// <param name="thresholdId">Верхняя граница, до которой записи уже были загружены</param> /// <param name="lastDateToLoad">Дата и время, до которого нужно выбрать посты</param> /// <param name="lastPostToLoad">Последний пост, который нужно выбрать</param> /// <returns></returns> public static List <Post> FilterPosts(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { var posts = wall.WallPosts; if (posts.Count > 0) { int startIndex = 0; int endIndex = posts.Count - 1; if (posts[0].IsPinned.Value) { startIndex++; } while (startIndex <= endIndex && posts[startIndex].Id >= thresholdId) { startIndex++; } if (p.LastDateToLoad.HasValue) { while (endIndex >= startIndex && posts[endIndex].Date < p.LastDateToLoad.Value) { endIndex--; } } if (p.LastPostToLoad > 0) { while (endIndex >= startIndex && posts[endIndex].Id < p.LastPostToLoad) { endIndex--; } } if (startIndex <= endIndex) { return(posts.Skip(startIndex).Take(endIndex - startIndex + 1).ToList()); } } return(new List <Post>()); }
public override void Process() { VkApi api = new VkApi(); api.Authorize(new ApiAuthParams { ApplicationId = 123456, AccessToken = Token, Settings = Settings.All }); WallGetObject wall = api.Wall.Get(new WallGetParams { Domain = Channel.Url }); if (wall != null && wall.WallPosts.Count > 0) { foreach (Post post in wall.WallPosts) { if (!Channel.LastSynchronizationDate.HasValue || (post.Date.HasValue && post.Date >= Channel.LastSynchronizationDate.Value)) { NewsItems.Add(new NewsItemContract { ChannelId = Channel.Id, Date = post.Date.Value, Title = post.Text.TruncateSpecialSymbols(), Description = post.Text.TruncateSpecialSymbols(), Text = post.Text, Url = $"https://vk.com/{Channel.Url}?w=wall{post.OwnerId}_{post.Id}" }); } } } FilterNewsItemsByTags(); SaveNewsItems(); }
private async Task <PostsCollection> LoadWallPosts() { long latestOldPostId = -1; PostsCollection res = new PostsCollection(); int loadCount = FirstLoadCount; // TODO: how to calculate var getParams = new WallGetParams() { OwnerId = _model.WallId }; WallGetObject wallGetRes = null; _api.Wall.Get(getParams); DownloadingPostsOptions downloadingPostsOptions = new DownloadingPostsOptions(_model.WallId, loadInFirstCount, WallFilter.All, _wallWatcherOptions.TimeForReconnecting); // если _prePublishedList пустой, то грузим не до самого нового имющегося поста (так как его у нас нет), а за MonitoringLimits(период и/или количество) if (!_postsProvider.AnyExistingPosts(_model.WallId, _publishedType, 0)) { List <Post> publishedPosts = _api.Wall.GetPosts(_logger, downloadingPostsOptions, _model.MonitoringLimits); res.AddPosts(publishedPosts); } else { res.AddPosts(GetNewAndOldPublishedPosts(downloadingPostsOptions, out latestOldPostId)); } // Download suggests and postpone downloadingPostsOptions.CountInFirstLoad = MaxLoadCount; downloadingPostsOptions.WallFilter = WallFilter.Suggests; res.AddPosts(_api.Wall.GetPosts(_logger, downloadingPostsOptions)); downloadingPostsOptions.WallFilter = WallFilter.Postponed; res.AddPosts(_api.Wall.GetPosts(_logger, downloadingPostsOptions)); return(res); }
public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions, long border) { List <Post> res = new List <Post>(); bool allPostsReceived = true; ulong offset = 0; int loadCount = downloadingPostsOptions.CountInFirstLoad; while (allPostsReceived) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, border)); if (wallPosts.WallPosts.Count < downloadingPostsOptions.CountInFirstLoad) { allPostsReceived = false; } offset += (ulong)downloadingPostsOptions.CountInFirstLoad; loadCount = MaxLoadCount; } return(res); }
private async Task ReadGroupsFileAsync(/*CancellationToken ct*/ CancellationToken cancellationToken) { // CancellationToken ct = tokenSource2.Token; // Were we already canceled? //ct.ThrowIfCancellationRequested(); //if (ct.IsCancellationRequested) //{ // Console.WriteLine("Операция прервана токеном"); // return; //} //Task task = null; //if (cancellationToken.IsCancellationRequested) //{ // throw new TaskCanceledException(task); // // cancellationToken.ThrowIfCancellationRequested(); //} f_start = true; var _api = new VkApi(); //Авторизация _api.Authorize(new ApiAuthParams { Login = vkLogin, Password = vkPassword, AccessToken = Token }); int y = 0; //порядковый номер группы string[] lines = File.ReadAllLines(groupsfilepath); var last = File.ReadAllLines(groupsfilepath).Last(); //последняя строка - группа var linescount = File.ReadAllLines(groupsfilepath).Length; //число строк foreach (var K in lines) //для каждой группы получаем список записей { long? id2 = Convert.ToInt64(K); WallGetObject wallposts = _api.Wall.Get(new WallGetParams { OwnerId = id2, //Идентификатор пользователя или сообщества, со стены которого необходимо получить записи //(по умолчанию — текущий пользователь). Обратите внимание, идентификатор сообщества в параметре owner_id //необходимо указывать со знаком “-“ — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1) целое число // Domain = id, //- Короткий адрес пользователя или сообщества. строка //Filter=, //all // Offset=, // Смещение, необходимое для выборки определенного подмножества записей. положительное число Count = PostCount, //- Количество записей, которое необходимо получить (но не более 100). Extended = true //Fields=Photo }); var count = wallposts.TotalCount; Invoke(new Action(() => { textBox1.Text = "Количество постов в группе " + K + " = " + count; //LB_Messages.Items.Add("Количество постов в группе " + K + " = " + count); })); Console.WriteLine("Количество постов в группе " + K + " = " + count); Console.ReadLine(); var postelem = wallposts.WallPosts; //Получили посты int j = 0; //число постов int numphot = 0; //номер фото for (j = 0; j < (int)PostCount; j++) //пока не дошли до макс значения постов одной группы { string groupidWOmin2 = K.Replace("-", ""); var groups2 = _api.Groups.GetById(null, groupidWOmin2, null).FirstOrDefault(); string sourceLink2 = groups2.Name; // + " @" + groups.Id; //Отправка источника записи string sourcelb = sourceLink2; Invoke(new Action(() => { LB_Source.Text = "Parsing: " + sourcelb; })); if (CHB_AddWOPhoto.Checked == true) { var atts = postelem[j].Attachments; if ((postelem[j].MarkedAsAds != true) && (postelem[j].Text != null) && (atts == null)) { //Удаление \n string deleteenters = postelem[j].Text.Replace("\n", ""); //string deletespace = postelem[j].Text.Replace("\n", ""); MessageToAttach = deleteenters; //Проверка на повторы string s = File.ReadAllText(text_archive); //Открываем файл с историей if (s.IndexOf(MessageToAttach) != -1) //пока не дошли до конца ищем первое совпадение { //Нашли текст уже был опубликован, значит пропускаем Console.WriteLine("Нашли повтор текста: " + s); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Нашли повтор текста: " + s; })); continue; } else { //Запомнили что опубликовали такое сообщение AddedFile(MessageToAttach, text_archive); //Отправка сообщения поста if (string.IsNullOrEmpty(MessageToAttach) == false) //Если не пустое сообщение { Invoke(new Action(() => { LB_Messages.Items.Add(MessageToAttach); })); await sendMessage(chatId, MessageToAttach); } } } } //текст if (ChB_AddMessage.Checked == true) //если хотим сообщения добавлять к картинкам { // var atts = postelem[j].Attachments; //Проверить если есть фотки или только текст, постить var att = postelem[j].Attachment; //Получили первое вложение if ((postelem[j].MarkedAsAds != true) && (postelem[j].Text != null) && (att != null) && (att.Type == typeof(Photo)) /*&&(postelem[j].PostType==post)*/) { //Удаление \n string deleteenters = postelem[j].Text.Replace("\n", ""); //string deletespace = postelem[j].Text.Replace("\n", ""); MessageToAttach = deleteenters; //Проверка на повторы string s = File.ReadAllText(text_archive); //Открываем файл с историей if (s.IndexOf(MessageToAttach) != -1) //пока не дошли до конца ищем первое совпадение { //Нашли текст уже был опубликован, значит пропускаем Console.WriteLine("Нашли повтор текста: " + s); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Нашли повтор текста: " + s; })); continue; } else { //Запомнили что опубликовали такое сообщение AddedFile(MessageToAttach, text_archive); //Отправка сообщения поста if (string.IsNullOrEmpty(MessageToAttach) == false) //Если не пустое сообщение { Invoke(new Action(() => { LB_Messages.Items.Add(MessageToAttach); })); var secret = GenerateRandomSecret(); var mtprotoProxy = new MTProtoProxyServer(secret, 2256); mtprotoProxy.StartAsync(); await sendMessage(chatId, MessageToAttach); } } } } List <MediaAttachment> vk_attachments = new List <MediaAttachment>(); foreach (var i in postelem) //Для каждого поста { if (numphot == (int)PostCount - 1) //если дошли числа постов, то обнуляем №фото, чтобы перезаписывать { numphot = 0; } //await SendMessageToChannelTest(MessageToAttach); //Получить информацию о записи, первого вложения и текст var atts = postelem[j].Attachments; int currphoto = 0; foreach (var att in postelem[j].Attachments) //для каждого вложения одного поста { //att.Type==typeof(Link) if (att.Type == typeof(Photo) && att.Type != typeof(Link)) //если вложения = фото но не ссылка { Console.WriteLine("Ссылка на фото: " + GetUrlOfBigPhoto(att.Instance as Photo)); //получили ссылку на фотку var url = GetUrlOfBigPhoto(att.Instance as Photo); //Если ссылка уже есть в файле истории, continue, если нет, то идем дальше string s = File.ReadAllText(filepath_archive); //Открываем файл с историей if (s.IndexOf(url) != -1) //пока не дошли до конца ищем первое совпадение { //Нашли фото уже был опубликован, значит пропускаем Console.WriteLine("Нашли повтор фото: " + s); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Нашли повтор фото: " + s; })); continue; } else { //Запомнили что опубликовали такую фотку AddedFile(url, filepath_archive); //скачали на ПК numphot = DownloadTempPhoto(url, j); currphoto++; Console.WriteLine("Скачали и сохранили фото под № " + numphot); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Скачали и сохранили фото под № " + numphot; })); fullphotoname = photofilename + numphot + ".jpg"; //Залили на стену //IReadOnlyCollection<Photo> photolist = SendOnServer(fullphotoname); //vk_attachments.AddRange(photolist); var secret = GenerateRandomSecret(); var mtprotoProxy = new MTProtoProxyServer(secret, 2256); mtprotoProxy.StartAsync(); await SendPhoto(chatId, fullphotoname, apiToken); // continue; Console.WriteLine("Отправили в телегу"); Invoke(new Action(() => { textBox1.Text = "Отправили в телегу"; })); ////Отправили ВК //var post = _api.Wall.Post(new WallPostParams //{ // OwnerId = groupid, // FromGroup = true, // Message = MessageToAttach, // Attachments = vk_attachments //}); //Delay Random rnd = new Random(); int number = rnd.Next(mindelay, maxdelay); if (chb_addsource.Checked == true) { int photocount = postelem[j].Attachments.Count; //число вложений фото if (photocount == 1) //если вложение одно { string groupidWOmin = K.Replace("-", ""); var groups = _api.Groups.GetById(null, groupidWOmin, null).FirstOrDefault(); if (groups != null) { string sourceLink = groups.Name; // + " @" + groups.Id; //Отправка источника записи string source = "Источник: " + sourceLink; await sendMessage(chatId, source); } } //если вложений несколько - один раз пишем источник в конце после последнего вложения if ((currphoto == photocount) && (photocount != 1)) { //Получение ссылки на сообщество string groupidWOmin = K.Replace("-", ""); var groups = _api.Groups.GetById(null, groupidWOmin, null).FirstOrDefault(); if (groups != null) { string sourceLink = groups.Name; // + " @" + groups.Id; //Отправка источника записи string source = "Источник: " + sourceLink; await sendMessage(chatId, source); } } } numphot++; Invoke(new Action(() => { textBox1.Text = "Ждем " + number / 1000 + " секунд"; })); Console.WriteLine("Ждем " + number / 1000 + " секунд"); Console.ReadLine(); await Task.Delay(number); } } //если вложения не фотки другая функция отправки типа вложения } //j++; Console.WriteLine("Обработали пост № " + j); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Обработали пост № " + j; })); } } y++; Console.WriteLine("Обработали строку № " + y + " Группа: " + id2); Console.ReadLine(); Invoke(new Action(() => { textBox1.Text = "Обработали строку № " + y + " Группа: " + id2; })); //это если постоянно //if ((j == (int)PostCount - 1) && (y == linescount)) //последний пост последней группы в списке // j = 0; //запускаем обратно цикл } MessageBox.Show("Обработаны все группы и посты!"); f_postedall = true; return; }
public static Task <List <Post> > FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue) { return(Task.Run(() => { return FilterPosts(wall, p, thresholdId); })); }
public async Task <List <Post> > GetUserWallPostsViaWallGetAsync(User user) { List <Post> result = new List <Post>(); ulong maxPostsBatch = 100; ulong postsOffset = 0; bool postsFinished = false; // community with dash //long targetGroup = -83415396; // user long targetObject = user.Id; while (!postsFinished) { WallGetParams wallGetParams = new WallGetParams { OwnerId = targetObject, //wallGetParams.Fields = GroupsFields.All; Filter = WallFilter.Owner, Offset = postsOffset, Extended = false, Count = maxPostsBatch }; WallGetObject requestResult = new WallGetObject(); try { // ограничение 5000 запросов в день requestResult = await ServiceApi.Wall.GetAsync(wallGetParams); } catch (CannotBlacklistYourselfException e) { //10361 - неизвестная проблема, пользователь закрыл все посты Console.WriteLine("Error getting wall posts via VK API: " + e); } catch (NullReferenceException e) { //336185 - неизвестная проблема, Audioplaylist Console.WriteLine("Error getting wall posts via VK API: " + e); } catch (RateLimitReachedException e) { Console.WriteLine("Error getting wall posts via VK API: " + e); } catch (Exception e) { Console.WriteLine("Error getting wall posts via VK API: " + e); } if (requestResult.WallPosts != null) { result.AddRange(requestResult.WallPosts); if (requestResult.WallPosts.Count < (int)maxPostsBatch) { postsFinished = true; } else { postsOffset = (ulong)result.Count; } } else { postsFinished = true; } } return(result); }
private async Task ReadGroupsFileAsync() { var _api = new VkApi(); //Авторизация _api.Authorize(new ApiAuthParams { Login = vkLogin, Password = vkPassword, AccessToken = Token }); int y = 0; //порядковый номер группы string[] lines = File.ReadAllLines(groupsfilepath); foreach (var K in lines) //для каждой группы получаем список записей { long? id2 = Convert.ToInt64(K); WallGetObject wallposts = _api.Wall.Get(new WallGetParams { OwnerId = id2,//Идентификатор пользователя или сообщества, со стены которого необходимо получить записи //(по умолчанию — текущий пользователь). Обратите внимание, идентификатор сообщества в параметре owner_id //необходимо указывать со знаком “-“ — например, owner_id=-1 соответствует идентификатору сообщества ВКонтакте API (club1) целое число // Domain = id, //- Короткий адрес пользователя или сообщества. строка //Filter=, //all // Offset=, // Смещение, необходимое для выборки определенного подмножества записей. положительное число Count = PostCount, //- Количество записей, которое необходимо получить (но не более 100). Extended = true //Fields=Photo }); var count = wallposts.TotalCount; Console.WriteLine("Количество постов в группе " + K + " = " + count); Console.ReadLine(); var postelem = wallposts.WallPosts; //Получили посты // int j = 0;//число постов int numphot = 0; //номер фото for (int j = 0; j < (int)PostCount; j++) //пока не дошли до макс значения постов одной группы { foreach (var i in postelem) //Для каждого поста { if(numphot== (int)PostCount-1) //если дошли числа постов, то обнуляем №фото, чтобы перезаписывать { numphot = 0; } //текст if ((postelem[j].MarkedAsAds != true) && (postelem[j].Text != null)/*&&(postelem[j].PostType==post)*/) { //Удаление \n //string deleteenters = postelem[j].Text.Replace("\n",""); MessageToAttach = postelem[j].Text; Invoke(new Action(() => { LB_Messages.Items.Add(MessageToAttach); })); //Сделать отправку сообщений, почему-то нулевые приходят // SendMessageToChannelTest(MessageToAttach); } //Получить информацию о записи, первого вложения и текст var atts = postelem[j].Attachments; foreach (var att in postelem[j].Attachments) //для каждого вложения одного поста { if (att.Type == typeof(Photo)) //если вложения = фото { Console.WriteLine("Ссылка на фото: " + GetUrlOfBigPhoto(att.Instance as Photo)); //получили ссылку на фотку var url = GetUrlOfBigPhoto(att.Instance as Photo); //Если ссылка уже есть в файле истории, continue, если нет, то идем дальше string s = File.ReadAllText(filepath_archive); //Открываем файл с историей if (s.IndexOf(url) != -1) //пока не дошли до конца ищем первое совпадение { //Нашли фото уже был опубликован, значит пропускаем Console.WriteLine("Нашли повтор фото: " + s); Console.ReadLine(); continue; } else { //Запомнили что опубликовали такую фотку AddedFile(url); //скачали на ПК numphot = DownloadTempPhoto(url, j); Console.WriteLine("Скачали и сохранили фото под № " + numphot); Console.ReadLine(); fullphotoname = photofilename + numphot + ".jpg"; // string apiToken = "775672851:AAEUjIvm-Vc4ZWIWmvfUffK5Rh4fLIP2jDE"; //BotFather //string chatId = "-1001115479085"; //https://api.telegram.org/bot<YourBOTToken>/getUpdates await SendPhoto(chatId, fullphotoname, apiToken); // continue; Console.WriteLine("Отправили в телегу"); numphot++; //Delay Random rnd = new Random(); int number = rnd.Next(3000, 11000); Console.WriteLine("Ждем " + number / 1000 + " секунд"); Console.ReadLine(); await Task.Delay(number); } } } Console.WriteLine("Обработали пост № " + j); Console.ReadLine(); } y++; Console.WriteLine("Обработали группу № " + y); Console.ReadLine(); } } return; }
private string BuildString(WallGetObject wall) { return(wall.WallPosts.Aggregate("", (current, post) => current + post.Text)); }