コード例 #1
0
 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);
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
ファイル: WallWatcher.cs プロジェクト: ModNick/VkNetExtend
        /// <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);
        }
コード例 #5
0
 public static InternalVkApiWallGetObject ToInternal(this WallGetObject wallGetObject)
 {
     return(new InternalVkApiWallGetObject
     {
         WallApiPosts = wallGetObject.WallPosts.Select(ToInternal).ToArray()
     });
 }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
 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);
     }
 }
コード例 #8
0
ファイル: Tools.cs プロジェクト: ainail/vk
        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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        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);
                ;
            }
        }
コード例 #11
0
        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);
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        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"); }
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
        /// <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);
        }
コード例 #17
0
ファイル: WallWatcher.cs プロジェクト: ModNick/VkNetExtend
        /// <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>());
        }
コード例 #18
0
        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();
        }
コード例 #19
0
        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);
        }
コード例 #20
0
        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);
        }
コード例 #21
0
ファイル: Form1.cs プロジェクト: Nowaday15/Parser
        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;
        }
コード例 #22
0
ファイル: WallWatcher.cs プロジェクト: ModNick/VkNetExtend
 public static Task <List <Post> > FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue)
 {
     return(Task.Run(() => { return FilterPosts(wall, p, thresholdId); }));
 }
コード例 #23
0
        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);
        }
コード例 #24
0
        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;
        }
コード例 #25
0
ファイル: VkService.cs プロジェクト: mrka3/tochka-test
 private string BuildString(WallGetObject wall)
 {
     return(wall.WallPosts.Aggregate("", (current, post) => current + post.Text));
 }