通过winform+模拟登录实现快速一键登录到人才招聘网站

简介:

之前为了便于人事部门招聘登录网站更简洁高效,免去每天频繁输网址、用户名、密码等相关登录信息,特基于winform+HttpWebRequest实现模拟请求登录,最终达到一键登录到招聘网站后台的效果。

要实现一键登录到各大人才招聘网站就必需先了解网站的登录步骤即原理,然后通过代码一步步模拟实现即可。

通过我对前程无忧、中国人才热线、中华英才网 三个网站的登录研究,找出基本相同的以下几个步聚:

1.请求登录主页面,然后获取隐藏域的字段信息;

2.构建登录请求数据,有的网站是form表单请求,有的网站是:json请求

3.请求后获取到登录的Cookie,然后通过设置IE的Cookie,最后打开IE浏览器及指定的管理后台地址即可。

除了上述三大步骤以外,其实还涉及一个重要的知识点,那就是:C#调用javascript脚本并获得执行的结果,因为各网站中有用到js生成的加密数据,而这些js加密方法我们无法直接联想到对应的c#方法,故必需采用js方法获取加密数据,这个在本文后面我会讲解几种方法。

上面已经分析了一键登录到人才招聘网站的原理,下面就分别贴出:前程无忧、中国人才热线、 这二个网站的登录实现代码,并作简要说明,以便大家学习与参考:

(PS:注意实现一键登录只是为了便于人事提高网站的使用效率,请不要利用我的代码作非法的事情,否则后果自负,同时也不排除后续这些网站会改变登录方式,那么这些登录就都会失效的)

