예제 #1
0
        // Members work async handlers
        private void MembersWork(Object sender, DoWorkEventArgs args)
        {
            // Do not access the form's BackgroundWorker reference directly. 
            // Instead, use the reference provided by the sender parameter.
            var bw = sender as BackgroundWorker;

            isMembersRunning = true;

            // Extract the argument. 
            var groupId = (decimal)args.Argument;

            // process group members
            IEntity e = new Profile();
            var fileName = Utils.GenerateFileName(this.WorkingFolderTextBox.Text, groupId, e, "members");
            groupMembersWriter = File.CreateText(fileName);
            Utils.PrintFileHeader(groupMembersWriter, e);

            var context = new VkRestApi.VkRestContext(this.userId, this.authToken);
            var sb = new StringBuilder();

            memberIds.Clear(); // clear member ids

            totalCount = 0;
            currentOffset = 0;
            step = 1;

            long timeLastCall = 0;

            // request group members
            while (isMembersRunning)
            {
                if (bw.CancellationPending)
                    break;

                if (currentOffset > totalCount)
                {
                    // done
                    break;
                }

                bw.ReportProgress(step, "Getting " + currentOffset + " members out of " + totalCount);

                sb.Length = 0;
                decimal gid = Math.Abs(groupId); // in this request, group id must be positive
                sb.Append("group_id=").Append(gid.ToString()).Append("&");
                sb.Append("sort=").Append("id_asc").Append("&");
                sb.Append("offset=").Append(currentOffset).Append("&");
                sb.Append("count=").Append(MEMBERS_PER_REQUEST).Append("&");
                sb.Append("fields=").Append(PROFILE_FIELDS).Append("&");
                context.Parameters = sb.ToString();
                Debug.WriteLine("Request parameters: " + context.Parameters);

                context.Cookie = currentOffset.ToString();

                // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                timeLastCall = Utils.sleepTime(timeLastCall);
                // call VK REST API
                vkRestApi.CallVkFunction(VkFunction.GroupsGetMembers, context);

                // wait for the members data
                ReadyEvent.WaitOne();

                currentOffset += MEMBERS_PER_REQUEST;
            }

            groupMembersWriter.Close();

            //args.Result = TimeConsumingOperation(bw, arg);

            // If the operation was canceled by the user,  
            // set the DoWorkEventArgs.Cancel property to true. 
            if (bw.CancellationPending)
            {
                args.Cancel = true;
            }
        }
