/// <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); }
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"); }
/// <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); }
/// <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); }