登录中国人才热线:HttpLoginCjolHelper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
public  class  HttpLoginCjolHelper
{
     private  static  readonly  CodeDomProvider _provider =  new  Microsoft.JScript.JScriptCodeProvider();
     private  CookieContainer cjolCookies =  new  CookieContainer();
 
 
     public  string  Login( string  loginName,  string  loginPassword)
     {
 
         string  validateCode, codekey;
 
         validateCode = GetValidateCode( out  codekey);
 
         if  ( string .IsNullOrEmpty(validateCode))  return  null ;
 
         var  rs = HttpPost( "http://newrms.cjol.com/Account/HrLogin" new  Dictionary< string object > {
         "r_u_name" , loginName }, {  "r_p_word" , loginPassword },
         "r_v_code" , validateCode },{  "r_v_codekey" , codekey }
         });
 
         string  newUrl = rs.Headers[ "Location" ].ToString();
         if  (newUrl.IndexOf( "/Default" ) < 0 && newUrl.IndexOf( "message" ) > 0)
         {
             string  pattren =  "(?<=message=).+$" ;
             var  regx =  new  System.Text.RegularExpressions.Regex(pattren);
             string  errMsg = regx.Match(newUrl).Value;
             return  Uri.UnescapeDataString(errMsg);
         }
 
         //if (!newUrl.StartsWith("http://" + rs.ResponseUri.Host))
         //{
         //    newUrl = string.Format("http://{0}{1}", rs.ResponseUri.Host, newUrl);
         //}
 
         newUrl =  "http://newrms.cjol.com/searchengine" ;
 
         //var jr = GetResponseContent(rs);
 
         BaseUtil.OpenAdminPage(cjolCookies,  new  Uri(newUrl));
         return  null ;
     }
 
 
     private  HttpWebResponse HttpPost( string  url, Dictionary< string object > postData)
     {
         string  desKey =  "!@#$%26)(*&^cjol<16>:|}{=-/*-+.CJOL@*&^%*()*<299>" ;
         string  logindataVal = HttpLoginCjolHelper.JScriptRun( "jsencrypt" , desKey, JsonConvert.SerializeObject(postData)).ToString();  //DesEncrypt(desKey, JsonConvert.SerializeObject(postData));
         string  postDataContent =  "logindata="  + logindataVal;
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
         request.Method =  "POST" ;
         request.ContentType =  "application/x-www-form-urlencoded" ;
         byte [] data = Encoding.UTF8.GetBytes(postDataContent);
         request.ContentLength = data.Length;
         request.AllowAutoRedirect =  false ;
         request.CookieContainer = cjolCookies;
         //request.Accept = "application/json";
         request.Referer =  "http://www.cjol.com/hr/" ;
         request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
         Stream myRequestStream = request.GetRequestStream();
         myRequestStream.Write(data, 0, data.Length);
         myRequestStream.Close();
         myRequestStream =  null ;
 
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
         return  response;
     }
 
     private  string  GetResponseContent(HttpWebResponse response)
     {
         Stream myResponseStream = response.GetResponseStream();
         StreamReader myStreamReader =  new  StreamReader(myResponseStream, Encoding.UTF8);
         string  retString = myStreamReader.ReadToEnd();
         myStreamReader.Close();
         myResponseStream.Close();
 
         return  retString;
     }
 
     private  string  GetValidateCode( out  string  codekey)
     {
         codekey =  null ;
         string  validateCode =  null ;
         string  validateCodeKey =  null ;
         var  codeForm =  new  FrmValidateCode();
         codeForm.ChangeValidateCode += (btn, args) =>
         {
             validateCodeKey = Guid.NewGuid().ToString().ToLower();
             string  codeimgUrl =  "http://newrms.cjol.com/Common/ValidateCodePicture?Key=1&guid="  + validateCodeKey;
             args.Data[0] = codeimgUrl;
 
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(codeimgUrl);
             request.Method =  "GET" ;
             request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
             request.CookieContainer = cjolCookies;
             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
             Stream myResponseStream = response.GetResponseStream();
             var  codePic =  new  Bitmap(myResponseStream);
             (args.Data[1]  as  PictureBox).Image = codePic;
             myResponseStream.Close();
             myResponseStream =  null ;
 
         };
 
         codeForm.EnterValidateCode += (btn, args) =>
         {
             validateCode = args.Data[0].ToString();
             if  (!CheckValidateCode(validateCode))
             {
                 args.Data[1] =  "验证码校验失败!" ;
             }
         };
 
         if  (codeForm.ShowDialog() == DialogResult.OK)
         {
             codekey = validateCodeKey;
             return  validateCode;
         }
 
         return  null ;
     }
 
     private  bool  CheckValidateCode( string  code)
     {
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://newrms.cjol.com/Account/Verification?txtValidateCode="  + code +  "&rid="  + Guid.NewGuid().ToString( "N" ));
         request.Method =  "GET" ;
         request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
         request.Host =  "newrms.cjol.com" ;
         request.Referer =  "http://www.cjol.com/hr/" ;
         request.CookieContainer = cjolCookies;
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         string  rs = GetResponseContent(response);
         if  (rs.Contains( "(true)" ))
         {
             return  true ;
         }
         else
         {
             return  false ;
         }
     }
 
     public  static  object  JScriptRun( string  jsMethodName,  params  object [] jsParams)
     {
         //编译的参数 
         var  compiler = _provider.CreateCompiler();
         CompilerParameters parameters =  new  CompilerParameters();
         parameters.GenerateInMemory =  true ;
         CompilerResults results = compiler.CompileAssemblyFromSource(parameters, jScriptClass);
         Assembly assembly = results.CompiledAssembly;
 
         //动态编译脚本中的内容 
         Type _evaluateType = assembly.GetType( "kyecjol.jsClass" );
 
         //执行指定的方法并传参数 
         object  retObj = _evaluateType.InvokeMember(jsMethodName, BindingFlags.InvokeMethod,
                     null null , jsParams);
         return  retObj;
     }
 
 
     private  const  string  jScriptClass =  @"
     package kyecjol {
     
         public class jsClass {
 
         public static function jsencrypt(k,e) {
             var t = e.replace(/\\0/g, '')
                 ,n = stringToHex(des(k, t, 1, 0));
                 //,n=stringToHex(k+e);
             return n;
         }
 
         
         public static function des(e, t, n, r,i) {
         var s = 'charCodeAt', o = 'fromCharCode', u = new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756), a = new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-134217728,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-134217728,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-134217728,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-134217728,-2146435040,-2146402272,1081344), f = new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584), l = new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928), c = new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080), h = new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312), p = new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154), d = new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696), v = des_createKeys(e), m = 0, g, y, b, w, E, S, x, T, N, C, k, L, A, O, M, _ = t.length, D = 0, P = v.length == 32 ? 3 : 9;
         P == 3 ? N = n ? new Array(0,32,2) : new Array(30,-2,-2) : N = n ? new Array(0,32,2,62,30,-2,64,96,2) : new Array(94,62,-2,32,64,2,30,-2,-2),
         t += '\0\0\0\0\0\0\0\0';
         var result = '',
         tempresult = '';
 
         r == 1 && (C = i[s](m++) << 24 | i[s](m++) << 16 | i[s](m++) << 8 | i[s](m++),
         L = i[s](m++) << 24 | i[s](m++) << 16 | i[s](m++) << 8 | i[s](m++),
         m = 0);
 
         while (m < _) {
             n ? (x = t[s](m++) << 16 | t[s](m++),
             T = t[s](m++) << 16 | t[s](m++)) : (x = t[s](m++) << 24 | t[s](m++) << 16 | t[s](m++) << 8 | t[s](m++),
             T = t[s](m++) << 24 | t[s](m++) << 16 | t[s](m++) << 8 | t[s](m++)),
             r == 1 && (n ? (x ^= C,
             T ^= L) : (k = C,
             A = L,
             C = x,
             L = T)),
             b = (x >>> 4 ^ T) & 252645135,
             T ^= b,
             x ^= b << 4,
             b = (x >>> 16 ^ T) & 65535,
             T ^= b,
             x ^= b << 16,
             b = (T >>> 2 ^ x) & 858993459,
             x ^= b,
             T ^= b << 2,
             b = (T >>> 8 ^ x) & 16711935,
             x ^= b,
             T ^= b << 8,
             b = (x >>> 1 ^ T) & 1431655765,
             T ^= b,
             x ^= b << 1,
             x = x << 1 | x >>> 31,
             T = T << 1 | T >>> 31;
             for (var y = 0; y < P; y += 3) {
                 O = N[y + 1],
                 M = N[y + 2];
                 for (g = N[y]; g != O; g += M)
                     E = T ^ v[g],
                     S = (T >>> 4 | T << 28) ^ v[g + 1],
                     b = x,
                     x = T,
                     T = b ^ (a[E >>> 24 & 63] | l[E >>> 16 & 63] | h[E >>> 8 & 63] | d[E & 63] | u[S >>> 24 & 63] | f[S >>> 16 & 63] | c[S >>> 8 & 63] | p[S & 63]);
                 b = x,
                 x = T,
                 T = b;
             }
             x = x >>> 1 | x << 31,
             T = T >>> 1 | T << 31,
             b = (x >>> 1 ^ T) & 1431655765,
             T ^= b,
             x ^= b << 1,
             b = (T >>> 8 ^ x) & 16711935,
             x ^= b,
             T ^= b << 8,
             b = (T >>> 2 ^ x) & 858993459,
             x ^= b,
             T ^= b << 2,
             b = (x >>> 16 ^ T) & 65535,
             T ^= b,
             x ^= b << 16,
             b = (x >>> 4 ^ T) & 252645135,
             T ^= b,
             x ^= b << 4,
             r == 1 && (n ? (C = x,
             L = T) : (x ^= k,
             T ^= A)),
             n ? tempresult += String[o](x >>> 24, x >>> 16 & 255, x >>> 8 & 255, x & 255, T >>> 24, T >>> 16 & 255, T >>> 8 & 255, T & 255) : tempresult += String[o](x >>> 16 & 65535, x & 65535, T >>> 16 & 65535, T & 65535),
             n ? D += 16 : D += 8,
             D == 512 && (result += tempresult,
             tempresult = '',
             D = 0);
         }
         return result + tempresult;
     }
     
 
         public static function des_createKeys(e) {
             var t = 'charCodeAt',
             pc2bytes0 = new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964),
             pc2bytes1 = new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697),
             pc2bytes2 = new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272),
             pc2bytes3 = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144),
             pc2bytes4 = new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256),
             pc2bytes5 = new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488),
             pc2bytes6 = new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746),
             pc2bytes7 = new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568),
             pc2bytes8 = new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578),
             pc2bytes9 = new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488),
             pc2bytes10 = new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800),
             pc2bytes11 = new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744),
             pc2bytes12 = new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128),
             pc2bytes13 = new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261);
             var n = e.length >= 24 ? 3 : 1, r = new Array(32 * n), s = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0), o, u, a = 0, f = 0, l,left,right;
 
             for (var c = 0; c < n; c++) {
                 left = e[t](a++) << 24 | e[t](a++) << 16 | e[t](a++) << 8 | e[t](a++),
                 right = e[t](a++) << 24 | e[t](a++) << 16 | e[t](a++) << 8 | e[t](a++),
                 l = (left >>> 4 ^ right) & 252645135,
                 right ^= l,
                 left ^= l << 4,
                 l = (right >>> -16 ^ left) & 65535,
                 left ^= l,
                 right ^= l << -16,
                 l = (left >>> 2 ^ right) & 858993459,
                 right ^= l,
                 left ^= l << 2,
                 l = (right >>> -16 ^ left) & 65535,
                 left ^= l,
                 right ^= l << -16,
                 l = (left >>> 1 ^ right) & 1431655765,
                 right ^= l,
                 left ^= l << 1,
                 l = (right >>> 8 ^ left) & 16711935,
                 left ^= l,
                 right ^= l << 8,
                 l = (left >>> 1 ^ right) & 1431655765,
                 right ^= l,
                 left ^= l << 1,
                 l = left << 8 | right >>> 20 & 240,
                 left = right << 24 | right << 8 & 16711680 | right >>> 8 & 65280 | right >>> 24 & 240,
                 right = l;
 
                 for (var i = 0; i < s.length; i++)
                     s[i] ? (left = left << 2 | left >>> 26,
                     right = right << 2 | right >>> 26) : (left = left << 1 | left >>> 27,
                     right = right << 1 | right >>> 27),
                     left &= -15,
                     right &= -15,
                     o = pc2bytes0[left >>> 28] | pc2bytes1[left >>> 24 & 15] | pc2bytes2[left >>> 20 & 15] | pc2bytes3[left >>> 16 & 15] | pc2bytes4[left >>> 12 & 15] | pc2bytes5[left >>> 8 & 15] | pc2bytes6[left >>> 4 & 15],
                     u = pc2bytes7[right >>> 28] | pc2bytes8[right >>> 24 & 15] | pc2bytes9[right >>> 20 & 15] | pc2bytes10[right >>> 16 & 15] | pc2bytes11[right >>> 12 & 15] | pc2bytes12[right >>> 8 & 15] | pc2bytes13[right >>> 4 & 15],
                     l = (u >>> 16 ^ o) & 65535,
                     r[f++] = o ^ l,
                     r[f++] = u ^ l << 16;
             }
             return r;
 
         }
         
 
         public static function stringToHex(e) {
             var t = 'charCodeAt'
               , n = ''
               , r = new Array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
             for (var i = 0; i < e.length; i++)
                 n += r[e[t](i) >> 4] + r[e[t](i) & 15];
             return n
         }
 
 
     }
 
     }" ;
 
 
}