예제 #2
0
        // Async workers
        
        private void GroupsWork(Object sender, DoWorkEventArgs args)
        {
            // Do not access the form's BackgroundWorker reference directly. 
            // Instead, use the reference provided by the sender parameter.
            var bw = sender as BackgroundWorker;

            // Extract the argument.
            var param = args.Argument as GroupPostsParam;
            var groupId = param.gid;
            if (param.from <= param.to)
            {
                postsFromDate = param.from;
                postsToDate = param.to;
            }
            else
            {
                postsFromDate = param.to;
                postsToDate = param.from;
            }

            var context = new VkRestApi.VkRestContext(userId, authToken);
            var sb = new StringBuilder();
            isRunning = true;

            // gather group statistics
            if (param.justStats)
            {

                bw.ReportProgress(1, "Getting group stats");

                sb.Length = 0;
                sb.Append("group_id=").Append(Math.Abs(groupId).ToString()).Append("&");
                sb.Append("date_from=").Append(this.postsFromDate.ToString("yyyy-MM-dd")).Append("&");
                sb.Append("date_to=").Append(this.postsToDate.ToString("yyyy-MM-dd"));
                context.Parameters = sb.ToString();
                Debug.WriteLine("Download parameters: " + context.Parameters);

                // call VK REST API
                vkRestApi.CallVkFunction(VkFunction.StatsGet, context);

                return;
            }

            // create stream writers
            // 1) group posts
            // group posts
            IEntity e = new Post();
            String fileName = Utils.GenerateFileName(WorkingFolderTextBox.Text, groupId, e);
            groupPostsWriter = File.CreateText(fileName);
            Utils.PrintFileHeader(groupPostsWriter, e);

            postsWithComments.Clear(); // reset comments reference list
            likes.Clear(); // reset likes
            posters.Clear(); // reset posters
            posterIds.Clear(); // clear poster ids
            visitorIds.Clear(); // clear visitor ids

            totalCount = 0;
            currentOffset = 0;
            step = 1;

            long timeLastCall = 0;

            // get group posts 100 at a time and store them in the file
            // request group posts
            while (isRunning)
            {
                if (bw.CancellationPending)
                    break;

                if(currentOffset > totalCount)
                {
                    // done
                    break;
                }

                bw.ReportProgress(step, "Getting " + currentOffset + " posts out of " + totalCount);

                sb.Length = 0;
                sb.Append("owner_id=").Append(groupId.ToString()).Append("&");
                sb.Append("offset=").Append(currentOffset).Append("&");
                sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                context.Parameters = sb.ToString();
                Debug.WriteLine("Download parameters: " + context.Parameters);

                context.Cookie = currentOffset.ToString();

                // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                timeLastCall = Utils.sleepTime(timeLastCall); 
                // call VK REST API
                vkRestApi.CallVkFunction(VkFunction.WallGet, context);

                // wait for the user data
                ReadyEvent.WaitOne();

                currentOffset += POSTS_PER_REQUEST;
            }

            groupPostsWriter.Close();

            if (postsWithComments.Count > 0)
            {
                // group comments
                e = new Comment();
                fileName = Utils.GenerateFileName(WorkingFolderTextBox.Text, groupId, e);
                groupCommentsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupCommentsWriter, e);

                // request group comments
                bw.ReportProgress(-1, "Getting comments");
                step = 10000 / postsWithComments.Count;

                timeLastCall = 0;

                for (var i = 0; i < postsWithComments.Count; i++)
                {
                    isRunning = true;
                    totalCount = 0;
                    currentOffset = 0;

                    bw.ReportProgress(step, "Getting " + (i + 1) + " post comments out of " + postsWithComments.Count);

                    while (isRunning)
                    {
                        if (bw.CancellationPending)
                            break;

                        if (currentOffset > totalCount)
                        {
                            // done
                            break;
                        }

                        sb.Length = 0;
                        sb.Append("owner_id=").Append(groupId.ToString()).Append("&"); // group id
                        sb.Append("post_id=").Append(postsWithComments[i]).Append("&"); // post id
                        sb.Append("need_likes=").Append(1).Append("&"); // request likes info
                        sb.Append("offset=").Append(currentOffset).Append("&");
                        sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                        context.Parameters = sb.ToString();
                        context.Cookie = postsWithComments[i].ToString(); // pass post id as a cookie
                        Debug.WriteLine("Request parameters: " + context.Parameters);

                        // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                        timeLastCall = Utils.sleepTime(timeLastCall);
                        // call VK REST API
                        vkRestApi.CallVkFunction(VkFunction.WallGetComments, context);

                        // wait for the user data
                        ReadyEvent.WaitOne();

                        currentOffset += POSTS_PER_REQUEST;
                    }
                }

                groupCommentsWriter.Close();
            }

            // process the likers - they will be added to the posters
            if (likes.Count > 0)
            {
                // request likers ids
                bw.ReportProgress(-1, "Getting likers");
                step = 10000 / likes.Count;

                timeLastCall = 0;

                for (int i = 0; i < this.likes.Count; i++)
                {
                    isRunning = true;
                    //this.totalCount = 0;
                    //this.currentOffset = 0;

                    bw.ReportProgress(step, "Getting " + (i + 1) + " likes out of " + this.likes.Count);

                    if (bw.CancellationPending)
                        break;

                    sb.Length = 0;
                    sb.Append("type=").Append(likes[i].type).Append("&"); // group id
                    sb.Append("owner_id=").Append(likes[i].owner_id).Append("&"); // group id
                    sb.Append("item_id=").Append(likes[i].item_id).Append("&"); // post id
                    sb.Append("count=").Append(LIKES_PER_REQUEST).Append("&");
                    context.Parameters = sb.ToString();
                    Debug.WriteLine("Request parameters: " + context.Parameters);

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.LikesGetList, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();
                }
            }

            // now collect visitors (not members, who left a post or a comment or a like) 
            foreach (var p in posterIds)
            {
                if (!memberIds.Contains(p))
                {
                    // this is a visitor poster
                    visitorIds.Add(p);
                }
            }

            if (visitorIds.Count > 0)
            {
                // group visitors profiles
                e = new Profile();
                fileName = Utils.GenerateFileName(this.WorkingFolderTextBox.Text, groupId, e, "visitor");
                groupVisitorsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupVisitorsWriter, e);

                // request visitors info
                bw.ReportProgress(-1, "Getting visitors");
                step = 10000 / visitorIds.Count;

                timeLastCall = 0;

                for (var i = 0; i < visitorIds.Count; i += 100)
                {
                    isRunning = true;
                    //this.totalCount = 0;
                    //this.currentOffset = 0;

                    bw.ReportProgress(step, "Getting " + (i + 1) + " visitors out of " + visitorIds.Count);

                    if (bw.CancellationPending)
                        break;

                    sb.Length = 0;

                    sb.Append("user_ids=");

                    for (var j = i; j < visitorIds.Count && j < i + 100; ++j)
                    {
                        sb.Append(visitorIds[j]).Append(","); // users
                    }

                    sb.Append("&").Append("fields=").Append(PROFILE_FIELDS);

                    context.Parameters = sb.ToString();
                    Debug.WriteLine("Request parameters: " + context.Parameters);

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.UsersGet, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();

                }

                groupVisitorsWriter.Close();
            }

            //args.Result = TimeConsumingOperation(bw, arg);

            // If the operation was canceled by the user,  
            // set the DoWorkEventArgs.Cancel property to true. 
            if (bw.CancellationPending)
            {
                args.Cancel = true;
            }
        }
