如何从Facebook个人资料或页面URL获取数字ID? PHP,Facebook Graph API

时间:2016-03-12 09:42:29

标签: php facebook facebook-graph-api

你好超级精彩的人来自stackoverflow!

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

现在这是我的代码:正如您所看到的那样,它只占用了网址的最后一部分..请帮助将该profilename转换为ID并将其保存为$ username。谢谢。

<meta property="al:android:url"

1 个答案:

答案 0 :(得分:8)

现在,当您提供网址时,您的函数GetOnlyUsername会有一些奇怪的结果:

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更加棘手。现在,many duplicates of this question没有得到解决的答案,这提示我们无法通过官方API完成此操作。< / p>

我猜测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,而只是一个黑客,它可能会在任何特定时刻停止工作,恕不另行通知。 Facebook也可能随机抛出一个CAPTCHA页面,这也会破坏代码执行。

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