【问题标题】:How to Get Numeric ID from Facebook Profile or Page URL? PHP ,Facebook Graph API如何从 Facebook 个人资料或页面 URL 获取数字 ID? PHP ,Facebook 图形 API
【发布时间】:2016-06-27 15:09:16
【问题描述】:

你好来自stackoverflow的超级棒的人!

我需要这个 php 脚本的帮助。当用户在输入框中输入他的 facebook 个人资料链接时,我想从用户那里获取 facebook id。个人资料链接示例:https://www.facebook.com/profilename。我有一个脚本,它从 url 收集“profilename”并将其保存到 $username 但现在我需要脚本将该配置文件名转换为该配置文件的 facebook ID 并将其保存到 $username。现在我知道,当您右键单击用户个人资料图片而不是单击复制链接地址和 .(点)之后的最后一个数字是用户个人资料 ID 时,您可以轻松手动获取 facebook id ..或者另一种方法是扫描页面以查找 @ 987654325@ 或 <meta property="al:android:url" 这也将获得用户 ID。这是具有该工作脚本的站点。 http://findmyfbid.com/

这是我现在的代码:如您所见,它只占用了 url 的最后一部分。请帮助正确地将配置文件名转换为 ID 并将其保存到 $username 。谢谢。

 /* CHECKING */
        if (isset($_POST["urlCheck"])) {
            $url = $_POST["urlCheck"];
            $urlParts = explode("facebook.com/", $url);
            $username = GetOnlyUsername($urlParts[1]);

            if (filter_var($url, FILTER_VALIDATE_URL) !== false) 
                exit("success");
            else 
                exit("error");              
        }

        /* TAKING INFO */
        if (isset($_POST["urlGetData"])) {
            $url = $_POST["urlGetData"];
            $urlParts = explode("facebook.com/", $url);
            $username = GetOnlyUsername($urlParts[1]);

            $name= GetData($username);


    function GetOnlyUsername($username) {
        if ((strpos($username, 'profile.php?id=')) !== false) {
            $username = str_replace("profile.php?id=", "", $username);  
            if ((strpos($username, '&fref=ts')) !== false) {
                $username = str_replace("&fref=ts", "", $username); 
            }
        } else if ((strpos($username, '?')) !== false) {
            $test = explode("?", $username);
            $username = $test[0];   
        }
        return $username;
    }

【问题讨论】:

  • 如果输入 https://www.facebook.com/profilename,您想要 1) 从 URL 中提取 profilename 还是 2) 提取 profilename 并将其转换为数字 Facebook ID?
  • 正确!当用户输入facebook.com/profilename 时,我只想将“个人资料名称”转换为 Facebook ID 并保存到该函数 GetOnlyUsername($username),因为当输入为facebook.com/ID 时,脚本的其余部分工作正常。所以答案是 1) 从 URL 中提取个人资料名称并将其转换为数字 Facebook ID。
  • 为了更好的代码可读性,您可以为用户 ID 和用户名使用不同的命名。我建议您分别使用变量名$userid$username。此外,您还想将您的函数从 GetOnlyUsername($username) 命名为例如GetUsernameFromFacebookURL($url)。我还建议使用注释优先的方法进行编码,因为现在很难弄清楚你试图用该代码完成的逻辑。
  • 您现在看到的代码仅从 url 中提取“profilename”。假设 url 的输入看起来像这样 _italic_https://www.facebook.com/profilename?fref=ts 函数 GetOnlyUsername($username) 仅提取该配置文件名并从 url 中删除其余部分......现在我需要什么时候该功能已完成,仅继续将该“配置文件名称”转换为 ID。我希望现在有意义。

标签: php facebook facebook-graph-api


【解决方案1】:

现在你的函数 GetOnlyUsername 在提供 URL 时会产生一些奇怪的结果:

echo GetOnlyUsername('https://www.facebook.com/profilename'); // outputs https://www.facebook.com/profilename

为了使函数更清晰,我建议重命名函数,使其更易于理解并具有清晰的验证集。以下是我的做法:

function GetUsernameFromFacebookURL($url) {
    /**
     * Taken from http://findmyfbid.com/, the valid formats are:
     * https://www.facebook.com/JohnDoe
     * https://m.facebook.com/sally.struthers
     * https://www.facebook.com/profile.php?id=24353623
     */
    $correctURLPattern = '/^https?:\/\/(?:www|m)\.facebook.com\/(?:profile\.php\?id=)?([a-zA-Z0-9\.]+)$/';
    if (!preg_match($correctURLPattern, $url, $matches)) {
        throw new Exception('Not a valid URL');
    }

    return $matches[1];
}

现在,将 Facebook 用户名转换为 Facebook ID 更加棘手。现在有manyduplicatesofthisquestion没有解决的答案,这提示我们不能通过官方API完成。

我猜 findmyfbid.com 和替代方案正在使用一些非官方 API 来获取数据(例如直接抓取 facebook.com 网站)。我必须说我不鼓励你这样做,因为非官方 API 往往会在没有通知的情况下中断,而且 Facebook 的服务条款可能禁止抓取网站。

但是,如果这只是针对您的爱好项目并且您不在乎它是否会在一周内中断,我找到了以下代码来从网站上获取用户 ID:

function GetUserIDFromUsername($username) {
    // For some reason, changing the user agent does expose the user's UID
    $options  = array('http' => array('user_agent' => 'some_obscure_browser'));
    $context  = stream_context_create($options);
    $fbsite = file_get_contents('https://www.facebook.com/' . $username, false, $context);

    // ID is exposed in some piece of JS code, so we'll just extract it
    $fbIDPattern = '/\"entity_id\":\"(\d+)\"/';
    if (!preg_match($fbIDPattern, $fbsite, $matches)) {
        throw new Exception('Unofficial API is broken or user not found');
    }
    return $matches[1];
}

因此,这段代码将用户代理更改为一些晦涩的字符串,由于某种未知的原因,这会在获取 facebook.com/username 时触发积极的反应,从而在一段 JS 代码中暴露用户 ID。

请注意,使用此脚本很可能违反 Facebook 的服务条款,它不是官方 API,而只是一个 hack,它可能会在任何特定时刻停止工作,恕不另行通知。 Facebook 也可能会随机向您抛出一个 CAPTCHA 页面,这也会中断代码执行。

但现在它似乎工作得很好。

【讨论】:

  • 此脚本不再工作,facebook api 不支持从用户名获取 id 并且 findmyfbid.com 无法找到在设置中禁用搜索引擎的用户的 id。但是,fbid.co 可以找到禁用搜索引擎设置的用户的数字 ID。有人知道怎么做吗?
  • @TruongHua 刚刚自己测试过,它似乎工作得很好。你是如何测试脚本的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2019-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多