代码逻辑简要说明:

1.GetValidateCode方法:通过GET请求获取登录验证码,并显示在winform的界面上,以便用户可以参照输入,当然如果能够使用第三方打码工具自动识别验证码那就更简单了。

2.HttpPost方法:构建POST请求登录,并返回HttpWebResponse对象

3.从头部取得跳转的位置string newUrl = rs.Headers["Location"].ToString();如果是Default页面且包含message,则通过正则取到message信息并在winform界面上显示报错。

4.jScriptClass这个是从中国人才热线网站COPY的加密算法逻辑,JScriptRun就是执行JS加密算法并得到结果。

5.BaseUtil.OpenAdminPage方法:设置IE COOKIE,并用IE打开管理后台网址;

登录人才热线网站的关键点在于:JS加密及验证码

用法如下:

1
2
3
4
5
6
var  httpLoginCjol =  new  HttpLoginCjolHelper();
string  result = httpLoginCjol.Login(txtCjolUid.Text.Trim(), txtCjolPwd.Text);
if  (! string .IsNullOrEmpty(result))
{
     MessageBox.Show( "登录中国人才热线网站失败,原因:"  + result,  "登录失败提示" );
}

  

登录前程无忧:HttpLogin51JobHelper

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
public  class  HttpLogin51JobHelper
{
     private  CookieContainer web51jobCookies =  new  CookieContainer();
 
