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

Cou*_*Ech 2 php facebook facebook-graph-api

来自stackoverflow的超级棒人!

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

这是我现在的代码:正如你所看到的那样只需要网址的最后一部分..请帮助将该profilename转换为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;
    }
Run Code Online (Sandbox Code Playgroud)

jeh*_*na1 8

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

echo GetOnlyUsername('https://www.facebook.com/profilename'); // outputs https://www.facebook.com/profilename
Run Code Online (Sandbox Code Playgroud)

为了使函数更清晰,我建议重命名函数,使其更容易理解并具有一组清晰的验证.我是这样做的:

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];
}
Run Code Online (Sandbox Code Playgroud)

现在,将Facebook用户名转换为Facebook ID更加棘手.现在,这个问题很多 重复 , 没有一个解决的答案,这给了我们一个提示,它不能通过官方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];
}
Run Code Online (Sandbox Code Playgroud)

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

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

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