【问题标题】:How can I get Facebook Profile image from email?如何从电子邮件中获取 Facebook 个人资料图片?
【发布时间】:2010-05-17 18:51:42
【问题描述】:

有一个名为 Xobni 的 Outlook 插件,它有一个非常酷的功能,如果联系人有电子邮件地址,它将获取该联系人的个人资料图片并显示它。他们的常见问题解答如下:

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

我想复制这个功能。但是,我无法弄清楚他们正在使用哪个 API 调用。我假设当他们说“加密的电子邮件地址”时,这是电子邮件哈希的外行术语。派生用户名后,graph api 看起来非常适合实际获取图像,但我在从电子邮件哈希到配置文件 ID 时遇到了麻烦。

【问题讨论】:

  • 更多信息:我在我的机器上设置了一个嗅探器来监控出站呼叫,我发现它是一个未发布的、可能是非公开的方法,称为 facebook.users.getByEmail。我会玩这个,但我并不乐观。其他人对从电子邮件转到 uid 有什么想法吗?
  • 如果您知道这一点,请告诉我 - 我得到的最接近的是,如果您已登录,您可以通过解析搜索页面获取配置文件 ID,您可以提供电子邮件地址。这需要您的脚本/程序在搜索页面请求中发送有效的登录 cookie,但是...

标签: facebook


【解决方案1】:

您可以查询以下 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"> 给你图片。

更多信息:article at codinglogs.com

【讨论】:

    【解决方案2】:

    我正在寻找一种方法来做这件事……目前还没有任何尝试。

    有人找到解决办法了吗?

    更新:我已经用 PHP 编写了这个 sn-p。这只是我能够实现目标的唯一方法。我不确定 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 . '" />';
    
            }
    
        }
    
    }
    
    
    ?
    

    【讨论】:

    • 好的.. 结果这不会 100% 工作。$match 搜索 profile.php?id= 链接,而一些 facebook 用户设置了他们的自定义链接,即 facebook.com/MyAliasName。 (该死!我以为我有)努力找出在哪里可以找到这些信息。
    【解决方案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
       }
    }
    

    【讨论】:

      【解决方案4】:

      非常感谢@McHerbie,您为我提供了最终让我的代码正常工作的线索。关键是urlencode()函数编码电子邮件!!!谢谢,这是我使用 PHP Simple HTML Dom Parser 的工作代码:

      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;
                  }
          }
      

      【讨论】:

      • 据我所知,无法再获取头像了
      【解决方案5】:

      我知道这篇文章有点老了,但现在才发现它——你可以试试 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

      【讨论】:

      • 在发布更多促销答案之前,请阅读我发布给您的常见问题解答条目。
      猜你喜欢
      • 2011-03-08
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多