Get iCloud Contact list in C#

2020-03-24 11:27发布

问题:

After searching about iCloud API, I found some example on NodeJS and Python, but unfortunately, I'm not familiar with them. I want to know how to get iCloud Contact list on C#.

Example on python: https://github.com/mindcollapse/iCloud-API/blob/master/iCloud.py Example on NodeJS: https://www.snip2code.com/Snippet/65033/Request-Contact-List-From-iCloud

I try to parse the login code to 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);
            }
        }

I receive 400 : Bad request with above code, please help to go give the direction where I'm wrong, I appreciate your help if there is code example.

Update:

Now I could login and get many information, include my contact server url, dsid, this is the link I used:

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

After that, I use below url to get contact list:

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 is my contact server, it actually is https://p35-contactsws.icloud.com:443, but base on example I refer to, the port :443 need to be removed.

But I still get 421: Client Error

回答1:

I know the answer

Firstly, in this case the request should be WebRequest, not WebClient. In the first api url: https://setup.icloud.com/setup/ws/1/login?clientBuildNumber=WHATEVERNUMBER&clientId=RANDOM_GUID : The WebRequest should be a Post and include appleid, password in data, and in header there should be 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 server will response contact server url, dsid, also "X-APPLE-WEBAUTH-TOKEN" and "X-APPLE-WEBAUTH-USER" (these two values are in header "Set-Cookie" of webResponse)

When you have enough above parameters, you can get icloud contact list, follow by this way:

Make a GET request to this 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 : my contact server url, yours can be different.

+clientVersion: just leave it 2.1

+MyGuid: the Guid you used in the first request.

Important: in the header, must include:

Origin:https://www.icloud.com

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

After that, you will get full iCloud Contact list.

This way is web service base, so it can work in many languages, so I think this can help.