問題:
公司的日報,每天填寫的時候總是那么巨慢,都有點恐懼它了!
解決方案:
讓代碼幫我們每天定時提交,這樣就可以省下精力取吹牛去了
好了,開始吧:
有兩種思路,大概的描述一下如下:
一:定制一份模板的數據,每個月或者每個星期,讓它自己的獲取生成相應的數據,并提交.
二:采用交互的界面,這樣就不要打開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
嘿嘿,終于可以休息了,不用在為填寫日報而煩了