首页 > 技术文章 > 模拟网站登录,操作等(模拟学生管理系统)

zombiecc 2014-04-07 15:22 原文

学生党,苦逼的要做勤工俭学,每天都需要在学校的学生管理系统提交,苦逼的程序员表示不愿意每天都自己去点击,果断写个脚本搞定之~

抓取网站,模拟登录等可以参考链接:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_login.html

首先分析管理系统,抓包,分析

首先抓取登录

 

可以看到服务器使用session_id去认证的,这里就需要post用户名密码,然后设置本地cookie就可以了

提交带cookie数据包可参考链接:http://hi.baidu.com/zhuangzebo/item/da8ab9c13cea204aa8ba9457

Session学习可参考:

http://blogread.cn/it/article/4319

 

 

这里提交的data是字典形式的,需要注意编码(就是因为这个编码问题,搞了一天才OK)

接着抓取提交报告的地方

 

从这里可以看出,提交的时候需要带上我们上次提交的cookie

 

这里提交的data是一个包含字典的列表,具体提交的时候需要注意格式,具体内容在程序中体现

 

源码:(已经替换敏感字符)

 1 #filename:post_name_list1.py
 2 #-*-coding:UTF-8-*-
 3 
 4 import urllib,urllib2,httplib,cookielib,sys,time
 5 
 6 HttpClient1=None
 7 HttpClient2=None
 8 cj=''
 9 
10 #----------获取当前文件系统的编码---------
11 type=sys.getfilesystemencoding()
12 data1={
13     "LoginName" : "00000",
14     "Password" : "313212313132132132",
15     "UniversityCode" : "123131",
16     "LoginWay" : "Number"
17     }
18 
19 #for key in data1:
20 #    print "%s,%s"%(key,data1[key])
21 
22 #-------设置urllib2的Http功能对象---------
23 cj=cookielib.CookieJar()
24 opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
25 urllib2.install_opener(opener)
26 
27 params1 = urllib.urlencode({"data":"%s"%(data1)})
28 headers = {"Content-type": "application/x-www-form-urlencoded",
29                         "Accept": "application/json, text/javascript, */*; q=0.01",
30                         "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0",
31                         "Referer":" http://localhost/index.html",
32                         "Connection":"keep-alive"
33                         }
34 
35 #----------这里是提交post数据包的两种方式,一个可以带cookie-------
36 
37 #httpClient = httplib.HTTPConnection("localhost", 80)
38 #httpClient.request("POST", "/Rbac/Login", params1, headers)
39 
40 HttpClient1=urllib2.Request("http://localhost/Rbac/Login",params1,headers=headers)
41 response1=urllib2.urlopen(HttpClient1)
42 #response = httpClient.getresponse()
43 #print response.status
44 #print response.reason
45 #print response1.read()
46 #print response.getheaders() #获取头信息
47 '''
48 if response.getheader('Set-Cookie')!="":
49     cj=response.getheader('Set-Cookie').split(';')[0]
50     headers['Cookie']=cj
51     print response.getheader('Date').split(';')
52     print cj
53 else:
54     print "get no cookie"
55 '''
56 
57 print "当前cookie:" 
58 for cookie in cj:
59     print cookie
60 
61 ####列表中Note为中文的时候会出错,主要是因为下面urlencode函数%s的原因,暂时没找到办法修改
62 ####但是当data2为字典时就可以,那个不需要%s输出
63 data2=[
64 {"Chief":{"Id":"000000000"},"Student":{"Id":"111111111"},"State":"0","Note":""},
65 {"Chief":{"Id":"000000000"},"Student":{"Id":"222222222"},"State":"1","Note":"实习"},
66 ]
67 #这里date只是随便写个例子
68 #for x in data2:
69 #    print x
70 date=time.strftime("%Y-%m-%d",time.localtime(time.time()))
71 print "提交日期:%s"%date
72 params2 = urllib.urlencode({"Data":data2,"Date":"%s"%date,"GenderCode":"0","ClassId":""})
73 
74 #httpClient = httplib.HTTPConnection("localhost", 80,timeout=30)
75 #httpClient.request("POST", "/Report/SubmitReport?uid=0000000&rid=312312312312321", params2, headers)
76 #response = httpClient.getresponse()
77 
78 HttpClient2=urllib2.Request("http://localhost/Report/SubmitReport?uid=000000000&rid=1132132123132132",params2,headers=headers)
79 response2=urllib2.urlopen(HttpClient2)
80 
81 #--------以当前系统的编码方式输出-----------
82 print "提交结果:"
83 print response2.read().decode('UTF-8').encode(type)
84 
85 #----------关闭连接------------
86 if (response1 or response2):
87     response1.close()
88     response2.close()

 

 

总结:

  1. 学到了两种post提交数据包的方式
  2. 分析cookie和session的认证方式,和提交方式
  3. 更加深入的理解了列表,字典
  4. 认识到了文件编码和字符串编码的重要性
  5. 接着就是学会了坚持,这个小程序我写了3天,也分析了好久,确实坚持下来能学到很多东西。

推荐阅读