예제 #3
0
        // process user info
        private void OnUsersGet(JObject data)
        {
            if (data[VkRestApi.ResponseBody] == null)
            {
                isRunning = false;
                return;
            }

            // now calculate items in response
            var count = data[VkRestApi.ResponseBody].Count();
            Debug.WriteLine("Processing " + count + " users");

            var profiles = new List<Profile>();
            
            // process response body
            for (var i = 0; i < count; ++i)
            {
                var userObj = data[VkRestApi.ResponseBody][i].ToObject<JObject>();
            
                var profile = new Profile();
                profile.id = Utils.getLongField("id", userObj);

                profile.first_name = Utils.getTextField("first_name", userObj);
                profile.last_name = Utils.getTextField("last_name", userObj);
                profile.screen_name = Utils.getTextField("screen_name", userObj);
                profile.deactivated = Utils.getTextField("deactivated", userObj);
                profile.bdate = Utils.getTextField("bdate", userObj);
                profile.city = Utils.getStringField("city", "title", userObj);
                profile.country = Utils.getStringField("country", "title", userObj);

                profile.photo = Utils.getStringField("photo_50", userObj);
                profile.sex = Utils.getStringField("sex", userObj);
                profile.relation = Utils.getStringField("relation", userObj);

                // university name - text
                profile.education = Utils.getTextField("university_name", userObj);

                // status text
                profile.status = Utils.getTextField("status", userObj);

                profiles.Add(profile);

                // add graph visitor vertex
                groupNetworkAnalyzer.addVertex(profile.id, profile.first_name + " " + profile.last_name, "Visitor", userObj);
            }

            if (profiles.Count > 0)
            {
                // update posters
                Utils.PrintFileContent(groupVisitorsWriter, profiles);
            }
        }
