马后炮之12306抢票工具(一) -- 登录
前段时间一直使用“车票无忧”在抢票(最开始觉得蛮好用,而且没什么时间,就先用着了。)
不管免费版还是收费版问题如下:
1)不支针对同一批列车按席别优先级进行买票。(比如有卧铺买卧铺,没有卧铺买硬座,硬座也没有买软卧,在没有就买站票)
2)不支持对同一批列车按时间优先级进行买票。(比如先买2月5号,没有买2月4日,再没有卖2月3日)
PS:因为买到一张不想要的票,但是又过了放票时间,所以开着“车票无忧”打断捡漏,发现不符合个人需求。
所以打算最近抽出点时间来自己做一个自己的“火车票不发愁”工具,(*^__^*) 嘻嘻……
遇到问题:
1)The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
在request = WebRequest.Create(url) as HttpWebRequest;之前加入:
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true; //总是接受
}
2)Post过去没有返回登录错误
跟踪报文发现包头不对,加入如下包头后正常:
request.Headers.Add("Pragma", "no-cache");
request.Headers.Add("Cache-Control", "no-cache");
request.Headers.Add("X-Requested-With", "XMLHttpRequest");
第一步:构建HttpHelper
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Security; 7 using System.Security.Cryptography.X509Certificates; 8 using System.Text; 9 using System.Threading.Tasks; 10 11 namespace WindowsFormsApplication1 12 { 13 public class HttpHelper 14 { 15 private static readonly string DefaultUserAgent = "Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0"; 16 /// <summary> 17 /// 创建GET方式的HTTP请求 18 /// </summary> 19 /// <param name="url">请求的URL</param> 20 /// <param name="timeout">请求的超时时间</param> 21 /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> 22 /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> 23 /// <returns></returns> 24 public static HttpWebResponse CreateGetHttpResponse(string url, int? timeout, string userAgent, CookieCollection cookies, string Referer = "") 25 { 26 if (string.IsNullOrEmpty(url)) 27 { 28 throw new ArgumentNullException("url"); 29 } 30 31 HttpWebRequest request; 32 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) 33 { 34 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); 35 request = WebRequest.Create(url) as HttpWebRequest; 36 request.ProtocolVersion = HttpVersion.Version10; 37 } 38 else 39 { 40 request = WebRequest.Create(url) as HttpWebRequest; 41 } 42 request.Method = "GET"; 43 request.Referer = Referer; 44 request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 45 request.ContentType = "application/x-www-form-urlencoded"; 46 47 request.UserAgent = DefaultUserAgent; 48 if (!string.IsNullOrEmpty(userAgent)) 49 { 50 request.UserAgent = userAgent; 51 } 52 if (timeout.HasValue) 53 { 54 request.Timeout = timeout.Value; 55 } 56 if (cookies != null) 57 { 58 request.CookieContainer = new CookieContainer(); 59 request.CookieContainer.Add(cookies); 60 } 61 return request.GetResponse() as HttpWebResponse; 62 } 63 /// <summary> 64 /// 创建POST方式的HTTP请求 65 /// </summary> 66 /// <param name="url">请求的URL</param> 67 /// <param name="parameters">随同请求POST的参数名称及参数值字典</param> 68 /// <param name="timeout">请求的超时时间</param> 69 /// <param name="userAgent">请求的客户端浏览器信息,可以为空</param> 70 /// <param name="requestEncoding">发送HTTP请求时所用的编码</param> 71 /// <param name="cookies">随同HTTP请求发送的Cookie信息,如果不需要身份验证可以为空</param> 72 /// <returns></returns> 73 public static HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, int? timeout, string userAgent, Encoding requestEncoding, CookieCollection cookies, string Referer) 74 { 75 if (string.IsNullOrEmpty(url)) 76 { 77 throw new ArgumentNullException("url"); 78 } 79 if (requestEncoding == null) 80 { 81 throw new ArgumentNullException("requestEncoding"); 82 } 83 HttpWebRequest request = null; 84 //如果是发送HTTPS请求 85 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) 86 { 87 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); 88 request = WebRequest.Create(url) as HttpWebRequest; 89 request.ProtocolVersion = HttpVersion.Version10; 90 } 91 else 92 { 93 request = WebRequest.Create(url) as HttpWebRequest; 94 } 95 request.Method = "POST"; 96 request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5"); 97 98 if (cookies != null) 99 { 100 request.CookieContainer = new CookieContainer(); 101 request.CookieContainer.Add(cookies); 102 } 103 104 request.Headers.Add("Pragma", "no-cache"); 105 request.Headers.Add("Cache-Control", "no-cache"); 106 request.Headers.Add("X-Requested-With", "XMLHttpRequest"); 107 request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 108 request.ContentType = "application/x-www-form-urlencoded"; 109 request.Referer = Referer; 110 111 if (!string.IsNullOrEmpty(userAgent)) 112 { 113 request.UserAgent = userAgent; 114 } 115 else 116 { 117 request.UserAgent = DefaultUserAgent; 118 } 119 120 if (timeout.HasValue) 121 { 122 request.Timeout = timeout.Value; 123 } 124 125 request.Expect = string.Empty; 126 127 //如果需要POST数据 128 if (!(parameters == null || parameters.Count == 0)) 129 { 130 StringBuilder buffer = new StringBuilder(); 131 int i = 0; 132 foreach (string key in parameters.Keys) 133 { 134 if (i > 0) 135 { 136 buffer.AppendFormat("&{0}={1}", key, parameters[key]); 137 } 138 else 139 { 140 buffer.AppendFormat("{0}={1}", key, parameters[key]); 141 } 142 i++; 143 } 144 byte[] data = requestEncoding.GetBytes(buffer.ToString()); 145 using (Stream stream = request.GetRequestStream()) 146 { 147 stream.Write(data, 0, data.Length); 148 } 149 } 150 return request.GetResponse() as HttpWebResponse; 151 } 152 153 private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) 154 { 155 return true; //总是接受 156 } 157 } 158 }
第二步:登录首页,获取Cookie
1 private const string UrlMainPage = "https://dynamic.12306.cn/otsweb/main.jsp"; 2 3 /// <summary> 4 /// 登录首页,获取Cookie 5 /// </summary> 6 /// <param name="userAgent"></param> 7 /// <param name="cookie"></param> 8 public static void GetMainPage(int? timeout = null, string userAgent = null, CookieCollection cookie = null) 9 { 10 var response = HttpHelper.CreateGetHttpResponse(UrlMainPage, timeout, userAgent, cookie ?? Cookies, ""); 11 12 cookies.Add(response.Cookies); 13 }
第三步:获取登录验证码
1 private const string UrlLoginImage = "http://dynamic.12306.cn/otsweb/passCodeAction.do?rand=sjrand"; 2 3 /// <summary> 4 /// 获取登录图片 5 /// </summary> 6 /// <param name="userAgent"></param> 7 /// <param name="cookie"></param> 8 /// <returns></returns> 9 public static Bitmap GetLoginImage(int? timeout = null, string userAgent = null, CookieCollection cookie = null) 10 { 11 try 12 { 13 var response = HttpHelper.CreateGetHttpResponse(UrlLoginImage, timeout, userAgent, cookie ?? Cookies); 14 Stream resStream = response.GetResponseStream();//得到验证码数据流 15 return new Bitmap(resStream);//初始化Bitmap图片 16 } 17 catch (Exception) 18 { 19 return null; 20 } 21 }
第四步:登录
12306的登录分两步
1)登录http://dynamic.12306.cn/otsweb/loginAction.do?method=loginAysnSuggest页面,获取登录随机码
返回Json格式(例如:{"loginRand":"421","randError":"Y"})。
2)将信息Post到http://dynamic.12306.cn/otsweb/loginAction.do?method=login进行登录
为方便解析Json,使用最近在研究的IronJs解析Json。
1 private const string UrlLoginStep1 = "http://dynamic.12306.cn/otsweb/loginAction.do?method=loginAysnSuggest"; 2 private const string UrlLoginStep2 = "http://dynamic.12306.cn/otsweb/loginAction.do?method=login"; 3 4 /// <summary> 5 /// 登录 6 /// </summary> 7 /// <param name="userName"></param> 8 /// <param name="pass"></param> 9 /// <param name="verificationCode"></param> 10 /// <param name="timeout"></param> 11 /// <param name="userAgent"></param> 12 /// <param name="cookie"></param> 13 /// <returns></returns> 14 public static LoginResponse Login(string userName, string pass, string verificationCode 15 , int? timeout = null, string userAgent = null, CookieCollection cookie = null) 16 { 17 // 获取登录随机验证码loginRand 18 string str = ""; 19 var response = HttpHelper.CreateGetHttpResponse(UrlLoginStep1, timeout, userAgent, cookie ?? Cookies, "http://dynamic.12306.cn/otsweb/loginAction.do?method=init"); 20 cookies.Add(response.Cookies); 21 22 try 23 { 24 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) 25 { 26 str = reader.ReadToEnd(); 27 } 28 29 if (str.Length > 50) 30 { 31 return new LoginResponse() { IsLogined = false, Message = "网络异常,请稍后重试。", type = ErrorType.NetworkError }; 32 } 33 } 34 catch (Exception) 35 { 36 return new LoginResponse() { IsLogined = false, Message = "网络可能存在问题,请您重试一下!", type = ErrorType.NetworkError }; 37 } 38 39 // 解析第一次返回值,获取登录随机验证码loginRand,执行登录 40 var v = new IronJS.Hosting.CSharp.Context(); 41 string strJson = "var json = " + str; 42 dynamic dy = v.Execute(strJson); 43 44 Dictionary<string, string> dic = new Dictionary<string, string>(); 45 dic.Add("loginUser.user_name", userName); 46 dic.Add("nameErrorFocus", ""); 47 dic.Add("user.password", pass); 48 dic.Add("passwordErrorFocus", ""); 49 dic.Add("randCode", verificationCode); 50 dic.Add("randErrorFocus", ""); 51 dic.Add("loginRand", dy.loginRand); 52 response = HttpHelper.CreatePostHttpResponse(UrlLoginStep2, dic, timeout, userAgent, Encoding.UTF8, cookie ?? Cookies, "http://dynamic.12306.cn/otsweb/loginAction.do?method=init"); 53 54 cookies.Add(response.Cookies); 55 56 try 57 { 58 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) 59 { 60 str = reader.ReadToEnd(); 61 } 62 } 63 catch (Exception) 64 { 65 return new LoginResponse() { IsLogined = false, Message = "网络可能存在问题,请您重试一下!", type = ErrorType.NetworkError }; 66 } 67 68 Regex logined = new Regex(@"'[^']*? ,您好!'"); 69 70 Regex networkError = new Regex(@"网络可能存在问题,请您重试一下"); 71 72 Regex verificationError = new Regex(@"请输入正确的验证码"); 73 74 Regex PasswordError = new Regex(@"密码输入错误"); 75 76 if (logined.IsMatch(str)) 77 { 78 return new LoginResponse() { IsLogined = true, Message = "", type = ErrorType.None, LoginName = logined.Matches(str)[0].Value }; 79 } 80 else if (verificationError.IsMatch(str)) 81 { 82 return new LoginResponse() { IsLogined = false, Message = "请输入正确的验证码!", type = ErrorType.NetworkError }; 83 } 84 else if (networkError.IsMatch(str)) 85 { 86 return new LoginResponse() { IsLogined = false, Message = "网络可能存在问题,请您重试一下!", type = ErrorType.NetworkError }; 87 } 88 else if (PasswordError.IsMatch(str)) 89 { 90 return new LoginResponse() { IsLogined = false, Message = "密码错误!", type = ErrorType.PassordError }; 91 } 92 93 return new LoginResponse() { IsLogined = false, Message = "未知错误!", type = ErrorType.OtherError }; 94 }
第五步:获取常用联系人
1 private const string UrlFavoriteContacts = "http://dynamic.12306.cn/otsweb/passengerAction.do?method=getPagePassengerAll"; 2 3 /// <summary> 4 /// 获取常用联系人 5 /// </summary> 6 /// <param name="timeout"></param> 7 /// <param name="userAgent"></param> 8 /// <param name="cookie"></param> 9 public static List<Contact> GetFavoriteContacts(int pageIndex, int pageSize, out int count, int? timeout = null, string userAgent = null, 10 CookieCollection cookie = null) 11 { 12 List<Contact> contacts = new List<Contact>(); 13 count = 0; 14 Dictionary<string, string> dic = new Dictionary<string, string>(); 15 dic.Add("pageIndex", pageIndex.ToString()); 16 dic.Add("pageSize", pageSize.ToString()); 17 dic.Add("passenger_name", "请输入汉字或拼音首字母"); 18 var response = HttpHelper.CreatePostHttpResponse(UrlFavoriteContacts, dic, timeout, userAgent, Encoding.UTF8, cookie ?? Cookies, "https://dynamic.12306.cn/otsweb/passengerAction.do?method=initUsualPassenger12306"); 19 20 cookies.Add(response.Cookies); 21 dynamic dy; 22 try 23 { 24 using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) 25 { 26 var str = reader.ReadToEnd(); 27 28 var v = new IronJS.Hosting.CSharp.Context(); 29 string strJson = "var json = " + str; 30 31 dy = v.Execute(strJson); 32 33 count = (int)dy.recordCount; 34 35 for (int i = 0; i < dy.rows.length; i++) 36 { 37 contacts.Add(new Contact() 38 { 39 Name = dy.rows[i].passenger_name, 40 IdTypeName = dy.rows[i].passenger_id_type_name, 41 IdNo = dy.rows[i].passenger_id_no, 42 IdTypeCode = dy.rows[i].passenger_id_type_code, 43 Mobile = dy.rows[i].mobile_no, 44 PassengerTypeName = dy.rows[i].passenger_type_name, 45 PassengerType = dy.rows[i].passenger_type 46 }); 47 } 48 } 49 } 50 catch (Exception) 51 { 52 53 } 54 55 return contacts; 56 }
Winfrom页面调用:
为了偷偷懒,用了 Control.CheckForIllegalCrossThreadCalls = false;高手们直接忽略吧。。
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 7 8 Control.CheckForIllegalCrossThreadCalls = false; 9 10 System.Threading.ThreadPool.QueueUserWorkItem((m) => 11 { 12 _12306Class.GetMainPage(cookie: new CookieCollection()); 13 GetLoginImage(); 14 }); 15 } 16 17 private void GetLoginImage() 18 { 19 pictureBox1.Image = _12306Class.GetLoginImage(); 20 } 21 22 private void button1_Click(object sender, EventArgs e) 23 { 24 System.Threading.ThreadPool.QueueUserWorkItem((m) => 25 { 26 button1.Enabled = false; 27 28 checkedListBox1.Items.Clear(); 29 30 var v = _12306Class.Login(textBox1.Text, textBox2.Text, textBox3.Text); 31 if (v.IsLogined) 32 { 33 int count = 0; 34 int pageSize = 7; 35 int pageIndex = 0; ; 36 do 37 { 38 List<Contact> contacts = _12306Class.GetFavoriteContacts(pageIndex, pageSize, out count); 39 40 foreach (var contact in contacts) 41 { 42 checkedListBox1.Items.Add(string.Format("{0}\t{1}\t{2}", contact.Name, contact.IdTypeName, contact.IdNo)); 43 } 44 45 } while ((pageIndex + 1) * pageSize < count); 46 } 47 else 48 { 49 MessageBox.Show(v.Message); 50 button1.Enabled = true; 51 } 52 }); 53 } 54 55 private void button2_Click(object sender, EventArgs e) 56 { 57 GetLoginImage(); 58 } 59 60 61 }
交互报文
1 GET /otsweb/main.jsp HTTP/1.0 2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 3 Content-Type: application/x-www-form-urlencoded 4 User-Agent: Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0 5 Host: dynamic.12306.cn 6 Connection: Keep-Alive 7 8 9 10 11 ---------------------------------------------------------------- 12 13 14 15 HTTP/1.1 200 OK 16 Date: Wed, 30 Jan 2013 09:26:23 GMT 17 Server: Apache-Coyote/1.1 18 X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 19 Set-Cookie: JSESSIONID=DF8E17DA665A67ECD327B05D510EC3AA; Path=/otsweb 20 Content-Type: text/html;charset=UTF-8 21 Set-Cookie: BIGipServerotsweb=2513699082.36895.0000; path=/ 22 X-Cache: MISS from cache.51cdn.com 23 X-Via: 1.1 swdx14:8361 (Cdn Cache Server V2.0) 24 Connection: close
1 GET /otsweb/passCodeAction.do?rand=sjrand HTTP/1.1 2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 3 Content-Type: application/x-www-form-urlencoded 4 User-Agent: Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0 5 Host: dynamic.12306.cn 6 Cookie: JSESSIONID=DF8E17DA665A67ECD327B05D510EC3AA; BIGipServerotsweb=2513699082.36895.0000 7 8 ------------------------------------------------------------------------ 9 10 HTTP/1.1 200 OK 11 Date: Wed, 30 Jan 2013 09:26:27 GMT 12 Server: Apache-Coyote/1.1 13 X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 14 Pragma: No-cache 15 Cache-Control: no-cache 16 Expires: Thu, 01 Jan 1970 00:00:00 GMT 17 Content-Type: image/jpeg 18 Transfer-Encoding: chunked 19 X-Cache: MISS from cache.51cdn.com 20 X-Via: 1.1 swdx15:8361 (Cdn Cache Server V2.0) 21 Connection: keep-alive 22 23 21 24 �PNG 25
1 GET /otsweb/loginAction.do?method=loginAysnSuggest HTTP/1.1 2 Referer: http://dynamic.12306.cn/otsweb/loginAction.do?method=init 3 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 4 Content-Type: application/x-www-form-urlencoded 5 User-Agent: Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0 6 Host: dynamic.12306.cn 7 Cookie: JSESSIONID=DF8E17DA665A67ECD327B05D510EC3AA; BIGipServerotsweb=2513699082.36895.0000 8 9 10 11 --------------------------------------------------------------------- 12 13 14 HTTP/1.1 200 OK 15 Date: Wed, 30 Jan 2013 09:26:33 GMT 16 Server: Apache-Coyote/1.1 17 X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 18 Pragma: no-cache 19 Cache-Control: no-cache 20 Expires: Wed, 31 Dec 1969 23:59:59 GMT 21 Content-Type: text/html;charset=UTF-8 22 Content-Length: 35 23 X-Cache: MISS from cache.51cdn.com 24 X-Via: 1.1 swdx15:8361 (Cdn Cache Server V2.0) 25 Connection: keep-alive 26 27 {"loginRand":"896","randError":"Y"}
1 POST /otsweb/loginAction.do?method=login HTTP/1.1 2 Accept-Language: zh-CN,en-GB;q=0.5 3 Pragma: no-cache 4 Cache-Control: no-cache 5 X-Requested-With: XMLHttpRequest 6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 7 Content-Type: application/x-www-form-urlencoded 8 Referer: http://dynamic.12306.cn/otsweb/loginAction.do?method=init 9 User-Agent: Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0 10 Host: dynamic.12306.cn 11 Cookie: JSESSIONID=DF8E17DA665A67ECD327B05D510EC3AA; BIGipServerotsweb=2513699082.36895.0000 12 Content-Length: 142 13 Expect: 100-continue 14 15 loginUser.user_name=253180123@qq.com&nameErrorFocus=&user.password=12345678&passwordErrorFocus=&randCode=94ct&randErrorFocus=&loginRand=896 16 17 18 19 ----------------------------------------------------------------------------- 20 21 HTTP/1.1 200 OK 22 Date: Wed, 30 Jan 2013 09:26:34 GMT 23 Server: Apache-Coyote/1.1 24 X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 25 Pragma: no-cache 26 Cache-Control: no-cache 27 Expires: Wed, 31 Dec 1969 23:59:59 GMT 28 Content-Type: text/html;charset=UTF-8 29 Transfer-Encoding: chunked 30 X-Cache: MISS from cache.51cdn.com 31 X-Via: 1.1 swdx15:8361 (Cdn Cache Server V2.0) 32 Connection: keep-alive 33 34 2000
1 POST /otsweb/passengerAction.do?method=getPagePassengerAll HTTP/1.1 2 Accept-Language: zh-CN,en-GB;q=0.5 3 Pragma: no-cache 4 Cache-Control: no-cache 5 X-Requested-With: XMLHttpRequest 6 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 7 Content-Type: application/x-www-form-urlencoded 8 Referer: https://dynamic.12306.cn/otsweb/passengerAction.do?method=initUsualPassenger12306 9 User-Agent: Mozilla/6.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120131 Firefox/14.0 10 Host: dynamic.12306.cn 11 Cookie: JSESSIONID=DF8E17DA665A67ECD327B05D510EC3AA; BIGipServerotsweb=2513699082.36895.0000 12 Content-Length: 71 13 Expect: 100-continue 14 15 pageIndex=0&pageSize=7&passenger_name=请输入汉字或拼音首字母 16 17 18 19 ----------------------------------------------------------------------------------- 20 21 22 23 HTTP/1.1 200 OK 24 Date: Wed, 30 Jan 2013 09:26:35 GMT 25 Server: Apache-Coyote/1.1 26 X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1 27 Pragma: no-cache 28 Cache-Control: no-cache 29 Expires: Wed, 31 Dec 1969 23:59:59 GMT 30 Content-Type: text/html;charset=UTF-8 31 Content-Length: 1329 32 X-Cache: MISS from cache.51cdn.com 33 X-Via: 1.1 swdx15:8361 (Cdn Cache Server V2.0) 34 Connection: keep-alive 35 36 {"recordCount":2,"rows":[{"address":"","born_date":{"date":25,"day":0,"hours":13,"minutes":39,"month":10,"seconds":36,"time":1353821976686,"timezoneOffset":-480,"year":112},"code":"1","country_code":"","email":"","first_letter":"","isUserSelf":"N","mobile_no":"12345678901","old_passenger_id_no":"","old_passenger_id_type_code":"","old_passenger_name":"","passenger_flag":"0","passenger_id_no":"123456789012345678","passenger_id_type_code":"1","passenger_id_type_name":"二代身份证","passenger_name":"XX","passenger_type":"1","passenger_type_name":"成人","phone_no":"","postalcode":"","recordCount":"2","sex_code":"","sex_name":"","studentInfo":null},{"address":"","born_date":{"date":20,"day":3,"hours":0,"minutes":0,"month":5,"seconds":0,"time":645807600000,"timezoneOffset":-540,"year":90},"code":"2","country_code":"CN","email":"253180123@qq.com","first_letter":"COSMOKEY","isUserSelf":"Y","mobile_no":"12345678901","old_passenger_id_no":"","old_passenger_id_type_code":"","old_passenger_name":"","passenger_flag":"0","passenger_id_no":"123456789012345678","passenger_id_type_code":"1","passenger_id_type_name":"二代身份证","passenger_name":"XXX","passenger_type":"1","passenger_type_name":"成人","phone_no":"","postalcode":"","recordCount":"2","sex_code":"M","sex_name":"男","studentInfo":null}]}
截图:
posted on 2013-01-30 17:42 CosmoKey 阅读(8595) 评论(33) 编辑 收藏 举报