问题:
公司的日报,每天填写的时候总是那么巨慢,都有点恐惧它了!
解决方案:
让代码帮我们每天定时提交,这样就可以省下精力取吹牛去了
好了,开始吧:
有两种思路,大概的描述一下如下:
一:定制一份模板的数据,每个月或者每个星期,让它自己的获取生成相应的数据,并提交.
二:采用交互的界面,这样就不要打开ie了,每天只要通过命令行就可以搞定.
首先看登陆:
1
def 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.
调用
1
urllib.urlopen(url[,params])
执行登陆.
其次:解析登陆完毕,从数据库种返回的内容,工号,姓名,部门,单位,地点,等等.
换一种方式也就是说,运用regex在html种解析,得到数据库范户的数据.
导入我们需要的re.
1
def 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
.
好了,下一步就是提交我们的日报:
1
def 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
4
import urllib
5
import os
6
import re
7
8
class 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
102
if __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
嘿嘿,终于可以休息了,不用在为填写日报而烦了