예제 #4
0
        // process group member
        private void OnGroupsGetMembers(JObject data, String cookie)
        {
            if (data[VkRestApi.ResponseBody] == null)
            {
                isMembersRunning = false;
                return;
            }

            if (totalCount == 0)
            {
                totalCount = data[VkRestApi.ResponseBody]["count"].ToObject<long>();
                step = (int)(10000 * MEMBERS_PER_REQUEST / totalCount);
            }

            // now calculate items in response
            var count = data[VkRestApi.ResponseBody]["items"].Count();

            var profiles = new List<Profile>();

            // process response body
            for (var i = 0; i < count; ++i)
            {
                var profileObj = data[VkRestApi.ResponseBody]["items"][i].ToObject<JObject>();

                if (profileObj != null)
                {
                    var type = Utils.getStringField("type", profileObj);

                    if (!string.IsNullOrEmpty(type) && !type.Equals("profile")) 
                    {
                        Debug.WriteLine("Ignoring member with type " + type);
                        continue; // must be profile
                    }

                    var profile = new Profile();

                    profile.id = Utils.getLongField("id", profileObj);

                    if (profile.id <= 0)
                    {
                        // probably blocked or deleted account, continue
                        Debug.WriteLine("Ignoring member with bad profile id " + profile.id);
                        continue;
                    }

                    profile.first_name = Utils.getTextField("first_name", profileObj);
                    profile.last_name = Utils.getTextField("last_name", profileObj);
                    profile.screen_name = Utils.getTextField("screen_name", profileObj);
                    profile.deactivated = Utils.getTextField("deactivated", profileObj);
                    profile.bdate = Utils.getTextField("bdate", profileObj);
                    profile.city = Utils.getStringField("city", "title", profileObj);
                    profile.country = Utils.getStringField("country", "title", profileObj);

                    profile.photo = Utils.getStringField("photo_50", profileObj);
                    profile.sex = Utils.getStringField("sex", profileObj);
                    profile.relation = Utils.getStringField("relation", profileObj);
          
                    // university name - text
                    profile.education = Utils.getTextField("university_name", profileObj);

                    // status text
                    profile.status = Utils.getTextField("status", profileObj);

                    profiles.Add(profile);

                    // add graph member vertex
                    memberIds.Add(profile.id);

                    groupNetworkAnalyzer.addVertex(profile.id, profile.first_name + " " + profile.last_name, "Member", profileObj);
                }
            }

            if (profiles.Count > 0)
            {
                // save the posts list
                Utils.PrintFileContent(groupMembersWriter, profiles);
            }
        }
