test
This commit is contained in:
parent
1090aeac36
commit
445ff9489a
@ -2,6 +2,6 @@
|
|||||||
# http://curl.haxx.se/rfc/cookie_spec.html
|
# http://curl.haxx.se/rfc/cookie_spec.html
|
||||||
# This is a generated file! Do not edit.
|
# This is a generated file! Do not edit.
|
||||||
|
|
||||||
222.240.44.2 FALSE / FALSE ASP.NET_SessionId r3esuett3tcxqtmlqedcxleb
|
222.240.44.2 FALSE / FALSE ASP.NET_SessionId gx5ocm3lp1x1scmyb1zs11rb
|
||||||
222.240.44.2 FALSE / FALSE 253402300799 Login PassWord
|
222.240.44.2 FALSE / FALSE 253402300799 Login PassWord
|
||||||
222.240.44.2 FALSE / FALSE 253402300799 SessionID120082 r3esuett3tcxqtmlqedcxleb
|
222.240.44.2 FALSE / FALSE 253402300799 SessionID120082 gx5ocm3lp1x1scmyb1zs11rb
|
||||||
|
|||||||
202
oa.py
202
oa.py
@ -1,14 +1,20 @@
|
|||||||
import requests
|
import requests
|
||||||
|
import sqlite3
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import http.cookiejar
|
import http.cookiejar
|
||||||
import base64
|
import base64
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
from datetime import datetime
|
||||||
import lxml
|
import lxml
|
||||||
|
|
||||||
BASE_URL = "http://222.240.44.2:8899/C6/"
|
BASE_URL = "http://222.240.44.2:8899/C6/"
|
||||||
|
|
||||||
|
INTERVALS = [
|
||||||
|
(datetime.strptime('12:00:00', '%H:%M:%S'), datetime.strptime('13:00:00', '%H:%M:%S')),
|
||||||
|
(datetime.strptime('18:30:00', '%H:%M:%S'), datetime.strptime('19:30:00', '%H:%M:%S'))
|
||||||
|
]
|
||||||
|
|
||||||
class OA:
|
class OA:
|
||||||
def __init__(self, base_url: str, username: str, pwd: str):
|
def __init__(self, base_url: str, username: str, pwd: str):
|
||||||
@ -16,6 +22,8 @@ class OA:
|
|||||||
self.pwd = pwd
|
self.pwd = pwd
|
||||||
self.session = requests.session()
|
self.session = requests.session()
|
||||||
self.base_url = base_url
|
self.base_url = base_url
|
||||||
|
self.work_over = {}
|
||||||
|
self.leave={}
|
||||||
|
|
||||||
def login(self):
|
def login(self):
|
||||||
if os.path.exists("cookies.txt"):
|
if os.path.exists("cookies.txt"):
|
||||||
@ -52,6 +60,7 @@ class OA:
|
|||||||
self.session.cookies.save(ignore_expires=True, ignore_discard=True)
|
self.session.cookies.save(ignore_expires=True, ignore_discard=True)
|
||||||
else:
|
else:
|
||||||
print("Login Failed, error code: {}".format(response.status_code))
|
print("Login Failed, error code: {}".format(response.status_code))
|
||||||
|
print(response.text)
|
||||||
|
|
||||||
def works(self):
|
def works(self):
|
||||||
u = urljoin(self.base_url, "JHSoft.Web.WorkFlat/FlatWorksDone.aspx")
|
u = urljoin(self.base_url, "JHSoft.Web.WorkFlat/FlatWorksDone.aspx")
|
||||||
@ -61,32 +70,199 @@ class OA:
|
|||||||
self.parse(res)
|
self.parse(res)
|
||||||
|
|
||||||
def parse(self, response):
|
def parse(self, response):
|
||||||
|
|
||||||
info_sql = "<root><No djsn='{}'>c2VsZWN0ICogZnJvbSBDdXN0b21Nb2R1bGVfMjAyMTA4MDIwNjAxIHdoZXJlIE1haW5JRD0nSkhDMDAwMzk4MTgn</No><No1>1</No1><No2>-1</No2><No3>MainID;lsh;sqrq;sqr;yggh;bm;zw;qjlx;qjsy;qjksrq;shi1;ksf;qjjsrq;shi2;jsf;gong;tspd</No3></root>"
|
|
||||||
|
|
||||||
soup = BeautifulSoup(response.text, features="lxml")
|
soup = BeautifulSoup(response.text, features="lxml")
|
||||||
datatable = soup.find(id="DGWorksDone_TBody").find_all("tr")
|
datatable = soup.find(id="DGWorksDone_TBody").find_all("tr")
|
||||||
jbtj = filter(lambda x: "JBTJ" in x.text, datatable)
|
jbtj = filter(lambda x: "JBTJ" in x.text, datatable)
|
||||||
qjsq = filter(lambda x: "QJSQ" in x.text, datatable)
|
|
||||||
|
|
||||||
work_overtime = map(lambda x: re.search(re.compile(r"JBTJ\d{8}-\d{4}"), x.text).group(0), jbtj)
|
for jb in jbtj:
|
||||||
leave = map(lambda x: re.search(re.compile(r"QJSQ\d{8}-\d{4}"), x.text).group(0), qjsq)
|
self.__single_work_over_parse(jb)
|
||||||
|
|
||||||
# for jb in jbtj:
|
for leave in filter(lambda x: "QJSQ" in x.text, datatable):
|
||||||
cut_path = re.match(re.compile(r"javascript:ClickTitle\('\.\./(.+)'\)"),jbtj.__next__().contents[1].a['onclick']).group(1)
|
self.__single_leave_parse(leave)
|
||||||
djframe_path = urljoin(self.base_url,cut_path)
|
|
||||||
res = self.session.get(djframe_path,allow_redirects=True)
|
def __single_leave_parse(self,leave_node):
|
||||||
|
info_sql = "<root><No djsn='{}'>c2VsZWN0ICogZnJvbSBDdXN0b21Nb2R1bGVfMjAyMTA4MDIwNjAxIHdoZXJlIE1haW5JRD0nSkhDMDAwMzk4MTgn</No><No1>1</No1><No2>-1</No2><No3>MainID;lsh;sqrq;sqr;yggh;bm;zw;qjlx;qjsy;qjksrq;shi1;ksf;qjjsrq;shi2;jsf;gong;tspd</No3></root>"
|
||||||
|
|
||||||
|
current_id = re.search(re.compile(r"QJSQ\d{8}-\d{4}"), leave_node.text).group(0)
|
||||||
|
cut_path = re.match(re.compile(r"javascript:ClickTitle\('\.\./(.+)'\)"),leave_node.contents[1].a['onclick']).group(1)
|
||||||
|
djframe_path = urljoin(self.base_url,"JHSoft.Web.CustomQuery/GeneralXmlhttpPage.aspx")
|
||||||
|
|
||||||
|
r = self.session.get(djframe_path,params={
|
||||||
|
"type" : "base64DecodeByService",
|
||||||
|
"params": cut_path[45:-2]
|
||||||
|
})
|
||||||
|
|
||||||
|
if r.ok:
|
||||||
|
djsn_id = re.match(re.compile(r"djsn=(.+)&djtype"), r.text).group(1)
|
||||||
|
res = self.session.post(urljoin(self.base_url,"JHSoft.Web.Module/eformaspx/WebBill.aspx?dataset_fields1"),data=info_sql.format(djsn_id))
|
||||||
if res.ok:
|
if res.ok:
|
||||||
|
qj_datas = re.findall(re.compile(r"<!\[CDATA(.+?)\]>"),res.text)
|
||||||
|
|
||||||
|
if qj_datas[7] == "[调休]":
|
||||||
|
return
|
||||||
|
|
||||||
|
start_date = qj_datas[9][1:-1]
|
||||||
|
start_hour = qj_datas[10][1:-1]
|
||||||
|
start_min = qj_datas[11][1:-1]
|
||||||
|
end_date = qj_datas[12][1:-1]
|
||||||
|
end_hour = qj_datas[13][1:-1]
|
||||||
|
end_min = qj_datas[14][1:-1]
|
||||||
|
|
||||||
|
starttime = datetime.strptime(("{} {}:{}").format(start_date, start_hour, start_min), "%Y-%m-%d %H:%M")
|
||||||
|
endtime = datetime.strptime(("{} {}:{}").format(end_date, end_hour, end_min), "%Y-%m-%d %H:%M")
|
||||||
|
|
||||||
|
self.leave[current_id] = {
|
||||||
|
"starttime":starttime,
|
||||||
|
"endtime":endtime,
|
||||||
|
"spend": self.__total_time_excluding_intervals(starttime, endtime, INTERVALS)
|
||||||
|
}
|
||||||
|
|
||||||
|
rely = self.session.get(urljoin(self.base_url,"JHSoft.Web.Module/ToolBar/toolbarwf.aspx?{}".format(cut_path[45:]))
|
||||||
|
,allow_redirects=True
|
||||||
|
,headers={
|
||||||
|
"Referer": urljoin(self.base_url,"JHSoft.Web.Module/fceform/common/djframe.htm?{}".format(cut_path[45:])),
|
||||||
|
"Upgrade-Insecure-Requests" : "1"
|
||||||
|
})
|
||||||
|
if rely.ok:
|
||||||
|
rely_soup = BeautifulSoup(rely.text,features="lxml")
|
||||||
|
rely_app_id = rely_soup.find(id="hidRelevanceApproveID")['value']
|
||||||
|
|
||||||
|
if rely_app_id == "" or rely_app_id is None:
|
||||||
|
raise Exception("rely error")
|
||||||
|
|
||||||
|
relyinfo = self.session.get(urljoin(self.base_url,"JHSoft.Web.WorkFlow/WorkFlow/MyWorkFlowWatchRelevanceAjax.aspx"),params={
|
||||||
|
"delFlag" : 0,
|
||||||
|
"strAppID" : rely_app_id
|
||||||
|
})
|
||||||
|
|
||||||
|
if relyinfo.ok:
|
||||||
|
relyinfo_soup = BeautifulSoup(relyinfo.text,features="lxml")
|
||||||
|
trs = relyinfo_soup.find_all(id="ReleAppID{}".format(rely_app_id))
|
||||||
|
|
||||||
|
used_jb = []
|
||||||
|
|
||||||
|
for tr in trs:
|
||||||
|
rely_work_over_id = re.search(re.compile(r"JBTJ\d{8}-\d{4}"), tr.contents[0].text).group(0)
|
||||||
|
used_jb.append(rely_work_over_id)
|
||||||
|
|
||||||
|
self.leave[current_id]["used_work"] = used_jb
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise Exception("rely error")
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise Exception("rely error")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def __single_work_over_parse(self,work_node):
|
||||||
|
info_sql = "<root><No djsn='{}'>c2VsZWN0ICogZnJvbSBDdXN0b21Nb2R1bGVfMjAyMTA4MDIwNzAyIGEgaW5uZXIgam9pbiBDdXN0b21Nb2R1bGVfU3ViRGV0YWlsXzIwMjEwODAyMDcwMiBiIG9uIChhLk1haW5JRD1iLk1haW5JRCkgIHdoZXJlIGEuTWFpbklEPSdKSEMwMDAzOTI5NSc=</No><No1>1</No1><No2>-1</No2><No3>MainID;lb;kssj;kssj_shi;kssj_fen;jssj;jssj_shi;jssj_fen;bz</No3></root>"
|
||||||
|
cut_path = re.match(re.compile(r"javascript:ClickTitle\('\.\./(.+)'\)"),work_node.contents[1].a['onclick']).group(1)
|
||||||
|
djframe_path = urljoin(self.base_url,"JHSoft.Web.CustomQuery/GeneralXmlhttpPage.aspx")
|
||||||
|
|
||||||
|
current_id = re.search(re.compile(r"JBTJ\d{8}-\d{4}"), work_node.text).group(0)
|
||||||
|
print(current_id)
|
||||||
|
|
||||||
|
res = self.session.get(djframe_path,params={
|
||||||
|
"type" : "base64DecodeByService",
|
||||||
|
"params": cut_path[45:-2]
|
||||||
|
})
|
||||||
|
|
||||||
|
if res.ok:
|
||||||
|
djsn_id = re.match(re.compile(r"djsn=(.+)&djtype"), res.text).group(1)
|
||||||
|
res = self.session.post(urljoin(self.base_url,"JHSoft.Web.Module/eformaspx/WebBill.aspx?dataset_fields1"),data=info_sql.format(djsn_id))
|
||||||
|
|
||||||
|
if res.ok:
|
||||||
|
qj_datas = re.findall(re.compile(r"<!\[CDATA(.+?)\]>"),res.text)
|
||||||
|
|
||||||
|
rs = []
|
||||||
|
|
||||||
|
for q in range(0, len(qj_datas), 9):
|
||||||
|
start_date = qj_datas[q + 2]
|
||||||
|
start_hour = qj_datas[q + 3]
|
||||||
|
start_min = qj_datas[q + 4]
|
||||||
|
|
||||||
|
end_date = qj_datas[q + 5]
|
||||||
|
end_hour = qj_datas[q + 6]
|
||||||
|
end_min = qj_datas[q + 7]
|
||||||
|
|
||||||
|
starttime = datetime.strptime(("{} {}:{}").format(start_date[1:-1], start_hour[1:-1], start_min[1:-1]), "%Y-%m-%d %H:%M")
|
||||||
|
endtime = datetime.strptime(("{} {}:{}").format(end_date[1:-1], end_hour[1:-1], end_min[1:-1]), "%Y-%m-%d %H:%M")
|
||||||
|
|
||||||
|
spend = self.__total_time_excluding_intervals(starttime, endtime, INTERVALS)
|
||||||
|
|
||||||
|
rs.append({
|
||||||
|
"start": starttime,
|
||||||
|
"end": endtime,
|
||||||
|
"spend": spend
|
||||||
|
})
|
||||||
|
|
||||||
|
self.work_over[current_id] = rs
|
||||||
|
|
||||||
|
else:
|
||||||
print(res.text)
|
print(res.text)
|
||||||
|
raise Exception("djframe error")
|
||||||
|
|
||||||
|
|
||||||
|
def __intersection_time(self,start1, end1, start2, end2):
|
||||||
|
# 返回两个时间段的交集
|
||||||
|
return max(start1, start2), min(end1, end2)
|
||||||
|
|
||||||
|
def __total_time_excluding_intervals(self,start, end, intervals):
|
||||||
|
total_duration = end - start
|
||||||
|
for interval in intervals:
|
||||||
|
t1 = interval[0].replace(year=start.year, month=start.month, day=start.day)
|
||||||
|
t2 = interval[1].replace(year=start.year, month=start.month, day=start.day)
|
||||||
|
inter_start, inter_end = self.__intersection_time(start, end, t1,t2)
|
||||||
|
if inter_start < inter_end: # 有交集
|
||||||
|
total_duration -= (inter_end - inter_start)
|
||||||
|
return total_duration
|
||||||
|
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.session.close()
|
self.session.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
test = OA(BASE_URL, "120082", "7948799")
|
test = OA(BASE_URL, "120082", "7948799")
|
||||||
|
|
||||||
test.login()
|
test.login()
|
||||||
|
|
||||||
test.works()
|
test.works()
|
||||||
|
|
||||||
test.close()
|
test.close()
|
||||||
|
|
||||||
|
leaves = test.leave
|
||||||
|
works = test.work_over
|
||||||
|
|
||||||
|
result_works = {}
|
||||||
|
|
||||||
|
for i,work in works.items():
|
||||||
|
spend_time = sum(work["spend"],datetime.timedelta(0))
|
||||||
|
result_works[i] = {
|
||||||
|
"spend" : spend_time,
|
||||||
|
"used_leave" : [],
|
||||||
|
"remaining" : spend_time
|
||||||
|
}
|
||||||
|
|
||||||
|
for i,leave in leaves.items():
|
||||||
|
used = leave['used_work']
|
||||||
|
spend = leave['spend']
|
||||||
|
|
||||||
|
for u in used:
|
||||||
|
if spend > result_works[u]['remaining']:
|
||||||
|
result_works[u]['used_leave'].append({
|
||||||
|
"id" : i,
|
||||||
|
"spend" : work[u]['remaining']
|
||||||
|
})
|
||||||
|
result_works[u]["remaining"] = datetime.timedelta(0)
|
||||||
|
spend -= result_works[u]['remaining']
|
||||||
|
|
||||||
|
else:
|
||||||
|
result_works[u]['used_leave'].append({
|
||||||
|
"id" : i,
|
||||||
|
"spend" : spend
|
||||||
|
})
|
||||||
|
result_works[u]["remaining"] -= spend
|
||||||
|
|
||||||
|
|
||||||
|
print(result_works)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user