在 C# 中获取 iCloud 联系人列表
Get iCloud Contact list in C#
在搜索 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,这是我使用的link:
https://p12-setup.icloud.com/setup/ws/1/login?clientBuildNumber=1P24&clientId=MyGuid
之后,我使用下面的 url 来获取联系人列表:
https://p35-contactsws.icloud.com is my contact server, it actually is 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。
重要:在header中,必须包括:
Cookie:X-APPLE-WEBAUTH-TOKEN=XXXXXX;X-APPLE-WEBAUTH-USER=YYYYYYYYY
之后,您将获得完整的 iCloud 联系人列表。
这种方式是 web 服务基础,所以它可以在多种语言中工作,所以我认为这会有所帮助。
在搜索 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,这是我使用的link:
https://p12-setup.icloud.com/setup/ws/1/login?clientBuildNumber=1P24&clientId=MyGuid
之后,我使用下面的 url 来获取联系人列表:
https://p35-contactsws.icloud.com is my contact server, it actually is 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。
重要:在header中,必须包括:
Cookie:X-APPLE-WEBAUTH-TOKEN=XXXXXX;X-APPLE-WEBAUTH-USER=YYYYYYYYY
之后,您将获得完整的 iCloud 联系人列表。
这种方式是 web 服务基础,所以它可以在多种语言中工作,所以我认为这会有所帮助。