c# - 在 C# 中获取 iCloud 联系人列表

标签 c# contacts icloud-api

在搜索 iCloud API 后,我找到了一些关于 NodeJS 和 Python 的示例,但不幸的是,我对它们并不熟悉。我想知道如何在 C# 上获取 iCloud 联系人列表。

Python 示例:https://github.com/mindcollapse/iCloud-API/blob/master/iCloud.py NodeJS 上的示例:https://www.snip2code.com/Snippet/65033/Request-Contact-List-From-iCloud

我尝试将登录代码解析为 C#:

        private void iCloudLogin()
        {
            string guiid = Guid.NewGuid().ToString("N");
            //string url = "https://p12-setup.icloud.com/setup/ws/1/login?clientBuildNumber=1P24&clientId=" + guiid;
            string url = "https://setup.icloud.com/setup/ws/1/login?clientBuildNumber=1P24&clientId=" + guiid;

            using (var client = new WebClient())
            {
                client.Headers.Set("Origin", "https://www.icloud.com");
                client.Headers.Set("Referer", "https://www.icloud.com");
                client.Headers.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36");

                var values = new NameValueCollection();
                values["apple_id"] = appleId;
                values["password"] = password;
                values["extended_login"] = "false";

                var response = client.UploadValues(url, values);
            }
        }

我收到 400 : Bad request with above code,请帮忙指出我错的方向,如果有代码示例,我感谢你的帮助。

更新:

现在我可以登录并获取很多信息,包括我的联系服务器 url、dsid,这是我使用的链接:

https://p12-setup.icloud.com/setup/ws/1/login?clientBuildNumber=1P24&clientId=MyGuid

之后,我使用下面的 url 获取联系人列表:

https://p35-contactsws.icloud.com/co/startup?clientBuildNumber=1P24&clientId=MyGuid&clientVersion=2.1&dsid=MyDSID&locale=en-EN&order=last%2Cfirst

https://p35-contactsws.icloud.com是我的联系服务器,它实际上是https://p35-contactsws.icloud.com:443 ,但根据我引用的示例,需要删除端口 :443。

但我仍然得到 421:客户端错误

最佳答案

我知道答案

首先,在这种情况下,请求应该是 WebRequest,而不是 WebClient。 在第一个 api url 中:https://setup.icloud.com/setup/ws/1/login?clientBuildNumber=WHATEVERNUMBER&clientId=RANDOM_GUID : WebRequest 应该是一个 Post 并且在数据中包含 appleid,密码,并且在 header 中应该有 Origin= https://www.icloud.com :

private void iCloudLogin() 
{        
    string data = "{\"apple_id\":" + appleId + ", \"password\":" + password + ", \"extended_login\":false}";
    byte[] dataStream = Encoding.UTF8.GetBytes(data);
    WebRequest webRequest = WebRequest.Create(url);
    webRequest.Method = "POST";
    webRequest.Headers.Set("Origin", "https://www.icloud.com");
    webRequest.ContentLength = dataStream.Length;
    Stream newStream=webRequest.GetRequestStream();
    // Attach the data.
    newStream.Write(dataStream,0,dataStream.Length);
    newStream.Close();
    WebResponse webResponse = webRequest.GetResponse();
    // get contact server url, dsid, Cookie
}

iCloud 服务器将响应联系服务器 url、dsid,还有“X-APPLE-WEBAUTH-TOKEN”和“X-APPLE-WEBAUTH-USER”(这两个值在 webResponse 的 header “Set-Cookie”中)

当你有足够的以上参数时,你可以获取icloud联系人列表,如下所示:

向此 url 发出 GET 请求: https://p35-contactsws.icloud.com/co/startup?clientBuildNumber=1P24&clientId=MyGuid&clientVersion=2.1&dsid=MyDSID&locale=en-EN&order=last%2Cfirst

+ https://p35-contactsws.icloud.com : 我的联系服务器 url,你的可以不同。

+clientVersion: 2.1就可以了

+MyGuid:您在第一个请求中使用的 Guid。

重要:在标题中,必须包括:

来源:https://www.icloud.com

Cookie:X-APPLE-WEBAUTH-TOKEN=XXXXXX;X-APPLE-WEBAUTH-USER=YYYYYYYYY

之后,您将获得完整的 iCloud 联系人列表。

这种方式是基于 Web 服务的,因此它可以在多种语言中工作,所以我认为这会有所帮助。

关于c# - 在 C# 中获取 iCloud 联系人列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457068/

相关文章:

c# - 在 WinForms 应用程序中第二次未检测到任务管理器关闭

c# - WPF MVVM 将 TextBlock 的文本绑定(bind)到 ObservableCollection 成员

ios - Apple Pay - 我们可以在 Objective C 中提取电子邮件和电话号码吗

c# - 我如何启动进程并隐藏它的窗口?

c# - 如何在 C# 中进行 "minimal match"正则表达式搜索?

angularjs - MEAN.JS 联系表

java - 如何导出vCard 3.0?

ios - 如何检查用户是否可以登录 CloudKit?

ios - 在应用程序中从 iCloud 下载用户的文件

icloud - 通过 CloudKit JS 从 iCloud 联系人获取地址