我花了很长时间才试图确定如何,然后将一些数据从我的网络服务器推送到为此目的创建的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
)秘密的方法是正确的方法,但我发现很少有关于如何实现此过程的文档,因此这个问题。
答案 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 ";