【问题标题】:Get iCloud Contact list in C#在 C# 中获取 iCloud 联系人列表
【发布时间】:2015-10-06 01:37:35
【问题描述】:

在搜索了 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

之后,我使用以下网址获取联系人列表:

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:客户端错误

【问题讨论】:

    标签: c# contacts icloud-api


    【解决方案1】:

    我知道答案

    首先,在这种情况下,请求应该是 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 联系人列表,按照这种方式:

    向该网址发出 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 联系人列表。

    这种方式是基于网络服务的,所以它可以支持多种语言,所以我认为这会有所帮助。

    【讨论】:

    • 我正在使用这些步骤。但是我在对我的联系 URL 执行获取请求时收到 400 Bad Request 错误。我的联系方式是:p49-contactsws.icloud.com/co/…
    • @AlexPaul 你有没有找到解决 400 Bad Request 问题的方法?
    • 确保区域设置正确,当我使用 en_EN 时,我收到了错误的请求错误。当我最终(通过反复试验)最终通过 en_US 时,我收到了有效的回复。
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 2017-06-22
    • 2016-10-08
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多