如何在 ASP.Net Core 2.0 中使用图表 api Post 到 facebook?

How to Post to facebook using graph api in ASP.Net Core 2.0?

我已经在 OAuth 中拥有经过身份验证的用户。我有我的应用程序 ID,我扩展的访问令牌。 Facebook 最近将他们的 Graph Api 更新到 v3.1。我在网上搜索过但没有运气。我怎样才能在我的 Create-Post 控制器中获取 post 以保存到我的数据库和 post 到 facebook。 Post作为页面或 post 到用户墙示例会很棒,请在 ASP.NET Core MVC 中。

我已经尝试了网上的所有方法,但没有任何效果。我已经删除了我的 post 控制器上的编辑,因此它现在只能将 user-post 存储到我的数据库中。请各位大侠帮忙解决一下这个问题

//post create post
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Create(Post post)
        {
            string url = "http://graph.facebook.com/v3.1/";
            string myAppID = "my_app_id";
            string myAccessToken = "my_access_token";


            if (ModelState.IsValid)
            {
                _db.Add(post);
                await _db.SaveChangesAsync();


                return RedirectToAction(nameof(Index), new { userId = post.UserId });
            }
            return View(post);

我的网站未获准在 Facebook publish_pages 后,我也遇到了同样的问题。

我建议您尝试使用 javascript SDK 来做到这一点,它在我遇到 .NET-core 困难时帮助了我。 link 可能对您有所帮助:

https://developers.facebook.com/docs/javascript/quickstart

<script>
  window.fbAsyncInit = function() {
    FB.init({
      appId            : 'your-app-id',
      autoLogAppEvents : true,
      xfbml            : true,
      version          : 'v3.1'
    });
  };

  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "https://connect.facebook.net/en_US/sdk.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

这只是为了加载 SDK,您仍然需要一个 getInfo 函数和一个 post 函数。这就是我的做法,试试看效果如何。祝一切顺利。

<script>
var access;
  function getInfo(){
   FB.api('/me','GET',{fields: 'id,name,email'},
   function(response){
    document.getElementById('status').innerHTML = response.email;
    
    access = document.getElementById('mapping').innerHTML = response.id;
    return access;
   });
  }
  
  
  
  function post(){
   var x = { message : document.getElementById('textinput').value,
      access_token : access};
   FB.api('/me/feed','POST',x,
    function(response){
     document.getElementById('testing').innerHTML = x.message;
    });
  }
</script>

开发者大家好!如果你们中的任何人仍然遇到从 .NET Core 2.0 应用程序发布到 Facebook 的问题,这里是解决方案。

首先,来自 Facebook 的文档非常具有误导性(对我自己而言)。事实证明,您需要的实际访问令牌是 页面访问令牌。在对 API 进行查询时,您不需要应用访问 token/user 访问令牌,您只需要页面访问令牌。这当然只有在您是应用程序和页面管理员时才有效,此时不需要应用程序审查。我希望您能弄清楚如何将此访问令牌扩展为永不过期 here

public class FacebookController : Controller
{
    readonly string _accessToken;
    readonly string _pageID;
    readonly string _facebookAPI = "https://graph.facebook.com/";
    readonly string _pageEdgeFeed = "feed";

    public FacebookController(string accessToken, string pageID)
    {
        _accessToken = accessToken;
        _pageID = pageID;
        _postToPageURL = $"{_facebookAPI}{pageID}/{_pageEdgeFeed}";
    }
    // Publish a simple text post
    public async Task<Tuple<int,string>> PublishPost(string postText)
    {
        using (var http = new HttpClient())
        {
            var postData = new Dictionary<string, string>
            {
                {"access_token", _accessToken },
                {"message", postText }
            };

            var httpResponse = await http.PostAsync(
                _postToPageURL,
                new FormUrlEncodedContent(postData));
            var httpContent = await httpResponse.Content.ReadAsStringAsync();

            return new Tuple<int, string>(
                    (int)httpResponse.StatusCode,
                    httpContent
                );
        }
    }

这是您在控制器上使用它的方式:

//declare your strings, I stored them in a class
public static class FacebookSettings
    {
        public static string pageID = "Your-Page-Id";
        public static string Access_Token = "Your-Page-Access-Token";
    }
    //post create post
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create(Post post)
    {
        if (ModelState.IsValid)
        {
        //here you pass in your parameters
        var facebook = new 
        FacebookController
        (
            FacebookSettings.Access_Token,
            FacebookSettings.pageID
        );
        var simpleText = Task.Run(async () =>
        {
         using (var http = new HttpClient())
             {
                 return await facebook.PublishSimplePost(post.UserPost);
             }
         });
         //Debug your application to check if you get the correct id here:
         var simpleTextJson = JObject.Parse(simpleText.Result.Item2);

            _db.Add(post);
            await _db.SaveChangesAsync();
            return RedirectToAction(nameof(Index), new { userId = post.UserId });
        }
        return View(post);