了解如何通过网站(app)将Facebook页面发布为页面

时间:2013-11-01 09:20:53

标签: php facebook facebook-graph-api

我花了很长时间才试图确定如何,然后将一些数据从我的网络服务器推送到为此目的创建的Facebook页面。

我已阅读并理解使用访问令牌的过程。我已经为自己生成了一个访问令牌,可以用它来发布到我的页面。我理解这应该用于生成页面的访问令牌作为页面发布,这是一个非常棘手的问题。但是,此过程涉及我登录并生成访问令牌,这对于自动化过程而言本身就很糟糕/不方便。

出于这个原因,我按照指南创建了一个应用程序。我(我想我已经)将应用程序链接到页面,因此尝试通过appid和秘密将数据从我的php代码推送到页面。  这样做时,我遇到了这个错误

{"error":{"message":"(#210) Subject must be a page.","type":"OAuthException","code":210}}

我的测试代码是:

$data['picture'] = "http://www.example.com/image.jpg";
$data['link'] = "http://www.example.com/";
$data['message'] = "Your message";
$data['caption'] = "Caption";
$data['description'] = "Description";
$data['access_token'] = $app_token2;
$post_url = 'https://graph.facebook.com/'.$app_id.'/feed';
$url1 = "https://graph.facebook.com/endpoint?key=value&access_token=".$app_id."|". $app_secret ;
echo "<br>$post_url";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $post_url);
//curl_setopt($ch, CURLOPT_URL, $url1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($ch);
curl_close($ch);
echo "$return";

我很欣赏使用该应用程序进行服务器发起的使用永久性(ish)秘密的方法是正确的方法,但我发现很少有关于如何实现此过程的文档,因此这个问题。

3 个答案:

答案 0 :(得分:0)

你的$ post_url指向你的$ app_id变量,消息说它应该指向一个页面,尝试从图形的/ me / accounts端点获取页面的id并将其放在那里。虽然我怀疑您需要使用页面access_token(也来自/ me / accounts端点)发布到您的页面

答案 1 :(得分:0)

是的,我已经对此工作了很长时间,并在我的代码中发现了几个错误,但没有完全回答这个问题。 对于初学者,你不会如上所述发布到appid - 它只是错误的。当使用从appid + secret使用

生成的访问令牌时,发布到userid / feed的代码可以正常工作

$url2 = "https://graph.facebook.com/oauth/access_token?client_id=".$app_id."&client_secret=". $app_secret."&grant_type=client_credentials";

此应用访问令牌只要您的应用秘密有效就有效。此外,如果我通过图形浏览器为ME生成临时访问代码,请手动解析我/帐户并使用页面标记

$post_url = 'https://graph.facebook.com/'.$page_id.'/feed';

它正确地贴在页面上。

其次,所有服务器端调用都需要在其中包含appsecret_spoof,这是从

生成的

$appsecret_proof= hash_hmac('sha256', $app_token2, $app_secret);

现在,根据facebook文档,对我的用户ID /帐户的http调用应该为用户管理的所有页面(也可能是应用程序)产生页面访问权限。 也可以使用

直接调用
$url3 = "https://graph.facebook.com/".$page_id."?fields=access_token";

所以当得到这个地址(包括app access token&amp; appsecret_spoof)时,我得到的是'真'? 同样,当正确调用

$rob1 = "https://graph.facebook.com/".$user_id."/accounts";

我收到错误

{"error":{"message":"(#10) Application does not have permission for this action","type":"OAuthException","code":10}}

OK权限问题然后!那么文档说只需要manage_pages来从page_id / accounts中检索页面令牌,所以我浏览了很多页面,发现你可以通过调用这个url来实现这个目的

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=https://www.facebook.com/connect/login_success.html&response_type=token&scope=read_stream

通过facebook gui向每个范围抛出一个接受/拒绝页面(我最终将manage_pages,publish_stream和amp_stream添加到我的应用程序中)似乎没有解决问题!

答案 2 :(得分:0)

正确排序!! FWIW上面的代码正常运行,但它在Facebook上的设置方式还有很多不足之处! 我开始搞乱我的应用程序并更改其名称,类型(是一个链接到页面的应用程序 - 现在不是)删除了权限,还更改了域名(已删除)和所有网站URL详细信息(也已删除)。这提示了一个不同的错误信息,表明域名不匹配。所以,我只读了app域&amp;网站网址,保存,突然我失败的代码开始工作!

稍微整理了我的代码,我现在可以看到页面访问令牌就像我预期的那样。我只是希望Facebook指南能够交叉引用这个设置,因为它一点都不明显!!!

我的工作代码最终结果如此($ perm_url被用作一次性链接以通过gui允许perms)

$perm_url = "https://www.facebook.com/dialog/oauth?client_id=".$appid."&redirect_uri=https://www.facebook.com/connect/login_success.html&response_type=token&scope=publish_stream,manage_pages,read_stream,status_update"; echo "<br>Test";

$facebook = new Facebook(array('appId' => $appid , 'secret' => $appsecret ,)); $access_token = $facebook->getAccessToken();

$pageinfo = $facebook->api("/".$page_id."?fields=access_token");

$page_access_token = $pageinfo['access_token'];

echo "<br>Holy Grail = $page_access_token ";