     public  string  Login( string  uName,  string  uId,  string  pwd)
     {
         string  langType, accessKey, fksc, hidEhireGuid, hidRetUrl;
         ReadHomePageData( out  langType,  out  accessKey,  out  fksc,  out  hidEhireGuid,  out  hidRetUrl);
         string  loginUrl =  "https://ehirelogin.51job.com/Member/UserLogin.aspx" ;
         var  rs = HttpPost(loginUrl,  new  Dictionary< string string >
         {
             { "ctmName" ,uName},{ "userName" ,uId},
             { "password" ,pwd},{ "checkCode" , "" },
             { "oldAccessKey" ,accessKey},{ "langtype" ,langType},
             { "isRememberMe" , "false" },{ "sc" ,fksc},
             { "ec" ,hidEhireGuid},{ "returl" ,hidRetUrl},
             { "referrurl" , "http://ehire.51job.com/" }
         });
 
         string  newUrl = rs.Headers[ "Location" ].ToString();  // "http://ehire.51job.com/Candidate/SearchResumeIndexNew.aspx";
         if  (newUrl.IndexOf( "errorId=" , StringComparison.OrdinalIgnoreCase) > 0)
         {
             return  GetLoginErrMsg(newUrl);
         }
 
         //string rsString = GetResponseContent(rs);
 
         BaseUtil.OpenAdminPage(web51jobCookies,  new  Uri(newUrl));
 
         return  null ;
     }
 
