如何在 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);
我已经在 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);