/// <summary> /// To get scheduled posts. /// https://graph.facebook.com/101389545124742/scheduled_posts /// </summary> /// <param name="token"></param> /// <param name="account"></param> /// <returns></returns> public FacebookGraphResult <List <FacebookPost> > GetScheduledPosts(OAuthv2AccessToken token, FacebookPageInformation account) { var _fbRestClient = new RestClient(string.Format("https://graph.facebook.com/{0}/scheduled_posts", account.Id)) { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.GET); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <List <FacebookPost> > .Fail(response.Content)); } JObject result = JObject.Parse(response.Content); var posts = JsonConvert.DeserializeObject <List <FacebookPost> >(result["data"].ToString()); return(FacebookGraphResult <List <FacebookPost> > .Success(posts)); } catch (Exception ex) { return(FacebookGraphResult <List <FacebookPost> > .Fail(ex.Message)); } }
/// <summary> /// FOR SCHEDULED PUBLISH. /// </summary> /// <param name="token"></param> /// <param name="page"></param> /// <param name="pathToVideo"></param> /// <param name="description"></param> /// <param name="unixTimestamp"></param> /// <returns></returns> public FacebookGraphResult <FacebookUploadVideoResponse> UploadVideo(OAuthv2AccessToken token, FacebookPageInformation page, string pathToVideo, string description, long unixTimestamp) { var _fbRestClient = new RestClient($"https://graph-video.facebook.com/v9.0/{page.Id}/videos") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); request.AddFile("source", pathToVideo); request.AddParameter("description", description); request.AddParameter("published", "false"); request.AddParameter("scheduled_publish_time", unixTimestamp); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <FacebookUploadVideoResponse> .Fail(response.Content)); } var uploadVideoResponse = JsonConvert.DeserializeObject <FacebookUploadVideoResponse>(response.Content); return(FacebookGraphResult <FacebookUploadVideoResponse> .Success(uploadVideoResponse)); } catch (Exception ex) { return(FacebookGraphResult <FacebookUploadVideoResponse> .Fail(ex.Message)); } }
/// <summary> /// FOR VIDEO. /// </summary> /// <param name="token"></param> /// <param name="account"></param> /// <param name="videoPath"></param> /// <param name="description"></param> /// <returns></returns> public LinkedInAPIResult <bool> SharePost(OAuthv2AccessToken token, LinkedInAccount account, string videoPath, string description) { try { var registerUploadResponse = RegisterVideoUpload(token, LinkedInRegisterUploadRequest.Create(account.UserId, account.PersonalOrOrganization)); if (!registerUploadResponse.IsSuccessful) { return(LinkedInAPIResult <bool> .Fail("An error has occured while trying to register video upload on LinkedIn. Details: " + registerUploadResponse.Message)); } var uploadResponse = UploadVideo(token, videoPath, registerUploadResponse.Entity.Value.UploadMechanism.ComLinkedinDigitalmediaUploadingMediaUploadHttpRequest.UploadUrl); if (!uploadResponse.IsSuccessful) { return(LinkedInAPIResult <bool> .Fail("An error has occured while trying to upload video on LinkedIn. Details: " + uploadResponse.Message)); } var createUgcPostResponse = CreateOrganicUGCPost(token, RequestCreateUGCPost.Create(account, registerUploadResponse.Entity.Value.Asset, description)); if (!createUgcPostResponse.IsSuccessful) { return(LinkedInAPIResult <bool> .Fail("An error has occured while trying to creating organic UGC post with video on LinkedIn. Details: " + createUgcPostResponse.Message)); } return(LinkedInAPIResult <bool> .Success(true)); } catch (Exception ex) { return(LinkedInAPIResult <bool> .Fail("An error has occured while trying publish post with video on LinkedIn. Details: " + ex.Message)); } }
/// <summary> /// Uploads a media file to LinkedIn /// </summary> /// <param name="token"></param> /// <param name="uploadUrl"></param> /// <param name="bytes"></param> /// <returns></returns> public LinkedInAPIResult <HttpResponseMessage> UploadMedia(OAuthv2AccessToken token, string uploadUrl, byte[] bytes) { /* * Use the uploadUrl from the previous step to upload the image. Use a PUT method to upload the image. * The upload call requires a valid OAuth token in the 'Authorization' header. This is different than the upload video call which does not accept an OAuth token. */ try { using (var httpClient = new HttpClient()) { using (var request = new HttpRequestMessage(new HttpMethod("PUT"), uploadUrl)) { request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {token.AccessToken}"); request.Content = new ByteArrayContent(bytes); var response = httpClient.SendAsync(request).Result; return(LinkedInAPIResult <HttpResponseMessage> .Success(response)); } } } catch (System.Exception ex) { return(LinkedInAPIResult <HttpResponseMessage> .Fail("An error has occured while trying to upload media to LinkedIn. Details: " + ex.Message)); } }
/// <summary> /// 400 urn:li:developerApplication:{developer application ID} does not have permission to create ugc posts /// Indicates your developer application is not allowlisted to create video UGC Posts. /// UGC Post video creation is restricted to approved applications only. /// </summary> /// <param name="token"></param> /// <param name="createUgcPostRequest"></param> /// <returns></returns> public LinkedInAPIResult <bool> CreateOrganicUGCPost(OAuthv2AccessToken token, RequestCreateUGCPost createUgcPostRequest) { var _linkedInRestClient = new RestClient("https://api.linkedin.com/v2/ugcPosts") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); request.AddJsonBody(createUgcPostRequest.ToJson()); try { var response = _linkedInRestClient.Execute(request); if (!response.IsSuccessful) { return(LinkedInAPIResult <bool> .Fail(response.Content)); } return(LinkedInAPIResult <bool> .Success(true)); } catch (Exception ex) { return(LinkedInAPIResult <bool> .Fail(ex.Message)); } }
/// <summary> /// FOR TEXT & IMAGE OR ONLY TEXT. /// </summary> /// <param name="token"></param> /// <param name="postInJson"></param> /// <returns></returns> public LinkedInAPIResult <LinkedInPost> SharePost(OAuthv2AccessToken token, string postInJson) { var _linkedInRestClient = new RestClient("https://api.linkedin.com/v2/shares") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); request.AddJsonBody(postInJson); try { var response = _linkedInRestClient.Execute(request); if (!response.IsSuccessful) { return(LinkedInAPIResult <LinkedInPost> .Fail(response.Content)); } var resultPost = JsonConvert.DeserializeObject <LinkedInPost>(response.Content); return(LinkedInAPIResult <LinkedInPost> .Success(resultPost)); } catch (Exception ex) { return(LinkedInAPIResult <LinkedInPost> .Fail(ex.Message)); } throw new NotImplementedException(); }
/// <summary> /// For fields: https://developers.facebook.com/docs/graph-api/reference/user/#fields /// </summary> /// <param name="token"></param> /// <param name="fields"></param> public FacebookGraphResult <FacebookPublicInformation> GetPublicInformation(OAuthv2AccessToken token, string[] fields) { var _fbRestClient = new RestClient(string.Format("https://graph.facebook.com/me?fields={0}", string.Join(",", fields))) { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { FacebookGraphResult <FacebookPublicInformation> .Fail(response.Content); } var entity = JsonConvert.DeserializeObject <FacebookPublicInformation>(response.Content); return(FacebookGraphResult <Entities.FacebookPublicInformation> .Success(entity)); } catch (Exception ex) { return(FacebookGraphResult <Entities.FacebookPublicInformation> .Fail(ex.Message)); } }
/// <summary> /// https://developers.facebook.com/docs/pages/managing /// Works with user access_token /// </summary> /// <param name="token"></param> /// <param name="userId"></param> /// <returns></returns> public FacebookGraphResult <List <FacebookPageInformation> > GetPageList(OAuthv2AccessToken token) { var _fbRestClient = new RestClient("https://graph.facebook.com/me/accounts") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.GET); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <List <FacebookPageInformation> > .Fail(response.Content)); } JObject obj = JObject.Parse(response.Content); var data = obj["data"]; var paging = obj["paging"]; var pageList = JsonConvert.DeserializeObject <List <FacebookPageInformation> >(data.ToString()); return(FacebookGraphResult <List <FacebookPageInformation> > .Success(pageList)); } catch (Exception e) { return(FacebookGraphResult <List <FacebookPageInformation> > .Fail(e.Message)); } }
/// <summary> /// FOR CHUNKED UPLOAD. /// </summary> /// <param name="token"></param> /// <param name="page"></param> /// <param name="fileSizeInBytes"></param> /// <returns></returns> public FacebookGraphResult <FacebookUploadSession> StartVideoUploadSession(OAuthv2AccessToken token, FacebookPageInformation page, string fileSizeInBytes) { var _fbRestClient = new RestClient($"https://graph-video.facebook.com/v9.0/{page.Id}/videos?upload_phase=start&file_size={fileSizeInBytes}") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <FacebookUploadSession> .Fail(response.Content)); } var uploadSession = JsonConvert.DeserializeObject <FacebookUploadSession>(response.Content); return(FacebookGraphResult <FacebookUploadSession> .Success(uploadSession)); } catch (Exception ex) { return(FacebookGraphResult <FacebookUploadSession> .Fail(ex.Message)); } }
/// <summary> /// ONLY TEXT CONTENT /// Schedules a post. /// https://developers.facebook.com/docs/pages/publishing/ /// </summary> /// <param name="token"></param> /// <param name="account"></param> /// <param name="content"></param> /// <returns></returns> public FacebookGraphResult <bool> SchedulePost(OAuthv2AccessToken token, FacebookPageInformation account, string content, long unixTimeStamp) { var _fbRestClient = new RestClient(string.Format("https://graph.facebook.com/{0}/feed?published=false&message={1}&scheduled_publish_time={2}", account.Id, content, unixTimeStamp)) { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <bool> .Fail(response.Content)); } return(FacebookGraphResult <bool> .Success(true)); } catch (Exception ex) { return(FacebookGraphResult <bool> .Fail(ex.Message)); } }
/// <summary> /// https://developers.facebook.com/docs/facebook-login/access-tokens/refreshing/ /// </summary> /// <param name="token"></param> /// <param name="appId"></param> /// <param name="appSecret"></param> /// <returns></returns> public FacebookGraphResult <FacebookLongLivedToken> GetLongLivedToken(OAuthv2AccessToken token, string appId, string appSecret) { var _fbRestClient = new RestClient("https://graph.facebook.com/v8.0/oauth/access_token") { }; var request = new RestRequest(Method.GET); request.AddParameter("grant_type", "fb_exchange_token"); request.AddParameter("client_id", appId); request.AddParameter("client_secret", appSecret); request.AddParameter("fb_exchange_token", token.AccessToken); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <FacebookLongLivedToken> .Fail(response.Content)); } var longLivedToken = JsonConvert.DeserializeObject <FacebookLongLivedToken>(response.Content); return(FacebookGraphResult <FacebookLongLivedToken> .Success(longLivedToken)); } catch (Exception e) { return(FacebookGraphResult <FacebookLongLivedToken> .Fail(e.Message)); } }
public LinkedInAPIResult <LinkedInUploadStatusResponse> CheckUploadStatus(OAuthv2AccessToken token, string asset) { RestClient restClient = new RestClient($"https://api.linkedin.com/v2/assets/{asset}") { Authenticator = new JwtAuthenticator(token.AccessToken) }; try { RestRequest restRequest = new RestRequest(Method.GET); var response = restClient.Execute(restRequest); var result = JsonConvert.DeserializeObject <LinkedInUploadStatusResponse>(response.Content); return(LinkedInAPIResult <LinkedInUploadStatusResponse> .Success(result)); } catch (Exception ex) { return(LinkedInAPIResult <LinkedInUploadStatusResponse> .Fail("An error has occured while trying get upload status from LinkedIn. Details: " + ex.Message)); } }
public LinkedInAPIResult <bool> UploadVideo(OAuthv2AccessToken token, string videoPath, string uploadUrl) { RestClient restClient = new RestClient(uploadUrl) { Authenticator = new JwtAuthenticator(token.AccessToken) }; try { RestRequest restRequest = new RestRequest(Method.POST); restRequest.AddHeader("Content-Type", "application/octet-stream"); restRequest.AddFile("upload-file", videoPath); var response = restClient.Execute(restRequest); return(LinkedInAPIResult <bool> .Success(true)); } catch (Exception ex) { return(LinkedInAPIResult <bool> .Fail("An error has occured while trying to upload media to LinkedIn. Details: " + ex.Message)); } }
/// <summary> /// VIDEO-DESCRIPTION. /// Schedules a post. /// https://developers.facebook.com/docs/pages/publishing/ /// </summary> /// <param name="token"></param> /// <param name="link"></param> /// <param name="content"></param> /// <param name="account"></param> /// <param name="unixTimeStamp"></param> /// <returns></returns> public FacebookGraphResult <bool> SchedulePost(OAuthv2AccessToken token, string pathToVideo, FacebookPageInformation account, string description, long unixTimeStamp) { var uploadVideoResult = UploadVideo(token, account, pathToVideo, description, unixTimeStamp); if (!uploadVideoResult.IsSuccessful) { return(FacebookGraphResult <bool> .Fail("An error has occured while trying to upload video to facebook via Graph API. Details: " + uploadVideoResult.Message)); } var _fbRestClient = new RestClient($"https://graph.facebook.com/{account.Id}/videos") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); request.AddParameter("id", uploadVideoResult.Entity.VideoId); try { //BadRequest dönmesine rağmen başarılı bu. (buraya exceptional bir şey eklemeliyiz.) //Facebook dev ekibiyle iletişime de geçilebilir. var response = _fbRestClient.Execute(request); //if(response.StatusCode.Equals(HttpStatusCode.BadRequest)) //if (!response.IsSuccessful) //{ // return FacebookGraphResult<bool>.Fail(response.Content); //} return(FacebookGraphResult <bool> .Success(true)); } catch (Exception ex) { return(FacebookGraphResult <bool> .Fail(ex.Message)); } }
/// <summary> /// Link and comment (text) /// </summary> /// <param name="token"></param> /// <param name="content"></param> /// <param name="account"></param> /// <param name="link"></param> /// <returns></returns> public FacebookGraphResult <bool> PublishPost(OAuthv2AccessToken token, string content, FacebookPageInformation account, string link) { var _fbRestClient = new RestClient($"https://graph.facebook.com/{account.Id}/feed?link={link}&message={content}&access_token={token.AccessToken}") { }; var request = new RestRequest(Method.POST); try { var response = _fbRestClient.Execute(request); if (!response.IsSuccessful) { return(FacebookGraphResult <bool> .Fail(response.Content)); } return(FacebookGraphResult <bool> .Success(true)); } catch (Exception ex) { return(FacebookGraphResult <bool> .Fail(ex.Message)); } }
/// <summary> /// Used to get FirstName, LastName, Id, Profile Picture /// </summary> /// <param name="token"></param> /// <returns></returns> public LinkedInAPIResult <LinkedInPublicInformation> GetLinkedInPublicInformation(OAuthv2AccessToken token, string[] fields) { var _linkedInRestClient = new RestClient(string.Format("https://api.linkedin.com/v2/me?fields={0}", string.Join(",", fields))) { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.GET); try { var response = _linkedInRestClient.Execute(request); if (!response.IsSuccessful) { LinkedInAPIResult <LinkedInPublicInformation> .Fail(response.Content); } var publicInfo = JsonConvert.DeserializeObject <LinkedInPublicInformation>(response.Content); return(LinkedInAPIResult <LinkedInPublicInformation> .Success(publicInfo)); } catch (Exception ex) { return(LinkedInAPIResult <LinkedInPublicInformation> .Fail(ex.Message)); } }
/// <summary> /// LinkedIn register upload /// </summary> /// <param name="token"></param> /// <returns></returns> public LinkedInAPIResult <LinkedInRegisterUploadResponse> RegisterVideoUpload(OAuthv2AccessToken token, LinkedInRegisterUploadRequest registerUploadRequestObj) { var _linkedInRestClient = new RestClient("https://api.linkedin.com/v2/assets?action=registerUpload") { Authenticator = new JwtAuthenticator(token.AccessToken) }; var request = new RestRequest(Method.POST); request.AddJsonBody(registerUploadRequestObj.ToJson()); try { var response = _linkedInRestClient.Execute(request); if (!response.IsSuccessful) { return(LinkedInAPIResult <LinkedInRegisterUploadResponse> .Fail(response.Content)); } var registerUploadResponse = JsonConvert.DeserializeObject <LinkedInRegisterUploadResponse>(response.Content); return(LinkedInAPIResult <LinkedInRegisterUploadResponse> .Success(registerUploadResponse)); } catch (Exception ex) { return(LinkedInAPIResult <LinkedInRegisterUploadResponse> .Fail(ex.Message)); } }