kairen kairen - 15 days ago 5
C# Question

Get iCloud Contact list in C#

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

Answer

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.

Comments