/// <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));
            }
        }
Esempio n. 4
0
        /// <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));
            }
        }
Esempio n. 12
0
        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));
            }
        }
Esempio n. 13
0
        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));
            }
        }
Esempio n. 16
0
        /// <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));
            }
        }
Esempio n. 17
0
        /// <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));
            }
        }