Facebook API - 删除状态
Posted
技术标签:
【中文标题】Facebook API - 删除状态【英文标题】:Facebook API - delete status 【发布时间】:2011-02-20 23:20:23 【问题描述】:在 php 中,我使用 curl 向 fb graph api 发送删除消息 - 但出现以下错误;
"error":"type":"GraphMethodException","message":"Unsupported delete request."
我使用的代码是;
$ch = curl_init("https://graph.facebook.com/" . $status_id . "");
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_CAINFO, NULL);
curl_setopt($ch, CURLOPT_CAPATH, NULL);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
$result = curl_exec($ch);
echo $result;
$query 包含访问令牌。
【问题讨论】:
什么是“status_id”?一个提要条目?有效吗? 相关状态的 ID。是的,它是有效的 - 已使用返回状态的 get id pull 检查它。 您的问题解决了吗? James Hartwig 说他找到了一个解决方案,但它没有被标记为答案(并且对我来说真的不起作用) 【参考方案1】:我稍微修改了您的代码。 (如果操作正确,应该回显“true”)这是目前对我有用的。
另请注意,这不会删除通过 Facebook 创建的事件。这就是您收到权限错误的原因。这只会删除通过您的应用程序创建的事件...(链接到 $app_id、$app_secret 的应用程序)
//First authenticate a token
$app_id = "APP ID GOES HERE";
$app_secret = "SECRET APP ID GOES HERE";
$my_url = "WHATEVER THIS PAGES NAME IS GOES HERE";
//I'm not sure but I think REQUEST is still allowed....right? if not change it to GET/POST
$code = $_REQUEST["code"];
if(empty($code))
$auth_url = "http://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url)
. "&scope=create_event";
echo("<script>top.location.href='" . $auth_url . "'</script>");
$token_url = "https://graph.facebook.com/oauth/access_token?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret
. "&code=" . $code;
$access_token = file_get_contents($token_url);
//Use TRUE and FALSE not 0 and 1's like you originally had it
//264853420218553 is the event id.
$ch = curl_init("https://graph.facebook.com/264853420218553?" . $access_token . "");
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_POST, TRUE);
//curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_CAINFO, NULL);
curl_setopt($ch, CURLOPT_CAPATH, NULL);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
$result = curl_exec($ch);
echo $result;?>
【讨论】:
请注意上述代码中的一个错误:CURLOPT_SSL_VERIFYHOST
应该是一个整数参数,并且应该设置为 2(默认值)。有关详细信息,请参阅php.net/manual/en/function.curl-setopt.php。如果您将值设置为true
,您实际上是在禁用主机检查,从而启用 MITM 攻击!【参考方案2】:
对于仍在为此苦苦挣扎的人,我发现我的问题是试图删除我之前使用 PHP SDK 创建的应用程序请求,这导致了这个错误。
(#2) 无效参数:错误/警告消息的正文。标题为:无效参数
问题本质上是使用了哪个访问令牌;用户或应用程序。
我正在处理的特定场景是,我的应用程序中的用户邀请了朋友 Facebook(使用应用程序请求)但随后想要撤消该邀请。在这种情况下,我想删除之前在 Facebook 上创建的应用请求。但是,此时登录的用户并不是应用请求的接收者,而是发送者。
查看 PHP SDK 代码,如果有用户访问令牌,它会自动使用用户访问令牌,而不是应用程序访问令牌。事实上,似乎没有办法从 SDK 显式获取应用程序令牌。
尝试使用以下命令删除应用请求时...
$facebook->api('/'.$fb_request_id, 'DELETE');
...让 PHP SDK 选择用户令牌,我收到 (#2) Invalid parameter 错误消息。但是,如果我手动构造应用程序访问令牌(格式为“$app_id|$app_secret”并将其作为数组键传递给第三个参数...
$facebook->api('/'.$fb_request_id, 'DELETE', array('access_token' => $app_access_token);
..然后调用成功。
因此,如果当前用户不是应用请求的接收者,则本质上您需要使用应用访问令牌来删除应用请求。
我希望这可以帮助其他遇到同样问题的人。
【讨论】:
【参考方案3】:关于这个答案:
已修复! 删除时,您必须将用户 ID 添加到对象 ID: 删除https://graph.facebook.com/673509687_104812882909249?access_token=access_token 其中 673509687 是我的用户 ID,104812882909249 是对象 ID
不幸的是,这仅适用于用户访问令牌,而不是当您尝试使用例如 PHP 语言删除服务器上的应用请求(使用应用访问令牌)时。
如果您有使用 app-access-token 删除应用请求的解决方案,请描述一下。感谢您的帮助!
【讨论】:
你能用 app-access-token 删除用户的状态信息吗?没想到……【参考方案4】:已修复!
您必须在删除时将用户 ID 添加到对象 ID:
删除https://graph.facebook.com/673509687_104812882909249?access_token=access_token 在哪里 673509687 是我的用户 ID,104812882909249 是对象 ID
【讨论】:
+1 用于添加用户 ID。 -1 到 Facebook 获取糟糕的 API。 我认为user_id应该是后缀而不是object_id前缀。【参考方案5】:这仅仅意味着该特定对象不支持 HTTP 删除方法。
一种选择是使用 Http POST 并将 method=delete 添加到参数查询中。确保您的应用程序具有publish_stream
权限,否则您将永远无法发布提要。
权限由 Facebook 完成。
【讨论】:
【参考方案6】:我唯一能想到的就是尝试
1) 使用“method=delete”执行 POST 请求,看看是否有效
2) 手动查看生成的 HTTP 请求,看看是否有问题——然后您可以隔离问题
【讨论】:
嗨 Thr4wn。我尝试使用 method=delete 进行 POST,但这也不起作用。以上是关于Facebook API - 删除状态的主要内容,如果未能解决你的问题,请参考以下文章
Facebook Graph API Explorer 和 iOS SDK API 调用返回不同的结果
如何避免在 iOS 中使用 Facebook SDK 时出现“重复状态消息”错误?