0

我已经花了相当长的时间尝试确定如何将一些数据从我的 Web 服务器推送到为此目的创建的 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) 密码的服务器启动发布的应用程序是正确的方法,但我发现很少有关于如何实现此过程的文档,因此这个问题。

4

3 回答 3

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";

只要您的应用程序密钥有效,此应用程序访问令牌就有效。此外,如果我通过图形资源管理器为我生成临时访问代码,请手动解析我/帐户并使用页面令牌

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

它正确地发布为页面。

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

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

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

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

因此,当获取此地址(包括应用程序访问令牌和 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 和 read_stream 添加到我的应用程序)似乎都没有解决问题!

于 2013-11-07T14:59:52.060 回答
0

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

于 2013-11-01T09:47:05.523 回答
0

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

稍微整理一下我的代码后,我现在可以看到页面访问令牌就像我预期的那样。我只是希望 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 ";

于 2013-11-08T15:53:20.210 回答