我该如何通过电子邮件获取Facebook个人资料图片?

11

有一个名为Xobni的Outlook插件,它有一个非常酷的功能。如果一个联系人有电子邮件地址,它将获取该联系人的个人资料图片并显示出来。Xobni的FAQ声明如下:

Xobni会向Facebook发送加密的电子邮件地址以检索当前在Xobni侧栏中查看的人的Facebook个人资料。 Xobni永远不会更改您自己的Facebook个人资料,并且在查看其他个人资料时严格遵循所有Facebook隐私设置。

我想复制这个功能,但我无法确定他们使用的是哪个API调用。当他们说“加密的电子邮件地址”时,我认为这是电子邮件哈希的门外汉术语。一旦用户名被推导出来,图形api似乎是实际获取图片的理想选择,但我从电子邮件哈希转换为个人资料ID时遇到了问题。


更多信息:我在我的机器上设置了一个嗅探器来监视出站呼叫,我发现它是一个未发布的、可能不公开的方法,称为facebook.users.getByEmail。我会尝试一下这个方法,但我并不乐观。还有其他人对从电子邮件到UID的想法吗? - Forbini
如果你找到了解决方法,请告诉我——我最接近的方法是,如果你已经登录,你可以通过解析搜索页面来获取个人资料ID,而你可以提供一个电子邮件地址。不过,这需要你的脚本/程序在搜索页面请求中发送有效的已登录cookie... - Mala
5个回答

13

您可以查询以下 URL 来获取用户 ID(如果 Facebook 上存在):

https://graph.facebook.com/search?access_token=YOUR_ACCESS_TOKEN&q=EMAIL_ADDRESS_URL_ENCODED&type=user

使用 <img src="https://graph.facebook.com/USER_ID/picture"> 获取用户头像。

更多信息请参考:codinglogs.com上的文章


3

我正在寻找一种方法来完成这个任务...但目前尝试都没有成功。

有人能找到解决方案吗?

更新:我已经用PHP编写了这个片段。这是我唯一能够实现我的目标的方法。我不确定Xobni是如何做到的(我肯定他们做得不会那么拖沓)。

<?php

/* Email to Search By */
$eml = 'user@domain.com';

/* This is where we are going to search.. */
$url = 'http://www.facebook.com/search.php?q=' . urlencode($eml);

/* Fetch using cURL */
$ch = curl_init();

/* Set cURL Options */
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

/* Tell Facebook that we are using a valid browser */
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');

/* Execute cURL, get Response */
$response = curl_exec($ch);

/* Check HTTP Code */
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

/* Close cURL */
curl_close($ch);

/* 200 Response! */
if ($response_code == 200) {

    /* Parse HTML Response */
    $dom = new DOMDocument();
    @$dom->loadHTML($response);

    /* What we are looking for */
    $match = 'http://www.facebook.com/profile.php?id=';

    /* Facebook UIDs */
    $uids = array();

    /* Find all Anchors */
    $anchors = $dom->getElementsByTagName('a');
    foreach ($anchors as $anchor) {
        $href = $anchor->getAttribute('href');
        if (stristr($href, $match) !== false) {
            $uids[] = str_replace($match, '', $href);
        }
    }

    /* Found Facebook Users */
    if (!empty($uids)) {

        /* Return Unique UIDs */
        $uids = array_unique($uids);

        /* Show Results */
        foreach ($uids as $uid) {

            /* Profile Picture */
            echo '<img src="http://graph.facebook.com/' . $uid. '/picture" alt="' . $uid . '" />';

        }

    }

}


?

好的,事实证明这个方法不是百分之百可行。$match搜索的是profile.php?id=链接,而一些Facebook用户已经设置了他们自己的自定义链接,例如facebook.com/MyAliasName。(该死!我以为我做到了)现在正在努力找出其他可以找到这些信息的方法。 - McHerbie

3

通过Facebook Graph API使用电子邮件地址搜索用户信息已不再可行。如果您有Facebook用户ID,仍然可以使用,但如果您无法使用搜索API获取Facebook ID,则无法执行此操作。

https://developers.facebook.com/x/bugs/453298034751100/

API将返回以下响应:

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

2
非常感谢@McHerbie,你给了我关键线索,最终让我的代码正常运行起来。关键是使用urlencode()函数对电子邮件进行编码!!! 谢谢,这是我使用PHP Simple HTML Dom解析器的工作代码:
public function getFacebookPictureByScrapping($email="your@email.com", $file="fbPicture.jpg") {
            require_once('protected/extensions/simplehtmldom/simple_html_dom.php');
            $userEmail = urlencode($email);

            ini_set('user_agent', 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');

            $url = "http://www.facebook.com/search.php?q=$userEmail&type=all&init=srp";
            $html = new simple_html_dom();
            $html = file_get_html($url);

            if (is_object($picture = $html->find(".uiList .img",0))) {
                $image = file_get_contents($picture->src, false);
                file_put_contents($file);
                return $file;
            } else {
                return null;
            }
    }

据我所知,现在已经无法获取个人资料图片了。 - aleksdj

1

我知道这篇文章有点旧了,但我刚刚找到它 - 你可以尝试使用FullContact Person API(完全透明 - 我有偏见,因为我在那里工作):

http://www.fullcontact.com/developer/

一方面,当您基于电子邮件查询时,它将拉取相关的社交媒体资料,以便您可以找到并提取相关的资料...但另一方面,您也可以节省一些时间并直接使用它来提取资料图片。
响应模式包括:
    "photos": 
  [
    {
      "typeId": [photo type],
      "typeName": [photo type name],
      "url": [photo url],
      "isPrimary": [boolean]
    }
  ]

更多信息:http://www.fullcontact.com/developer/docs/person/#lookup-by-email-3

1
在发布更多的推广答案之前,请先阅读我给你发布的那篇常见问题解答。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接