躺在沙滩上的小猪

快乐的每一天

自由的python o_o

问题:
       公司的日报,每天填写的时候总是那么巨慢,都有点恐惧它了!

解决方案:
       让代码帮我们每天定时提交,这样就可以省下精力取吹牛去了

好了,开始吧:
       有两种思路,大概的描述一下如下:
        一:定制一份模板的数据,每个月或者每个星期,让它自己的获取生成相应的数据,并提交.
        二:采用交互的界面,这样就不要打开ie了,每天只要通过命令行就可以搞定.

首先看登陆:

1def login(self):    
2    """
3        登陆
4    """        
5    loginparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,\
6                'UPC_REQUEST_URI':'*.do','UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
7 
8    self.pform = urllib.urlopen(self.url,loginparams)
9


我们需要导入urllib. 传人登陆的参数即可,如上面的loginparams.
调用 

1urllib.urlopen(url[,params])

执行登陆.

其次:解析登陆完毕,从数据库种返回的内容,工号,姓名,部门,单位,地点,等等.
换一种方式也就是说,运用regex在html种解析,得到数据库范户的数据.

导入我们需要的re.

 1def parse(self):    
 2    """
 3        解析登陆完成的HTML页面,获取用户相应的信息
 4    """    
 5    content = '\n'.join(self.pform.readlines())            
 6    items = ["employeeName","department","workArea","workCity","fillInDate"]
 7    for item in items:
 8        pattern = "name=\""+item+"\"\s*(size=\"\d*\")?\s*value=\"(\S*(\s*\S*)?)\""
 9        matcher = re.search(pattern,content)
10            
11        if matcher!=None:        
12            self.item = matcher.groups()[1]


regex这一部分,不明白,可以参考这里http://docs.python.org/lib/module-re.html.

好了,下一步就是提交我们的日报:

 1def post(self):
 2        """
 3            提交日报
 4        """
 5        posturl = 'http://host/*.do'
 6    
 7        f = open(dataFileName)
 8        contents = f.readlines()
 9        
10        #读取data文件,判断是否采用交互界面,还是采用data文件的数据    
11        if contents[0]=='n':                    
12            c = raw_input('是否采用提交当天日志(y/n)?:')
13            if c!='y':
14                self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')
15        
16            projectId = raw_input('项目名称代码:')
17            workId = raw_input('具体事项:')
18            workContent = raw_input('工作内容:')
19            workNum = raw_input('正常工作时长:')
20            overtimeNum = raw_input('加班工作时长:')
21        else:
22            
23            #是否采用文件中的时间,如果不采用,则采用当前时间
24            if contents[1]=='y':                
25                self.fillInDate = contents[2]
26            
27            projectId = contents[3]
28            workId = contents[4]
29            workContent = contents[5]
30            workNum = contents[6]
31            overtimeNum = contents[7]
32        
33        #拼凑参数     o_o
34        postparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,\
35              'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG',\
36                'employeeId':self.username,'employeeName':self.employeeName,\
37                'department':self.department,'workArea':self.workArea,'workCity':self.workCity,'fillInDate':self.fillInDate,\
38                'detailList[0].projectId':projectId,'detailList[0].workId':workId,\
39                'detailList[0].workContent':workContent,'detailList[0].workNum':workNum,'detailList[0].overtimeNum':overtimeNum})    
40                
41        #提交
42        result = urllib.urlopen(posturl,postparams)
43        #todo:解析提过完成页面,获取信息
44        #
45        result.close()
46


当然,现在的data文件格式比较简单,我们可以做的更实用一点,采用key=value的形式,或者其他.
fun.data的样子如下:

y
n
0
JX00001
WK00022
稽查需求分析
0
8

第一行:是否采用当前data文件数据
第二行:是否采用自定义时间,如果不采用,第三行忽略,如果采用,时间即为第三行的值
第四行,第五行,第六行,日报具体的东西,不谈了.
第七行:正常工作时间
第八行:加班时间
完整代码如下:

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

嘿嘿,终于可以休息了,不用在为填写日报而烦了

posted on 2005-09-24 14:32 martin xus 阅读(413) 评论(6)  编辑  收藏 所属分类: python