     private  void  ReadHomePageData( out  string  langType,  out  string  accessKey,  out  string  fksc,  out  string  hidEhireGuid,  out  string  hidRetUrl)
     {
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create( "http://ehire.51job.com/" );
         request.Method =  "GET" ;
         request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
         request.CookieContainer = web51jobCookies;
         request.Host =  "ehire.51job.com" ;
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         string  rspContent = GetResponseContent(response);
 
         langType =  "Lang=&Flag=1" //getHiddenValueByElementId("hidLangType", rspContent);
         accessKey = getHiddenValueByElementId( "hidAccessKey" , rspContent);
         fksc = getHiddenValueByElementId( "fksc" , rspContent);
         hidEhireGuid = getHiddenValueByElementId( "hidEhireGuid" , rspContent);
         hidRetUrl = getHiddenValueByElementId( "hidRetUrl" , rspContent);
     }
 
     private  string  GetLoginErrMsg( string  errUrl)
     {
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(errUrl);
         request.Method =  "GET" ;
         request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
         request.CookieContainer = web51jobCookies;
         request.Host =  "ehire.51job.com" ;
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
         string  rspContent = GetResponseContent(response);
 
         string  pattren =  @"<div\s+id='errOther'.+<a>(?<msg>.+)</a></div>" ;
         var  regx =  new  System.Text.RegularExpressions.Regex(pattren, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
         string  errMsg = regx.Match(rspContent).Groups[ "msg" ].Value;
         return  errMsg;
     }
 
     private  HttpWebResponse HttpPost( string  url, Dictionary< string string > postData)
     {
 
         string  postDataContent =  null ;
         foreach  ( var  kv  in  postData)
         {
             postDataContent +=  string .Format( "&{0}={1}" , kv.Key, kv.Value);
         }
         postDataContent = postDataContent.Substring(1);
 
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
         request.Method =  "POST" ;
         request.ContentType =  "application/x-www-form-urlencoded" ;
         byte [] data = Encoding.UTF8.GetBytes(postDataContent);
         request.ContentLength = data.Length;
         request.AllowAutoRedirect =  false ;
         request.CookieContainer = web51jobCookies;
         request.Host =  "ehire.51job.com" ;
         request.Headers.Set( "Origin" "http://ehire.51job.com" );
         request.Referer =  "http://ehire.51job.com" ;
         request.UserAgent =  "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36" ;
         Stream myRequestStream = request.GetRequestStream();
         myRequestStream.Write(data, 0, data.Length);
         myRequestStream.Close();
         myRequestStream =  null ;
 
         HttpWebResponse response = (HttpWebResponse)request.GetResponse();
 
         return  response;
     }
 
     private  string  getHiddenValueByElementId( string  eId,  string  body)
     {
         string  pattren =  "id=\""  + eId +  "\"\\s+value=\"(?<evalue>\\w+)\"" ;
         var  regx =  new  System.Text.RegularExpressions.Regex(pattren, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
         if  (regx.IsMatch(body))
         {
             return  regx.Match(body).Groups[ "evalue" ].Value;
         }
 
         return  string .Empty;
     }
 
     private  string  GetResponseContent(HttpWebResponse response)
     {
         Stream myResponseStream = response.GetResponseStream();
         StreamReader myStreamReader =  new  StreamReader(myResponseStream, Encoding.UTF8);
         string  retString = myStreamReader.ReadToEnd();
         myStreamReader.Close();
         myResponseStream.Close();
 
         return  retString;
     }
}

代码逻辑简要说明:

1.ReadHomePageData方法:请求登录页面,获取隐藏域的字段信息

2.HttpPost方法:构建POST请求登录,并返回HttpWebResponse对象

3.从头部取得跳转的位置string newUrl = rs.Headers["Location"].ToString();如果包含errorId,则通过请求该error页面获取错误信息GetLoginErrMsg并在winform界面上显示报错。

4.BaseUtil.OpenAdminPage方法:设置IE COOKIE,并用IE打开管理后台网址;

登录前程无忧网站的关键点在于:取得登录页面的隐藏域的字段信息

用法如下:

1
2
3
4
5
6
var  httpLogin51Job =  new  HttpLogin51JobHelper();
string  result = httpLogin51Job.Login(txt51JobUName.Text.Trim(), txt51JobUid.Text.Trim(), txt51JobPwd.Text);
if  (! string .IsNullOrEmpty(result))
{
     MessageBox.Show( "登录前程无忧网站失败,原因:"  + result,  "登录失败提示" );
}

 

以下是如何设置IE COOKIE及通过IE打开指定网站的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public  static  void  OpenAdminPage(CookieContainer cookies, Uri rsUri)
{
 
     foreach  (Cookie cookie  in  cookies.GetCookies(rsUri))  //将cookie设置为浏览的cookie 
     {
         InternetSetCookie(
              "http://"  + cookie.Domain.ToString(),
              cookie.Name.ToString(),
              cookie.Value.ToString() +  ";expires="  + DateTime.UtcNow.AddDays(1).ToString( "R" ));
     }
 
     System.Diagnostics.Process.Start( "iexplore.exe" , rsUri.AbsoluteUri);  //打开浏览器 
 
}

  

关于C#执行Javascript方法有如下几种:(我这里仅做一个汇总,可能不止这么多)

第一种:引用:Microsoft.JScript.DLL,然后使用:JScriptCodeProvider对象来动态编译jscript脚本(CompileAssemblyFromSource)生成程序集,最后通过这个JS程序集反射执行JS方法;参考说明:http://www.cnblogs.com/xdpxyxy/archive/2013/06/12/3132868.html

第二种:引用:Interop.MSScriptControl.dll,然后使用Eval执行脚本内容,参考说明:http://www.cnblogs.com/preacher/p/6347251.html   、 http://www.cnblogs.com/feiyuhuo/p/5474790.html

第三种:引用:开源项目 Javascript .NET(Noesis.Javascript.dll、msvcp100.dll、msvcr100.dll复制到bin目录下),然后使用JavascriptContext的Run方法执行,参考说明:http://www.cnblogs.com/yjmyzz/p/3359204.html

第四种:引用:Microsoft.JScript.Vsa(Microsoft.JScript、Microsoft.Vsa),然后使用Microsoft.JScript.Eval.JScriptEvaluate方法执行,参考说明:http://www.cnblogs.com/yjmyzz/p/3359204.html

第五种:在winform窗体中加入 WebBrowser 控件,然后将JS通过Url或直接设置DocumentText,最后利用webBrowser1.Document.InvokeScript方法执行WebBrowser 控件包含的JS方法,参考说明:http://blog.csdn.net/luxiaoyu_sdc/article/details/6896451 、 http://www.cnblogs.com/feiyuhuo/p/5474790.html (仅winform项目适用)

本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/6855610.html  ,如需转载请自行联系原作者

相关文章
|
6月前
|
SQL 安全 数据库
织梦CMS后台的一次破解之旅
织梦CMS后台的一次破解之旅
织梦CMS后台的一次破解之旅
|
5月前
|
JSON 小程序 前端开发
微信小程序开发之会议OA首页后台数据交互(内带新知识点分享)
微信小程序开发之会议OA首页后台数据交互(内带新知识点分享)
64 0
|
12月前
|
前端开发
【前端项目】 - 论坛信息管理系统(纯页面)
实现一个简单的论坛信息管理系统. 当前先完成页面设计的部分. 通过前端知识来构建出网页.
229 0
|
前端开发
前端工作总结209-第三方登录
前端工作总结209-第三方登录
37 0
前端工作总结209-第三方登录
|
数据库 数据安全/隐私保护 Python
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
【Django | 开发】面试招聘信息网站(用户登录注册&投在线递简历)
|
安全 Python
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接
|
数据建模 数据库 Python
【Django | 开发】面试招聘信息网站(快速搭建核心需求)
【Django | 开发】面试招聘信息网站(快速搭建核心需求)
【Django | 开发】面试招聘信息网站(快速搭建核心需求)
|
安全 数据安全/隐私保护
相亲交友app开发,不同登录方式的实现要点
相亲交友app开发,不同登录方式的实现要点
新手向- 爬取分析拉勾网招聘信息
[TOC] 爱写bug(ID:icodebugs) 作者:爱写bug 前言: ​ 看了很多网站,只发现获取拉勾网招聘信息是只用post方式就可以得到,应当是非常简单了。推荐刚接触数据分析和爬虫的朋友试一下。
1756 0
|
程序员
程序员如何获取招聘信息
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/82055684 本文出自我的公众号:程序员江湖。