如何将 Facebook 好友导入网站

Posted

技术标签:

【中文标题】如何将 Facebook 好友导入网站【英文标题】:How to import Facebook friends to website 【发布时间】:2010-07-27 16:21:36 【问题描述】:

我有一个有用户的网站,用户可以互相添加为朋友。最近,我看到很多网络应用程序都有一个功能,你可以将你的朋友从 Facebook 直接导入他们的网络应用程序。这种类型的 Facebook 好友列表导入是如何实现的?

我查看了 Facebook API 文档,并没有直接找到任何与此相关的内容。

大概我会使用 Facebook API 来提取用户的朋友列表。从那里,我将如何在我的网站上找到属于该列表成员的用户?这种方案是否只适用于已经使用 Facebook 好友搜索的其他用户,以便您可以将 Facebook 帐户绑定到他们?

虽然我已经看到很多网站都在做这件事,但在这个话题上似乎真的没有太多的东西,所以任何帮助,无论多么基本,都将不胜感激。

【问题讨论】:

只有在您存储用户的 fb 用户 ID 时才能执行此操作(即,您网站上的用户可以将他们的帐户链接到 Facebook 个人资料并存储此信息)。 如何使用 Facebook 提供的一些识别信息,如电子邮件?有没有办法将我网站上的用户信息与他们在 Facebook 上的信息相匹配? 【参考方案1】:

您需要围绕registering your site 作为“Facebook 应用程序”和使用Graph API 进行此中心的基础知识。

查看this page 的“使用 Facebook 登录”部分。基本上,当您注册“应用程序”时,您将拥有一个应用程序 ID 和一个“应用程序机密”(它只是一个字符串,绝不能公开,否则任何拥有它的人都可能冒充您的应用程序)。页面上的示例显示了用于从您的网站初始化应用程序的少量 javascript,此时您可以进行 Facebook 集成。

下面是“使用 Facebook 登录”按钮的示例,您的用户将使用该按钮表示他们希望允许您的网站访问他们的一些 Facebook 数据(例如,好友列表)。您可以在该登录标签内高度自定义用户对您的网站请求的specific permissions,并且您的用户将看到类似this one 的提示,特别要求您允许您的网站访问他们的Facebook 数据。

再次回顾this page(虽然它也可能在其他页面上,但Facebook 文档变化很大),向下滚动一点,您会发现一个简单的示例(用php 编写),用于非常基本的Facebook 集成。示例页面向用户显示“使用 Facebook 登录”按钮,并在单击按钮后重新加载(通过在 JavaScript 中订阅正确的 Facebook API 事件)。重新加载后,用户现在拥有示例页面可以读取的加密 cookie(假设用户同意权限请求)。

“应用程序机密”用于解密 cookie,其中包含用户的 Facebook ID 和访问令牌,该令牌授权您的网站请求该用户的 Facebook 信息。在 Graph API 请求中使用访问令牌将授予您从这些请求接收数据的权限。

Graph API 请求只是返回 JSON 数据的 GET 请求,因此一旦您拥有访问令牌(以及作为起点的用户 ID),您就可以在任何您想要的地方发出此类请求。它们可以在 JavaScript 中作为客户端(以及使用Social Plugins 和其他 Facebook 小部件)来“Facebookify”您的用户在您的网站上的体验,而不会向您的网站暴露太多(如果有的话)数据或责任。或者可以从后端的服务器端代码发出请求,以存储请求的数据并在您的网站认为合适的情况下使用它(例如朋友列表)。

获取好友列表的 API 请求是这样的:

https://graph.facebook.com/me/friends?access_token=your_access_token

(但是,您可以将路径中的 me 替换为您希望检索其好友的用户的 Facebook ID,并将 your_access_token 替换为实际的访问令牌。您自己帐户的示例链接,假设您已登录 Facebook,可在 this page 上找到。)

Graph API(顾名思义)在 Facebook 数据的社交图谱中向外扩展。任何返回 id 的 JSON 对象都可以在其自己的 API 请求中请求以查看其更多信息。您想要的任何信息,例如用户好友的电子邮件地址,如果并且(希望)只有在用户和用户的权限时才可用有问题的朋友允许这样做。 (抱歉,但如果用户的好友明确表示他们的好友无法授予访问此信息的权限,则该信息不可用。)

因此,一旦您的用户授予您的网站查看其 Facebook 数据的请求权限,您就可以获取 Graph API 中可用的任何您想要(并且被允许访问)的数据。 (我讨厌在那里使用“收获”这个词,但你明白了。当然要负责任地行事。)因此,在任何给定实例中,从用户的角度来看,你的过程将是:

    要求用户使用 Facebook 登录,请求特定权限。 从用户那里获得这些权限(否则流程到此结束)。 从您的服务器代码发出后端 Graph API 请求,以从用户的 Facebook 社交图谱中获取相关信息。 向用户提供您可以理解的选项(例如匹配电子邮件地址甚至名称与您已有的用户),无论是您已有的用户(嘿,您的这位朋友在我们的网站上,您愿意吗?想打个招呼?)或邀请您的网站(我们没有您的朋友访问我们网站的记录,请点击此处邀请他们!)等。 然后用户会继续与您​​的网站在此问题上提供的任何功能进行交互。

有意义吗?正如我所提到的,Facebook 上所有这些的文档都发生了很大变化(我在写这篇文章时在他们自己的网站中发现了几个死链接)。他们的编程接口也经常变化。他们可能会开发出更简单的方法来执行此操作,但是一旦您设置好并开始抽象出 Graph API 调用等所有内容,将您的网站与 Facebook 集成就变得非常简单。

【讨论】:

【参考方案2】:

您可以使用 Facebook 登录获取朋友的登录您网站的成员列表。但是,只会显示也在您网站上注册的朋友。 (在 Facebook 术语中,仅限使用相同应用的朋友)

您可以从 facebooks 开发者页面获取以下代码。

Login.php

$fb = new Facebook\Facebook([
  'app_id' => 'app-id', // Replace app-id with your app id
  'app_secret' => 'app-secret',
  'default_graph_version' => 'v2.2',
  ]);

$helper = $fb->getRedirectLoginHelper();

$permissions = ['email','user_friends']; // Optional permissions (THIS IS WHERE YOU GET THE PERMISSION FOR FRIEND'S LIST)
$loginUrl = $helper->getLoginUrl('https://example.com/fb-callback.php', $permissions);

echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook!</a>';

FB-callback.php

$fb = new Facebook\Facebook([
  'app_id' => 'app-id', // Replace app-id with your app id
  'app_secret' => 'app-secret',
  'default_graph_version' => 'v2.2',
  ]);

$helper = $fb->getRedirectLoginHelper();

try 
  $accessToken = $helper->getAccessToken();
 catch(Facebook\Exceptions\FacebookResponseException $e) 
  // When Graph returns an error
  echo 'Graph returned an error: ' . $e->getMessage();
  exit;
 catch(Facebook\Exceptions\FacebookSDKException $e) 
  // When validation fails or other local issues
  echo 'Facebook SDK returned an error: ' . $e->getMessage();
  exit;


if (! isset($accessToken)) 
  if ($helper->getError()) 
    header('HTTP/1.0 401 Unauthorized');
    echo "Error: " . $helper->getError() . "\n";
    echo "Error Code: " . $helper->getErrorCode() . "\n";
    echo "Error Reason: " . $helper->getErrorReason() . "\n";
    echo "Error Description: " . $helper->getErrorDescription() . "\n";
   else 
    header('HTTP/1.0 400 Bad Request');
    echo 'Bad request';
  
  exit;


// Logged in
echo '<h3>Access Token</h3>';
var_dump($accessToken->getValue());

// The OAuth 2.0 client handler helps us manage access tokens
$oAuth2Client = $fb->getOAuth2Client();

// Get the access token metadata from /debug_token
$tokenMetadata = $oAuth2Client->debugToken($accessToken);
echo '<h3>Metadata</h3>';
var_dump($tokenMetadata);

// Validation (these will throw FacebookSDKException's when they fail)
$tokenMetadata->validateAppId(app-id); // Replace app-id with your app id
// If you know the user ID this access token belongs to, you can validate it here
//$tokenMetadata->validateUserId('123');
$tokenMetadata->validateExpiration();

if (! $accessToken->isLongLived()) 
  // Exchanges a short-lived access token for a long-lived one
  try 
    $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
   catch (Facebook\Exceptions\FacebookSDKException $e) 
    echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n";
    exit;
  

  echo '<h3>Long-lived</h3>';
  var_dump($accessToken->getValue());


$_SESSION['fb_access_token'] = (string) $accessToken;

// User is logged in with a long-lived access token.
// You can redirect them to a members-only page.
//header('Location: https://example.com/members.php');

在 login.php 你可以看到下面一行

$permissions = ['email','user_friends']; 

这将提示用户授予访问也在使用该应用程序的朋友的权限。

此代码将从图中获取好友列表

 try 
            // Returns a `Facebook\FacebookResponse` object
            $response = $this->fb->get('/me?fields=id,name,email,gender,user_friends,', $this->token);
         catch(Facebook\Exceptions\FacebookResponseException $e) 
            echo 'Graph returned an error: ' . $e->getMessage();
            exit;
         catch(Facebook\Exceptions\FacebookSDKException $e) 
            echo 'Facebook SDK returned an error: ' . $e->getMessage();
            exit;
        

这些代码都是示例,仅供参考,以便您了解后端发生的情况。我强烈建议你看看https://developers.facebook.com/docs/php/howto/example_facebook_login

如果您对流程还有其他问题,您可以创建新问题以获得答案。

更新:处理 user_friends

使用 Facebook 登录您的网站后,登录的会员将获得您网站的永久唯一 ID。

当您请求该成员的 user_friends 图表时,Facebook Graph 将返回一个用户对象列表,供同时使用此应用的朋友使用。这些对象包括用户 ID(每个应用程序都是唯一的),通过该 ID,您将能够在您的应用程序中连接彼此认识的朋友。

https://developers.facebook.com/docs/graph-api/reference/user/

示例用户 A(ID:1234)和用户 B(ID:5678)

1) 用户 A 使用 Facebook 登录您的网站。

2) 您尝试从用户 A 的 Facebook 请求 user_friends 但它 什么都不返回。

3) 用户 B 使用 Facebook 注册并登录您的网站。

4) 您尝​​试请求用户 B 的 user_friends 和 Facebook 图表 返回用户 A 的 ID 1234。

从那里您可以了解 5679 和 1234 是朋友,并且您可以围绕它设计数据库以将您的成员关联为朋友。

【讨论】:

以上是关于如何将 Facebook 好友导入网站的主要内容,如果未能解决你的问题,请参考以下文章

facebook 如何将通知、好友请求和其他更新推送到其 Android 移动应用程序?

使用FB.api将Facebook好友添加到好友列表中

如何在 Android 应用程序中获取 Facebook 好友列表

如何使用 facebook SDK 获取总 facebook 好友列表? [复制]

检查用户是不是点击了 Facebook Like 按钮(多个按钮)

如何使用 Facebook 好友制作 Android 多人游戏? (Google Play 游戏服务仅使用 G+)