예제 #5
0
        // Async workers
        private void GroupsWork(Object sender, DoWorkEventArgs args)
        {
            // Do not access the form's BackgroundWorker reference directly. 
            // Instead, use the reference provided by the sender parameter.
            var bw = sender as BackgroundWorker;

            // Extract the argument.
            var param = args.Argument as GroupPostsParam;

            if (bw == null ||
                param == null)
            {
                throw new ArgumentException("Illegal arguments for Group Work");
            }

            if (param.From <= param.To)
            {
                postsFromDate = param.From;
                postsToDate = param.To;
            }
            else
            {
                postsFromDate = param.To;
                postsToDate = param.From;
            }

            // working directory
            var workingDir = WorkingFolderTextBox.Text;

            // clear all
            postsWithComments.Clear(); // reset reference list
            likes.Clear(); // reset likes
            posters.Clear(); // reset posters
            posterIds.Clear(); // clear poster ids
            visitorIds.Clear(); // clear visitor ids
            postInfo.Clear(); // clear post infos
            boardPostInfo.Clear(); // reset boards post infos
            topics.Clear(); // clear topics infos
            u2uMatrix.Clear(); // clear u2u matrix

            var context = new VkRestApi.VkRestContext(this.userId, this.authToken);
            var sb = new StringBuilder();
            long timeLastCall = 0;

            networkEntities = param.GroupWall ? "wall" : "";
            networkEntities += param.GroupTopics ? "-topics" : "";

            // gather group statistics
            if (param.JustStats)
            {
                ResetCountersAndGetReady();

                bw.ReportProgress(1, "Getting group stats");

                sb.Length = 0;
                // TODO check if it takes negative number
                sb.Append("group_id=").Append(groupId).Append("&");
                sb.Append("date_from=").Append(this.postsFromDate.ToString("yyyy-MM-dd")).Append("&");
                sb.Append("date_to=").Append(this.postsToDate.ToString("yyyy-MM-dd"));
                context.Parameters = sb.ToString();
                Debug.WriteLine("Download parameters: " + context.Parameters);

                // call VK REST API
                vkRestApi.CallVkFunction(VkFunction.StatsGet, context);
                return;
            }

            IEntity e;
            string fileName;

            if (param.GroupWall)
            {
                // group posts
                e = new Post();
                fileName = Utils.GenerateFileName(workingDir, groupId, e);
                groupPostsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupPostsWriter, e);

                e = new PostCopyHistory(0, null);
                fileName = Utils.GenerateFileName(workingDir, groupId, e);
                groupPostsCopyHistoryWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupPostsCopyHistoryWriter, e);

                ResetCountersAndGetReady();

                // request group posts
                bw.ReportProgress(-1, "Getting posts");
                while (ShellContinue(bw))
                {
                    sb.Length = 0;
                    sb.Append("owner_id=").Append(groupId.ToString()).Append("&");
                    sb.Append("offset=").Append(currentOffset).Append("&");
                    sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                    context.Parameters = sb.ToString();
                    Debug.WriteLine("Download parameters: " + context.Parameters);

                    context.Cookie = currentOffset.ToString();

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.WallGet, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();
                    bw.ReportProgress(step, "Getting " + currentOffset + " posts out of " + totalCount);
                }

                groupPostsWriter.Close();
                groupPostsCopyHistoryWriter.Close();

                if (postsWithComments.Count > 0 &&
                    !bw.CancellationPending)
                {
                    // group comments
                    e = new Comment();
                    fileName = Utils.GenerateFileName(workingDir, groupId, e);
                    groupCommentsWriter = File.CreateText(fileName);
                    Utils.PrintFileHeader(groupCommentsWriter, e);

                    // request group comments
                    bw.ReportProgress(-1, "Getting comments");

                    timeLastCall = 0;

                    for (int i = 0; i < postsWithComments.Count && !bw.CancellationPending; i++)
                    {
                        ResetCountersAndGetReady();
                        step = CalcStep(postsWithComments.Count);

                        bw.ReportProgress(step,
                            "Getting " + (i + 1) + " comments out of " + postsWithComments.Count);

                        while (ShellContinue(bw))
                        {
                            sb.Length = 0;
                            sb.Append("owner_id=").Append(groupId).Append("&"); // group id
                            sb.Append("post_id=").Append(postsWithComments[i]).Append("&"); // post id
                            sb.Append("need_likes=").Append(1).Append("&"); // request likes info
                            sb.Append("offset=").Append(currentOffset).Append("&");
                            sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                            context.Parameters = sb.ToString();
                            context.Cookie = postsWithComments[i].ToString(); // pass post id as a cookie
                            Debug.WriteLine("Request parameters: " + context.Parameters);

                            // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                            timeLastCall = Utils.sleepTime(timeLastCall);
                            // call VK REST API
                            vkRestApi.CallVkFunction(VkFunction.WallGetComments, context);

                            // wait for the user data
                            ReadyEvent.WaitOne();
                        }
                    }

                    groupCommentsWriter.Close();
                }
            }

            if (param.GroupTopics)
            {
                // process group board topics and comments
                e = new BoardTopic();
                fileName = Utils.GenerateFileName(workingDir, groupId, e);
                groupBoardTopicsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupBoardTopicsWriter, e);

                e = new Comment();
                fileName = Utils.GenerateFileName(workingDir, groupId, e, "board");
                groupBoardCommentsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupBoardCommentsWriter, e);

                ResetCountersAndGetReady();

                bw.ReportProgress(-1, "Getting board topics");

                // get group board topics
                while (ShellContinue(bw))
                {
                    sb.Length = 0;
                    sb.Append("group_id=").Append(Math.Abs(groupId)).Append("&");
                    sb.Append("offset=").Append(currentOffset).Append("&");
                    sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                    context.Parameters = sb.ToString();
                    Debug.WriteLine("Download parameters: " + context.Parameters);

                    context.Cookie = currentOffset.ToString();

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.BoardGetTopics, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();
                    bw.ReportProgress(step, "Getting board topics " + currentOffset + " out of " + totalCount);
                }

                bw.ReportProgress(-1, "Getting board comments");

                // collect comments from all board topics
                for (var i = 0; i < topics.Count; i++)
                {
                    if (bw.CancellationPending)
                        break; // canceled

                    if (topics[i].is_closed || topics[i].comments == 0)
                        continue; // empty or closed topic - ignore

                    ResetCountersAndGetReady();
                    step = CalcStep(topics.Count);
                    bw.ReportProgress(step, "Getting comments for board " + i + " / " + topics.Count);

                    while (ShellContinue(bw))
                    {
                        sb.Length = 0;
                        sb.Append("group_id=").Append(Math.Abs(groupId)).Append("&"); // group id
                        sb.Append("topic_id=").Append(topics[i].id).Append("&"); // post id
                        sb.Append("need_likes=").Append(1).Append("&"); // need likes count
                        sb.Append("offset=").Append(currentOffset).Append("&");
                        sb.Append("count=").Append(POSTS_PER_REQUEST).Append("&");
                        context.Parameters = sb.ToString();
                        context.Cookie = topics[i].id.ToString(); // pass topic id as a cookie
                        Debug.WriteLine("Request parameters: " + context.Parameters);

                        // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                        timeLastCall = Utils.sleepTime(timeLastCall);
                        // call VK REST API
                        vkRestApi.CallVkFunction(VkFunction.BoardGetComments, context);

                        // wait for the user data
                        ReadyEvent.WaitOne();
                        bw.ReportProgress(0,
                            "Getting comments " + currentOffset + " / " + totalCount + " for board " + i + " / " +
                            topics.Count);
                    }
                }

                groupBoardTopicsWriter.Close();
                groupBoardCommentsWriter.Close();
            }

            // process the likes from wall and board topics
            if (likes.Count > 0 &&
                !bw.CancellationPending)
            {
                // request likers ids
                ResetCountersAndGetReady();
                bw.ReportProgress(-1, "Getting likers");

                timeLastCall = 0;
                step = CalcStep(likes.Count);

                for (var i = 0; i < likes.Count; i++)
                {
                    isRunning = true;
                    bw.ReportProgress(step, "Getting likes " + (i + 1) + " / " + likes.Count);

                    if (bw.CancellationPending)
                        break;

                    sb.Length = 0;
                    sb.Append("type=").Append(likes[i].type).Append("&"); // type
                    sb.Append("owner_id=").Append(likes[i].owner_id).Append("&"); // group id
                    sb.Append("item_id=").Append(likes[i].item_id).Append("&"); // post id
                    sb.Append("count=").Append(LIKES_PER_REQUEST).Append("&");
                    context.Parameters = sb.ToString();
                    context.Cookie = likes[i].item_id.ToString(); // pass post/comment id as a cookie
                    Debug.WriteLine("Request parameters: " + context.Parameters);

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.LikesGetList, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();
                }
            }

            // now collect info about posters (users or visitors who left post, comment or like) 
            visitorIds.AddRange(posterIds);

            if (visitorIds.Count > 0 &&
                !bw.CancellationPending)
            {
                // group visitors profiles
                e = new Profile();
                fileName = Utils.GenerateFileName(workingDir, groupId, e, networkEntities);
                groupVisitorsWriter = File.CreateText(fileName);
                Utils.PrintFileHeader(groupVisitorsWriter, e);

                // request visitors info
                bw.ReportProgress(-1, "Getting visitors");
                step = CalcStep(visitorIds.Count, 100);

                timeLastCall = 0;

                for (var i = 0; i < visitorIds.Count; i += 100)
                {
                    isRunning = true;

                    bw.ReportProgress(step, "Getting " + (i + 1) + " visitors out of " + visitorIds.Count);

                    if (bw.CancellationPending)
                        break;

                    sb.Length = 0;

                    sb.Append("user_ids=");

                    for (var j = i; j < visitorIds.Count && j < i + 100; ++j)
                    {
                        sb.Append(visitorIds[j]).Append(","); // users
                    }

                    sb.Append("&").Append("fields=").Append(PROFILE_FIELDS);

                    context.Parameters = sb.ToString();
                    Debug.WriteLine("Request parameters: " + context.Parameters);

                    // play nice, sleep for 1/3 sec to stay within 3 requests/second limits
                    timeLastCall = Utils.sleepTime(timeLastCall);
                    // call VK REST API
                    vkRestApi.CallVkFunction(VkFunction.UsersGet, context);

                    // wait for the user data
                    ReadyEvent.WaitOne();
                }

                groupVisitorsWriter.Close();
            }


            // update group posts/likes count (posted from group id)
            Poster groupPoster;
            if (posters.TryGetValue((long)this.groupId, out groupPoster))
            {
                var attr = dictionaryFromPoster(groupPoster);
                // update poster vertex attributes
                contentNetworkAnalyzer.UpdateVertexAttributes((long)groupId, attr);
            }


            // If the operation was canceled by the user,  
            // set the DoWorkEventArgs.Cancel property to true. 
            args.Cancel = bw.CancellationPending;

            // complete the job
            //args.Result = 
        }
