2017-09-05 185 views
0

我正在尝试使用C#中的Json Post请求登录到iCloud。在尝试实施代码之前,我正在使用Chrome控制台研究一些iCloud请求,并使用Ad-on复制请求以获取网站的相同结果。通过Json Post登录到iCloud请求

首先我直接从iCloud的网站查请求:

enter image description here

这是响应:

{ 
"serviceErrors" : [ { 
"code" : "-20101", 
"message" : "Il tuo ID Apple o la password non sono corretti." 
} ] 
} 

使用 “高级REST客户端” 广告的Chrome插件复制请求我已经尝试了相同的URL的相同的JSON请求。但是我得到空的响应: enter image description here

我也试图复制并粘贴整个头(所有设置),比发送请求,但响应是一样的: enter image description here

任何人有一个建议吗?

更新:我想实现通过C#程序JSON请求:

var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://idmsa.apple.com/appleauth/auth/signin"); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = "{accountName: \"briesanji @gmail.com\", password: \"testPassword\", rememberMe: false, trustTokens: []}"; 

      streamWriter.Write(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
     } 

的问题是,执行休息时

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

命中,这让我这个错误:系统。 Net.WebException:'错误远程服务器:(400)请求无效。'

更新:我以这种方式解决:

void POST(string url, string jsonContent) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     request.Method = "POST"; 

     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     Byte[] byteArray = encoding.GetBytes(jsonContent); 

     request.ContentLength = byteArray.Length; 
     request.ContentType = @"application/json"; 

     using (Stream dataStream = request.GetRequestStream()) 
     { 
      dataStream.Write(byteArray, 0, byteArray.Length); 
     } 
     long length = 0; 
     try 
     { 
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
      { 
       length = response.ContentLength; 
      } 
     } 
     catch (WebException ex) 
     { 
      // Log exception and throw as for GET example above 
     } 
    } 

    string GET(string url) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
     try 
     { 
      WebResponse response = request.GetResponse(); 
      using (Stream responseStream = response.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); 
       return reader.ReadToEnd(); 
      } 
     } 
     catch (WebException ex) 
     { 
      WebResponse errorResponse = ex.Response; 
      using (Stream responseStream = errorResponse.GetResponseStream()) 
      { 
       StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); 
       String errorText = reader.ReadToEnd(); 
       // log errorText 
      } 
      throw; 
     } 
    } 

反正我还测试了答案,这是很好的。所以我检查它作为有效的感谢。

+0

为什么C#如果你想有一个JSON请求从铬?无论如何,就我所见,您在Chrome转储和其他客户端中使用完全相同的cookie数据和相同的widgetKey。我认为你必须创建一个没有widget键的原始uri的请求,并从这个响应中获取widgetKey和cookie数据 - 然后你发送你的登录数据到这个新的uri ... **未经测试** – Michael

+0

诺诺我想使用C#代码..但正如你可以阅读我的帖子的第一行两个..我只是想测试应该如何设置Json请求..无论如何..在我的第二个ScreenShot我做了你说的和我在AnyCase中我没有任何结果..我会尽快用C#代码更新这篇文章。 – Briesanji

+0

在你的第二个屏幕截图中,你发送了uri中没有widgetKey的登录数据。并在你的第三个屏幕截图中使用了相同的目标URI ... – Michael

回答

1

有了这个,我没有得到任何错误,第二个请求,只是告诉我,有测试帐户过多失败的登录响应内容...

private static void ICloud() 
    { 
     var cc = new CookieContainer(); 

     var first = (HttpWebRequest)WebRequest.Create("https://idmsa.apple.com/appleauth/auth/signin?widgetKey=83545bf919730e51dbfba24e7e8a78d2&locale=de_DE&font=sf"); 
     first.Method = "GET"; 
     first.CookieContainer = cc; 

     var response1 = (HttpWebResponse)first.GetResponse(); 
     using (var streamReader = new StreamReader(response1.GetResponseStream())) 
     { 
      var result = streamReader.ReadToEnd(); 
     } 

     var second = (HttpWebRequest)WebRequest.Create("https://idmsa.apple.com/appleauth/auth/signin"); 
     second.ContentType = "application/json"; 
     second.Method = "POST"; 
     second.Accept = "application/json"; 
     second.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); 
     second.Referrer = "https://idmsa.apple.com/appleauth/auth/signin?widgetKey=83545bf919730e51dbfba24e7e8a78d2&locale=de_DE&font=sf"; 
     second.Headers.Add("X-Requested-With", "XMLHttpRequest"); 
     second.Headers.Add("X-Apple-Widget-Key", "83545bf919730e51dbfba24e7e8a78d2"); 

     using (var streamWriter = new StreamWriter(second.GetRequestStream())) 
     { 
      string json = "{\"accountName\":\"[email protected]\",\"password\":\"test\",\"rememberMe\":false,\"trustTokens\":[]}"; 

      streamWriter.Write(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 

     try 
     { 
      var response2 = (HttpWebResponse)second.GetResponse(); 
      using (var streamReader = new StreamReader(response2.GetResponseStream())) 
      { 
       var result = streamReader.ReadToEnd(); 
      } 
     } 
     catch(WebException we) 
     { 
      using (var r = new StreamReader(we.Response.GetResponseStream())) 
      { 
       var result2 = r.ReadToEnd(); 
      } 
     } 
    } 
+0

你也得到一个长的Html文件作为响应吗? – Briesanji

+0

@Briesanji是的。我得到了icloud的洞html页面.com ...的消息是,有太多的登录尝试和帐户需要解锁... – Michael

+0

Mhhhh ..是我得到的相同的消息,当我尝试使用我的真实凭证登录时。答案几乎是正确的,但有些东西我错过了(我试图用Icloud站点上的帐户登录,并且一切顺利) 我也收到了使用我的电子邮件并插入错误密码的错误。 。但是我期望在pwd错误的情况下做出这种响应:“服务错误”:[“code”:“-20101”, “message”:“Il tuo ID Apple o la password non sono corretti。” }] }“ – Briesanji