在用户联系人列表中查找注册你的站点的联系人

在此处恢复你的帐户

本主题介绍你的网站如何确定访问用户的任何联系人是否同时为你的网站的注册用户。

当拥有 Microsoft 帐户的用户访问你的网站时,你可以确定访问者的任何联系人是否同时为你的网站的注册用户。你可以结合使用客户端 JavaScript 代码和服务器端代码来执行此操作。

若要判断用户的任何联系人是否已在你的站点注册,请执行下列操作:

在你获得表示你的注册用户的电子邮件地址的哈希列表,以及来自用户联系人的电子邮件地址的哈希列表后,你可以将它们进行比较以查找匹配项。

为了充分利用本主题中的 JavaScript、C#、Objective-C 和 Java 代码示例,可以将它们用在使用代码示例中所提供的详细代码参考示例的上下文中。

生成一组电子邮件地址哈希

对于你的网站的每个注册用户的电子邮件地址,生成一个相对应的哈希。你必须按照以下步骤生成每个哈希:

  1. 去掉电子邮件地址开头和结尾的空格,例如 Someone@Example.org
  2. 去掉发出请求的应用的客户端 ID 开头和结尾的空格,例如 0000000603DB0F
  3. 将步骤 1 和步骤 2 的结果连接起来,例如 Someone@Example.org0000000603DB0F
  4. 将步骤 3 的结果转换为小写,例如 someone@example.org0000000603db0f
  5. 使用 UTF8 编码将步骤 4 的结果转换为二进制。
  6. 计算步骤 5 的 SHA-256 值并将该值转换为其等效的十六进制值,例如,6A9F...63A4。(为简化起见,此处省略了该值的一部分。)
  7. 将步骤 6 的结果转换为小写,例如,6a9f...63a4。此步骤的结果是电子邮件地址哈希。

返回页首

用客户端代码获取电子邮件地址哈希的列表

可以用类似如下的代码获取用户联系人的电子邮件地址列表。

在 JavaScript 中获取电子邮件地址哈希的列表


function friendFinder_onClick() {
    WL.login({
        scope: "wl.basic"
    }).then(
        function (response) {
            WL.api({
                path: "me/contacts",
                method: "GET"
            }).then(
                function (response) {
                    var resultData = response.data;
                    var emailHashes = new Array;
                    for (i = 0; i < resultData.length; i++) {
                        for (j = 0; j < resultData[i].email_hashes.length; j++) {
                            emailHashes[emailHashes.length] = resultData[i].email_hashes[j];
                        }
                    }
                    var resultText = "";
                    for (k = 0; k < emailHashes.length; k++) {
                        resultText += emailHashes[k] + "\r\n";
                    }
                    document.getElementById("infoArea").setAttribute("rows", emailHashes.length);
                    document.getElementById("infoArea").value = resultText;
                },
                function (responseFailed) {
                    document.getElementById("infoArea").value =
                        "Error calling API: " + responseFailed.error.message;
                }
            );
        },
        function (responseFailed) {
            document.getElementById("infoArea").innerText =
                "Error signing in: " + responseFailed.error_description;
        }
    );
}


针对 Windows 应用商店应用和 Windows Phone 应用以 C# 获取电子邮件地址哈希的列表


private async void btnGetEmailHashes_Click(object sender, RoutedEventArgs e)
{
    try
    {
        LiveConnectClient liveClient = new LiveConnectClient(this.session);
        LiveOperationResult operationResult = await liveClient.GetAsync("me");
        dynamic result = operationResult.Result;
        string message = "";
        List<object> data = null;
        IDictionary<string, object> contact = null;
        List<object> emailHashes = null;
        if (result.ContainsKey("data"))
        {
            data = (List<object>)result["data"];
            for (int i = 0; i < data.Count; i++)
            {
                contact = (IDictionary<string, object>)data[i];
                if (contact.ContainsKey("email_hashes"))
                {
                    emailHashes = (List<object>)contact["email_hashes"];
                    for (int j = 0; j < emailHashes.Count; j++)
                    {
                        message += emailHashes[j].ToString() + "\r\n";
                    }
                }
            }
        }
        infoTextBlock.Text = message;
    }
    catch (LiveConnectException exception)
    {
        this.infoTextBlock.Text = "Error getting email hashes: " + exception.Message;
    }
}


