34

我需要的

我需要为只知道他的电子邮件地址的用户自动查找和下载个人资料图片。最初,考虑到积极使用它的人数,我专注于 Facebook。但是,他们的 API 似乎不再提供直接支持。

这里有类似的问题: How to get a facebook user id from the login email address这已经过时了,目前的答案是“它已被弃用”/“不可能”......编辑:我发现了更好的问题:通过已知的电子邮件地址查找 Facebook 用户(个人资料页面的 URL)(实际上解释了为什么以及何时不支持此功能)

一定有办法...

是什么让我认为这应该是可能的,因为Spokeo正在以某种方式做到这一点: http ://www.spokeo.com/email-search/search?e=beb090303%40hotmail.com

有一些服务/API 提供这种功能:
Clearbit Pipl
...
但我没有找到任何免费的东西。

备择方案

如果有一些解决方法或不同的方法而不是使用 Facebook 的 API 来实现这一点,我想知道。如果 Facebook 在这里真的完全没有希望,那么结合这些:Google+Linkedin和/或Gravatar就可以了。


我的第一次(原始)尝试:

一旦你有了 Facebook 的用户名或用户 ID,就很容易建立 URL 来下载图片。因此,我尝试使用带有/searchGraph API 的电子邮件来查找 Facebook 的用户 ID:
https://graph.facebook.com/search?q=beb090303@hotmail.com&type=user&access_token=TOKEN

不幸的是,它总是以“请求此资源需要用户访问令牌”结尾。

使用 FB PHP API + FB App ID & Secret

我也试过这个:起初我access_token使用应用程序 ID 和秘密检索,然后我尝试将它用作/search请求的一部分curl

function post_query_url($url, $data) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

function get_query_url($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $ret = curl_exec($ch);
    curl_close($ch);
    return $ret;
}

function get_retrieve_app_access_token($app_id, $secret) {
    $url = 'https://graph.facebook.com/oauth/access_token?client_id='.$app_id.'&client_secret='.$secret.'&grant_type=client_credentials';
    $res = get_query_url($url);
    if (!empty($res)) {
        $tokens = explode('=', $res);
        if (count($tokens) == 2)
            return $tokens[1];
    }
    return null;
}

function post_retrieve_app_access_token($app_id, $secret) {
    $url = 'https://graph.facebook.com/oauth/access_token';
    $data = 'client_id='.$app_id.'&client_secret='.$secret.'&grant_type=client_credentials';
    $res = post_query_url($url, $data);
    if (!empty($res)) {
        $tokens = explode('=', $res);
        if (count($tokens) == 2)
            return $tokens[1];
    }
    return null;
}

function get_id_from_email($email, $accessToken) {
    $url = 'https://graph.facebook.com/search?q='.urlencode($email).'&type=user&access_token='.$accessToken;
    $res = get_query_url($url);
    if (!empty($res)) {
        return $res;
    }
    return null;
}

echo 'Retrieving token...<br>';

$token = post_retrieve_app_access_token('MY_APP_ID', 'SECRET');
echo 'Retrieved token: ' . $token . '<br>';

echo 'Retrieving user ID...<br>';
$id = get_id_from_email('beb090303@hotmail.com', $token);
echo 'Retrieved ID: ' . $id . '<br>';

输出类似:

Retrieving token...
Retrieved token: 367458621954635|DHfdjCnvO243Hbe1AFE3fhyhrtg
Retrieving user ID...
Retrieved ID: {"error":{"message":"A user access token is required to request this resource.","type":"OAuthException","code":102}}

其他信息

由于它要求“用户访问令牌”,我还尝试访问 Facebook 的 Graph Explorer:https ://developers.facebook.com/tools/explorer/ 让它为我生成访问令牌并查询: search?q=beb090303@hotmail.com&type=user&debug=all 那个以:

{
  "error": {
    "message": "(#200) Must have a valid access_token to access this endpoint", 
    "type": "OAuthException", 
    "code": 200
  }
}

...所以 Facebook 在这里似乎有点绝望。

4

5 回答 5

18

这正是 Gravatar 存在的原因以及人们使用 Gravatar 的原因,用户知道他们将哪个公共个人资料图像绑定到哪个电子邮件地址,并且他们知道在哪里更改它。

您的应用可以让用户上传他们自己的个人资料图片并回退到 Gravatar。

如果您只是尝试从 Facebook 或 Google+ 中提取图像,它可能会吓坏您的用户,而且他们也更难知道您的服务从哪里获得了个人资料图像。

在 PHP 中使用 Gravatar 就这么简单:

<?php
$email = "email@server.com";
$default = ""; // absolute url to default image goes here or leave empty for default gravatar image
$size = 200;

$grav_url = "http://www.gravatar.com/avatar/" . md5(strtolower(trim($email))) . "?d=" . urlencode($default) . "&s=" . $size;

header("content-type: image/jpeg");
echo file_get_contents($grav_url);
?>

除此之外,您还可以使用 Facebook 和/或 Google+ 作为外部登录提供程序,用户可以在其中授予您的应用程序访问他们的个人资料信息的权限。

于 2015-05-02T17:53:05.017 回答
8

有一个错误:无法在 2013 年 7 月之后通过电子邮件搜索用户已被关闭为“按设计”的重大变更,官方回复:

“将电子邮件地址传递给“用户”搜索类型的功能已于 2013 年 7 月 10 日删除。此搜索类型仅返回与用户名(包括备用名)匹配的结果” ~ Joseph Tuấn Anh Phan(Facebook团队)

所以可能没有来自 Graph API 的直接支持。

我已经尝试过Graph API Explorer,您也可以在其中尝试使用一些 FQL(只需要选择 2.0 版,因为不再支持较新的版本),不幸的是查询如下:

SELECT uid, name FROM user where email = 'some.email@gmail.com'

给出:

"error": {
  "message": "(#604) Your statement is not indexable. The WHERE clause must contain 
   an indexable column. Such columns are marked with * in the tables linked from
   http://developers.facebook.com/docs/reference/fql ", 
  "type": "OAuthException", 
  "code": 604
}

表用户的参考资料表明,只有uid并且third_party_id可以用于WHERE.

于 2015-05-01T13:33:55.847 回答
2

您应该需要访问令牌以及用户的 Facebook id。在不知道他们无法获得他们的个人资料照片的情况下

于 2015-05-04T07:08:19.460 回答
0

我认为 Spokeo 可能与 Facebook 达成了访问数据的协议?我不会感到惊讶。

无论如何,如果您在个人资料上,您可以profile_id在 HTML 中搜索。这是一个hack,不确定它是否有效。

于 2015-05-06T12:40:26.573 回答
0

您始终可以允许人们通过使用他们的 g+/facebook/whatever 帐户登录来发表评论(不过,这需要您执行类似 OpenID 的操作);如果他们已经登录,您应该能够获得 facebook uid。

此外,还有一种叫做libravatar的东西,它允许人们将图片与他们的 OpenID电子邮件地址相关联(如果他们没有专门为 libravatar 配置任何东西,它会回退到 gravatar);与坚持“只是” gravatar 相比,使用它应该会给你更多的照片。

于 2015-05-08T10:03:57.157 回答