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 时出现“重复状态消息”错误?

Parse - 每次都重新创建 Facebook 用户

Instagram 图形 API

在 Facebook 身份验证的对话框参数中删除 display=wap 对话框的替代解决方案是啥?

通过Console App C#将照片发布到Facebook页面