无法通过 curl 请求连接到 Facebook

Posted

技术标签:

【中文标题】无法通过 curl 请求连接到 Facebook【英文标题】:Can not connect to Facebook with a curl request 【发布时间】:2012-04-22 17:14:00 【问题描述】:

几周前我创建了一个简单的 Facebook 应用程序。我通过征求用户的许可通过 Facebook API 获取用户信息。但它上周无故停止工作,从那时起我一直在寻找答案。

基本上我曾经使用 file_get_contents 从 Facebook API 获取用户信息。但是我尝试在它开始失败后将其更改为 cURL,但仍然无法正常工作。我尝试使用 Facebook php-SDK,甚至调试了 makeRequest 方法的代码,但我在所有方法中都得到了相同的返回。

当向 Facebook Open Graph URL 发出 cURL 请求时,请求失败,错误号为 7 或 28。它们都是无法连接到站点或超时的错误代码。

我的网站在共享主机上,我尝试使用 cURL 获取其他网站,并且效果很好。但是当我尝试获取http://www.facebook.com 时,cURL 返回 FALSE。

主机有 SSL 证书,启用了 cURL 等。而且它在前一段时间运行良好。我已经阅读了有关此问题的各种主题和帖子,尝试了许多不同的 cURL 选项,但似乎没有一个有效。

有什么想法吗?

index.php

$auth_url = "https://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($GLOBALS['canvas_page']) . "&scope=publish_stream,email";
$signed_request = $_POST["signed_request"];
list($encoded_sig, $payload) = explode('.', $signed_request, 2);
$data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true);
if (empty($data["user_id"])) 
    echo("<script> top.location.href='" . $auth_url . "'</script>");
 else 
    $_SESSION['oauth_token'] = $data['oauth_token'];
    $_SESSION['user_id'] = $data["user_id"];
    $user = new User($_SESSION['user_id'], $_SESSION['oauth_token']);

用户类

function __construct($fid, $at) 
    $this->facebook = new Facebook(array(
                'appId' => "<APP_ID>",
                'secret' => "<FACEBOOK_SECRET_ID>",
            ));
    $this->fid = $fid;
    $this->token = $at;
    if ($data = $this->getGraph()) 
    ...
    


public function getGraph() 
    $session = $this->facebook->getUser();
    if ($session) 
        try 
            $access_token = $this->facebook->getAccessToken();
            $attachment = array('access_token' => $access_token);
            //$result = $this->facebook->api('/' . $this->fid, 'GET', $attachment);
            $result = $this->facebook->api('/' . $this->fid, 'GET');
            return $result;
         catch (FacebookApiException $e) 
            return false;
        
    

注意事项:

在检查了 Facebook PHP SDK 方法后,我意识到我不需要发送访问令牌,因为如果访问令牌不在 $params 中,它将设置它。 下到 sdk 中的 makeRequest() 方法,并从 curl_exec 中返回 false。

【问题讨论】:

您能发布您的应用程序初始化和 curl 代码吗? 网络架构有什么变化吗?防火墙? ips?主机文件?你可以从命令行 ping graph.facebook.com 吗?你可以使用 curl 作为带有 -v 选项的命令行来查看更多信息吗? 我没有 shell 访问权限,该站点托管在共享服务器上。但问题是通过清除 DNS 缓存来解决的。这与 Facebook 使用的循环 DNS 技术有关。我自己不能回答这个问题,因为我没有足够的代表。 如果您可以单独发布您的答案并将其选为接受的分析器,那将会很有帮助。它将帮助那些正在寻找未解决问题的人。 【参考方案1】:

显然这与 Facebook 的循环 DNS 结构有关。我猜 Facebook 的其中一个地址失败了,由于 DNS 缓存,服务器仍在尝试连接到该地址。

托管服务提供商必须清除其 DNS 缓存才能解决问题。

有关循环 DNS 的更多信息,您可以访问http://en.wikipedia.org/wiki/Round-robin_DNS。

【讨论】:

以上是关于无法通过 curl 请求连接到 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

curl 无法通过 ip static 连接本地 xampp

curl无法通过ip static连接本地xampp

curl错误码大全

如果通过应用程序连接到 WIFI,则无法在 Android 上发送 http 请求

将标准输入管道连接到 cURL 标头

无法通过 SOCKS5 代理服务器连接到互联网