예제 #6
0
        // process user info
        private void OnUsersGet(JObject data)
        {
            if (data[VkRestApi.ResponseBody] == null)
            {
                isRunning = false;
                return;
            }

            // calculate items in response
            var count = data[VkRestApi.ResponseBody].Count();
            Debug.WriteLine("Processing " + count + " users");

            var profiles = new List<Profile>();

            // process response body
            for (var i = 0; i < count; ++i)
            {
                var userObj = data[VkRestApi.ResponseBody][i].ToObject<JObject>();

                var profile = new Profile();
                profile.id = Utils.getLongField("id", userObj);

                profile.first_name = Utils.getTextField("first_name", userObj);
                profile.last_name = Utils.getTextField("last_name", userObj);
                profile.screen_name = Utils.getTextField("screen_name", userObj);
                profile.bdate = Utils.getTextField("bdate", userObj);
                profile.city = Utils.getStringField("city", "title", userObj);
                profile.country = Utils.getStringField("country", "title", userObj);

                profile.photo = Utils.getStringField("photo_50", userObj);
                profile.sex = Utils.getStringField("sex", userObj);
                profile.relation = Utils.getStringField("relation", userObj);

                // university name - text
                profile.education = Utils.getTextField("university_name", userObj);

                // status text
                profile.status = Utils.getTextField("status", userObj);

                profiles.Add(profile);

                // add graph visitor vertex
                contentNetworkAnalyzer.AddVertex(profile.id, profile.first_name + " " + profile.last_name, "User", userObj);

                Poster p;
                if (posters.TryGetValue(profile.id, out p))
                {
                    var attr = dictionaryFromPoster(p);
                    // update poster vertex attributes
                    contentNetworkAnalyzer.UpdateVertexAttributes(profile.id, attr);
                }
                else
                {
                    Debug.WriteLine("User/Poster not found with id " + profile.id);
                }
            }

            if (profiles.Count > 0)
            {
                // update posters
                Utils.PrintFileContent(groupVisitorsWriter, profiles);
            }
        }