[]

针对 iOS 以 Objective-C 获取电子邮件地址哈希的列表


- (void) getEmailHashes
{
    [self.liveClient getWithPath:@"me/contacts" 
                        delegate:self];
}

- (void) liveOperationSucceeded:(NSDictionary *)result
{
    NSArray *contacts = [result objectForKey:@"data"];
    for (NSDictionary *contact in contacts) 
    {
        NSArray *emailHashes = [contact objectForKey:@"email_hashes"];
        for (NSString *emailHash in emailHashes)
        {
            self.displayLabel.text = [NSString stringWithFormat:@"%@,\n %@", self.displayLabel.text, emailHash];
        }
    }
}


针对 Android 以 Java 获取电子邮件地址哈希的列表


public void friendFinder() {
    final LiveOperationListener opListener = new LiveOperationListener() {
        public void onError(LiveOperationException exception, LiveOperation operation) {
               resultTextView.setText(exception.getMessage());
           }
        public void onComplete(LiveOperation operation) {
            JSONObject result = operation.getResult();
               try {
                   JSONArray contacts = result.optJSONArray("data");
                   List<String> emailHashes = new ArrayList<String>();
                   for (int i = 0; i < contacts.length(); i++) {
                      JSONObject contact = contacts.getJSONObject(i);
                      JSONArray contactEmailHashes = contact.getJSONArray("email_hashes");
                      if (contactEmailHashes != null) {
                          for (int j = 0; j < contactEmailHashes.length(); j++) {
                              emailHashes.add(contactEmailHashes.optString(j));
                          }
                      }
                  }
                  String resultText = "Email hashes:\n";
                  for (int k = 0; k < emailHashes.size(); k++) {
                      resultText += emailHashes.get(k) + "\n";
                  }
                  resultTextView.setText(resultText);
               }
               catch(JSONException ex) {
                   resultTextView.setText("Error getting email hashes: " + ex.getMessage());
               }
        }
       };
    auth.login(this, Arrays.asList(new String[] { "wl.basic" }), 
        new LiveAuthListener() {
               public void onAuthError(LiveAuthException exception, Object userState) {
                   resultTextView.setText("Error signing in: " + exception.getMessage());
               }
            public void onAuthComplete(LiveStatus status, LiveConnectSession session, Object userState) {
                client.getAsync("me/contacts", opListener);                    
               }
        }
    );
}


返回页首

用服务器代码获取电子邮件地址哈希的列表

如果用户已登录并且同意 wl.basic 作用域请求,而且你拥有与该请求相对应的访问令牌,则可以检索用户的联系人列表。对于针对给定的联系人提供的每个电子邮件地址,都将显示一个电子邮件地址哈希。 你可以通过使用首选的编码语言和平台提取电子邮件地址哈希。若要获取电子邮件地址哈希的列表,请使用 REST 和下面的请求参数发出服务器端 HTTP GET 调用。

https://apis.live.net/v5.0/me/contacts?access_token=ACCESS_TOKEN

在上述 REST 代码示例中,将 ACCESS_TOKEN 替换为访问令牌字符串。

JavaScript 对象表示法 (JSON) 格式的响应集合如下所示。(为简化起见,显示省略号来代替所省去的信息。)

{
   "data": [
      {
         "id": "contact.b4466224b2ca42798c3d4ea90c75aa56", 
         "first_name": "Henrik", 
         "last_name": "Jensen", 
         ...
         "email_hashes": [
            "9ecdb19f4eb8e04304c5d1280368c42e85b6e4fe39f08b0c837ec592b905a620", 
            "fc05492f50da6488aa14dcf221d395bcb29a4e43b43b250d60c68df4f831cad3"
         ], 
         ...
      }, {
         ...
      }
   ]
}

如需深入了解如何使用 REST 进行服务器端 HTTP 调用,请参阅服务器端方案

返回页首

 

 

显示:
© 2014 Microsoft