将上面的代码重构了一下,并且添加了cookies,这样我们就不需要每次登陆了

  1 # !/usr/bin/python
  2 #  -*- coding: UTF-8 -*-
  3
  4 import  urllib
  5 import  cookielib, urllib2
  6 import  os
  7 import  re
  8
  9 class  Fun:
 10      def   __init__ (self,username,password,times = 1 ,                  dataFileName = ' fun.data ' ,loginurl = '' ,posturl = '' ,                  proxies = {},pform = None,cookies = None):
 11          print   ' 初始化 '
 12         self.username = username
 13         self.password = password
 14         self.times  =  times
 15         self.loginurl = loginurl
 16         self.posturl  =  posturl
 17         self.proxies = proxies
 18         self.pform = pform        
 19         self.dataFileName = dataFileName
 20         self.cookies = cookielib.CookieJar()
 21         self.opener = None
 22     
 23      def  login(self):    
 24          """
 25             登陆
 26          """         
 27          print   ' 登陆 '
 28         loginparams  =  urllib.urlencode({ ' j_username ' :self.username,                                                 ' j_password ' :self.password,
 29                                                                              ' UPC_REQUEST_URI ' : ' *.do ' ,                                                 ' UPC_LOGIN_FLAG ' : ' UPC_LOGIN_FLAG ' }) 
 30         self.opener  =  urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
 31                         
 32         self.pform  =  self.opener.open(self.loginurl,loginparams)
 33          print   ' 登陆成功 '
 34                         
 35      def  post(self):
 36          """
 37             解析登陆完成的HTML页面,获取用户相应的信息
 38          """     
 39          print   ' 解析html页面,获取服务器端返回的内容 '
 40         content  =   ' ' .join(self.pform.readlines())            
 41         items  =  [ " employeeName " , " department " , " workArea " , " workCity " , " fillInDate " ]
 42         values  =  []
 43          for  item  in  items:
 44             pattern  =   " name= "" +item+ " "s*(size="d*")?s*                                    value="(S*(s*S*)?)"s*id=""+item+"""
 45            matcher = re.search(pattern,content)
 46            
 47            if matcher!=None:        
 48                values.append(matcher.groups()[1])
 49                print values
 50            else:
 51                values.append('')
 52        print '解析完成'                
 53        """
 54            提交日报
 55        """        
 56                
 57        print '读取data文件:'+self.dataFileName
 58        f = open(self.dataFileName)
 59        contents = f.readlines()
 60        
 61        #读取data文件,判断是否采用交互界面,还是采用data文件的数据    
 62        
 63        if contents[0]=='n':                    
 64            c = raw_input('是否采用提交当天日志(y/n)?:')
 65            if c=='n':
 66                self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')        
 67            projectId = raw_input('项目名称代码:')
 68            workId = raw_input('具体事项:')
 69            workContent = raw_input('工作内容:')
 70            workNum = raw_input('正常工作时长:')
 71            overtimeNum = raw_input('加班工作时长:')
 72        else:
 73            
 74            #是否采用文件中的时间,如果不采用,则采用当前时间
 75            if contents[1]=='y':                
 76                self.fillInDate = contents[2]
 77            
 78            projectId = contents[3]
 79            workId = contents[4]
 80            workContent = contents[5]
 81            workNum = contents[6]
 82            overtimeNum = contents[7]
 83        
 84        #拼凑参数     o_o
 85        paramsmap = {'employeeId':self.username,                         'employeeName':values[0],
 86             'department':values[1],             'workArea':values[2],             'workCity':values[3],             'fillInDate':values[4],
 87             'detailList.projectId':[projectId],             'detailList.workId':[workId],
 88             'detailList.workContent':[workContent],             'detailList.workNum':[0],             'detailList.overtimeNum':[8]}
 89        
 90        keys = paramsmap.keys()
 91        for key in keys:
 92            print key,':',paramsmap[key]
 93        
 94        postparams = urllib.urlencode(paramsmap)
 95        print    'postparams:'+postparams    
 96        #提交
 97        #opener = urllib2.build_opener(self.cookies)       
 98        print '开始提交日报'
 99        result = self.opener.open(self.posturl,postparams)
100        #result = urllib2.urlopen(posturl,postparams)
101        #todo:解析提过完成页面,获取信息
102        #        
103        result.close()
104        print '日报填写成功'
105        
106    def close(self):
107        """
108        """
109        if not self.pform:
110            self.pform.close()
111        
112
113
114if __name__=='__main__':    
115    #测试一下
116    try:
117        test = Fun(username='',password='',loginurl='',posturl = '')
118        test.login()
119        test.post()
120        test.close()
121    except IOError:        
122        raise


初始化
登陆...
登陆成功
解析html页面,获取服务器端返回的内容
['xd0xecxcfxe9xbexfc']
['xd0xecxcfxe9xbexfc', 'xc4xcfxbexa9']
['xd0xecxcfxe9xbexfc', 'xc4xcfxbexa9', 'xbbxaaxb6xab']
['xd0xecxcfxe9xbexfc', 'xc4xcfxbexa9', 'xbbxaaxb6xab', 'xc4xcfx
bexa9']
['xd0xecxcfxe9xbexfc', 'xc4xcfxbexa9', 'xbbxaaxb6xab', 'xc4xcfx
bexa9', '2005-09-24 17:45:40.0']
解析完成
读取data文件:fun.data
detailList.workId : ['10003102 ']
employeeId : 404
workCity : 南京
detailList.projectId : ['JX0001 ']
detailList.overtimeNum : [8]
detailList.workNum : [0]
detailList.workContent : ['xbbxfcxb2xe9xd0xe8xc7xf3xb7xd6xcexf6 ']
fillInDate : 2005-09-24 17:45:40.0
department : 南京
workArea : 华东
employeeName : 徐祥军
postparams:detailList.workId=%5B%2710003102%5Cn%27%5D&employeeId=404&workCity=%C
4%CF%BE%A9&detailList.projectId=%5B%27JX0001%5Cn%27%5D&detailList.overtimeNum=%5
B8%5D&detailList.workNum=%5B0%5D&detailList.workContent=%5B%27%5Cxbb%5Cxfc%5Cxb2
%5Cxe9%5Cxd0%5Cxe8%5Cxc7%5Cxf3%5Cxb7%5Cxd6%5Cxce%5Cxf6%5Cn%27%5D&fillInDate=2005
-09-24+17%3A45%3A40.0&department=%C4%CF%BE%A9&workArea=%BB%AA%B6%AB&employeeName
=%D0%EC%CF%E9%BE%FC
开始提交日报
日报填写成功