问题:
公司的日报,每天填写的时候总是那么巨慢,都有点恐惧它了!
解决方案:
让代码帮我们每天定时提交,这样就可以省下精力取吹牛去了
好了,开始吧:
有两种思路,大概的描述一下如下:
一:定制一份模板的数据,每个月或者每个星期,让它自己的获取生成相应的数据,并提交.
二:采用交互的界面,这样就不要打开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
嘿嘿,终于可以休息了,不用在为填写日报而烦了