Esempio n. 1
0
        /// <summary>
        /// Fetches Data wrt given time interval
        /// </summary>
        /// <param name="taskInfo">contains the time stamps for which data is to be fetched</param>
        /// <param name="sourceInfo">source Info</param>
        public override async Task <List <ItemMetadata> > FetchData(ConnectorTask taskInfo, string sourceInfo)
        {
            SourceInfoFB        fbSourceInfo = JsonConvert.DeserializeObject <SourceInfoFB>(sourceInfo);
            List <ItemMetadata> itemMetadata = new List <ItemMetadata>();

            await FetchPosts(taskInfo, fbSourceInfo, itemMetadata);
            await FetchUpdates(taskInfo, fbSourceInfo, itemMetadata);

            return(itemMetadata);
        }
Esempio n. 2
0
        public static string GetFeedUrl(ConnectorTask taskInfo, SourceInfoFB sourceInfo)
        {
            UriBuilder uriBuilder = new UriBuilder(SettingsFB.FacebookBaseUrl);

            uriBuilder.Path += $"/{sourceInfo.PageId}/feed";
            var query = HttpUtility.ParseQueryString(uriBuilder.Query);

            query["fields"]  = SettingsFB.FacebookQueryFields;
            query["since"]   = taskInfo.StartTime.ToString("yyyy-MM-ddTHH:mm:ss");
            query["until"]   = taskInfo.EndTime.ToString("yyyy-MM-ddTHH:mm:ss");
            uriBuilder.Query = query.ToString();
            return(HttpUtility.UrlDecode(uriBuilder.ToString()));
        }
        public async Task <string> GetResourceInfo(string userToken, string resourceId)
        {
            Dictionary <string, string> queryParams = new Dictionary <string, string>();

            queryParams.Add(this.accessTokenParam, userToken);
            queryParams.Add(this.fieldsParam, "name,access_token");
            PageFB response = await this.Client.GetRequestAsync <PageFB>(resourceId, null, queryParams, new CancellationTokenSource().Token);

            SourceInfoFB sourceInfo = new SourceInfoFB();

            sourceInfo.PageId      = response?.Id;
            sourceInfo.PageName    = response?.Name;
            sourceInfo.AccessToken = response?.AccessToken;
            return(JsonConvert.SerializeObject(sourceInfo));
        }
        /// <summary>
        /// Subscribe page feed
        /// </summary>
        /// <param name="sourceInfoJson">source info has all the information of the page</param>
        /// <returns>Whether subscribed or not</returns>
        public override async Task <bool> Subscribe(string sourceInfoJson)
        {
            SourceInfoFB sourceInfo = JsonConvert.DeserializeObject <SourceInfoFB>(sourceInfoJson);
            Dictionary <string, string> queryParams = new Dictionary <string, string>();

            queryParams.Add(this.accessTokenParam, sourceInfo.AccessToken);

            SubscribeWebhookResponseFB response = await this.Client.PostRequestAsync <Dictionary <string, string>, SubscribeWebhookResponseFB>(sourceInfo.PageId + "/subscribed_apps", null, queryParams, new CancellationTokenSource().Token);

            if (response != null && response.Success == true)
            {
                return(true);
            }

            Trace.TraceError("Subscription failed for page id {0}", sourceInfo.PageId);
            throw new Exception("Internal Server Error");
        }
Esempio n. 5
0
        /// <summary>
        /// Fetches updated posts
        /// </summary>
        /// <param name="taskInfo">info related to task, eg accessToken</param>
        /// <param name="sourceInfo">contains data source information</param>
        public async Task FetchUpdates(ConnectorTask taskInfo, SourceInfoFB sourceInfo, List <ItemMetadata> itemMetadata)
        {
            if (taskInfo.DirtyEntities != null && taskInfo.DirtyEntities?.Count != 0)
            {
                Trace.TraceInformation($"Number of dirty posts: {taskInfo.DirtyEntities?.Count}");

                string url = QueryFB.GetUpdatedPostsUrl(taskInfo);

                AuthenticationHeaderValue   header = new AuthenticationHeaderValue("Bearer", sourceInfo.AccessToken);
                Dictionary <string, PostFB> dict   = await this.downloader.GetWebContent <Dictionary <string, PostFB>, ErrorsFB>(url, header);

                foreach (KeyValuePair <string, PostFB> postEntry in dict)
                {
                    await HandlePost(postEntry.Value, header, sourceInfo.PageId, sourceInfo.PageName, taskInfo, itemMetadata);
                }
            }
        }
        public override async Task <bool> Unsubscribe(string sourceInfoJson)
        {
            SourceInfoFB sourceInfo = JsonConvert.DeserializeObject <SourceInfoFB>(sourceInfoJson);
            Dictionary <string, string> queryParams = new Dictionary <string, string>();

            queryParams.Add(this.accessTokenParam, sourceInfo.AccessToken);
            try
            {
                SubscribeWebhookResponseFB response = await this.Client.DeleteRequestAsync <SubscribeWebhookResponseFB>(sourceInfo.PageId + "/subscribed_apps", queryParams, new CancellationTokenSource().Token);

                if (response != null && response.Success == true)
                {
                    return(true);
                }
            }
            catch (Exception e)
            {
                Trace.TraceError($"Failed to unsubscribe. Exception occured: {e.Message}, {e.StackTrace}");
            }

            Trace.TraceError("UnSubscribe failed for page id {0}", sourceInfo.PageId);
            return(false);
        }
Esempio n. 7
0
        /// <summary>
        /// Fetches Posts wrt given time interval
        /// </summary>
        /// <param name="taskInfo">contains the time stamps for which data is to be fetched</param>
        /// <param name="sourceInfo">contains data source information</param>
        public async Task FetchPosts(ConnectorTask taskInfo, SourceInfoFB sourceInfo, List <ItemMetadata> itemMetadata)
        {
            string url = QueryFB.GetFeedUrl(taskInfo, sourceInfo);

            Trace.TraceInformation($"Fetching Data from Facebook, TenantId: {taskInfo.TenantId}, JobId: {taskInfo.JobId}, StartTime: {taskInfo.StartTime.ToString()}, EndTime: {taskInfo.EndTime.ToString()}");
            AuthenticationHeaderValue header = new AuthenticationHeaderValue("Bearer", sourceInfo.AccessToken);

            do
            {
                PostListFB list = await this.downloader.GetWebContent <PostListFB, ErrorsFB>(url, header);

                PostFB[] postList       = list.Data;
                PagingFB pagingPointers = list.Paging;
                if (postList.Count() == 0)
                {
                    break;
                }
                foreach (PostFB post in postList)
                {
                    await HandlePost(post, header, sourceInfo.PageId, sourceInfo.PageName, taskInfo, itemMetadata);
                }
                url = pagingPointers?.Next;
            } while (url != null);
        }