ezKit 1.4.1__py3-none-any.whl → 1.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ezKit/bottle_extensions.py +36 -0
- ezKit/http.py +2 -32
- ezKit/qywx.py +156 -0
- {ezKit-1.4.1.dist-info → ezKit-1.4.3.dist-info}/METADATA +1 -1
- {ezKit-1.4.1.dist-info → ezKit-1.4.3.dist-info}/RECORD +8 -7
- ezKit/weixin.py +0 -148
- {ezKit-1.4.1.dist-info → ezKit-1.4.3.dist-info}/LICENSE +0 -0
- {ezKit-1.4.1.dist-info → ezKit-1.4.3.dist-info}/WHEEL +0 -0
- {ezKit-1.4.1.dist-info → ezKit-1.4.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
from typing import Callable
|
2
|
+
|
3
|
+
from . import bottle, utils
|
4
|
+
|
5
|
+
|
6
|
+
def enable_cors(fn: Callable) -> Callable:
|
7
|
+
"""
|
8
|
+
Bottle CORS
|
9
|
+
"""
|
10
|
+
"""
|
11
|
+
参考文档:
|
12
|
+
- https://stackoverflow.com/a/17262900
|
13
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
|
14
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods
|
15
|
+
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
|
16
|
+
"""
|
17
|
+
def cors(*args, **kwargs):
|
18
|
+
bottle.response.headers['Access-Control-Allow-Headers'] = '*'
|
19
|
+
bottle.response.headers['Access-Control-Allow-Methods'] = '*'
|
20
|
+
bottle.response.headers['Access-Control-Allow-Origin'] = '*'
|
21
|
+
if bottle.request.method != 'OPTIONS':
|
22
|
+
return fn(*args, **kwargs)
|
23
|
+
return cors
|
24
|
+
|
25
|
+
def request_json() -> dict | None:
|
26
|
+
"""
|
27
|
+
Bottle Request JSON
|
28
|
+
"""
|
29
|
+
try:
|
30
|
+
data: dict = bottle.request.json
|
31
|
+
if utils.v_true(data, dict):
|
32
|
+
return data
|
33
|
+
else:
|
34
|
+
return None
|
35
|
+
except:
|
36
|
+
return None
|
ezKit/http.py
CHANGED
@@ -1,40 +1,10 @@
|
|
1
1
|
import json
|
2
|
-
from typing import Callable
|
3
2
|
|
4
3
|
import requests
|
5
4
|
from loguru import logger
|
6
5
|
|
7
|
-
from . import
|
8
|
-
|
9
|
-
|
10
|
-
def bottle_cors(fn: Callable):
|
11
|
-
"""
|
12
|
-
Bottle CORS
|
13
|
-
"""
|
14
|
-
"""
|
15
|
-
参考文档:
|
16
|
-
- https://stackoverflow.com/a/17262900
|
17
|
-
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers
|
18
|
-
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods
|
19
|
-
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
|
20
|
-
"""
|
21
|
-
def cors(*args, **kwargs):
|
22
|
-
bottle.response.headers['Access-Control-Allow-Headers'] = '*'
|
23
|
-
bottle.response.headers['Access-Control-Allow-Methods'] = '*'
|
24
|
-
bottle.response.headers['Access-Control-Allow-Origin'] = '*'
|
25
|
-
if bottle.request.method != 'OPTIONS':
|
26
|
-
return fn(*args, **kwargs)
|
27
|
-
return cors
|
28
|
-
|
29
|
-
def bottle_request_json() -> dict | None:
|
30
|
-
try:
|
31
|
-
data: dict = bottle.request.json
|
32
|
-
if utils.v_true(data, dict):
|
33
|
-
return data
|
34
|
-
else:
|
35
|
-
return None
|
36
|
-
except:
|
37
|
-
return None
|
6
|
+
from . import utils
|
7
|
+
|
38
8
|
|
39
9
|
def download(
|
40
10
|
request: dict,
|
ezKit/qywx.py
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
import json
|
2
|
+
import time
|
3
|
+
|
4
|
+
import requests
|
5
|
+
|
6
|
+
|
7
|
+
class QYWX(object):
|
8
|
+
"""企业微信"""
|
9
|
+
|
10
|
+
"""
|
11
|
+
企业微信开发者中心
|
12
|
+
|
13
|
+
https://developer.work.weixin.qq.com/
|
14
|
+
https://developer.work.weixin.qq.com/document/path/90313 (全局错误码)
|
15
|
+
|
16
|
+
参考文档:
|
17
|
+
|
18
|
+
https://www.gaoyuanqi.cn/python-yingyong-qiyewx/
|
19
|
+
https://www.jianshu.com/p/020709b130d3
|
20
|
+
"""
|
21
|
+
|
22
|
+
url_prefix = 'https://qyapi.weixin.qq.com'
|
23
|
+
work_id: str | None = None
|
24
|
+
agent_id: str | None = None
|
25
|
+
agent_secret: str | None = None
|
26
|
+
access_token: str | None = None
|
27
|
+
|
28
|
+
def __init__(self, work_id: str | None, agent_id: str | None, agent_secret: str | None):
|
29
|
+
''' Initiation '''
|
30
|
+
self.work_id = work_id
|
31
|
+
self.agent_id = agent_id
|
32
|
+
self.agent_secret = agent_secret
|
33
|
+
|
34
|
+
''' 获取 Token '''
|
35
|
+
self.getaccess_token()
|
36
|
+
|
37
|
+
def getaccess_token(self) -> bool:
|
38
|
+
try:
|
39
|
+
_response = requests.get(f'{self.url_prefix}/cgi-bin/gettoken?corpid={self.work_id}&corpsecret={self.agent_secret}')
|
40
|
+
if _response.status_code == 200:
|
41
|
+
_result: dict = _response.json()
|
42
|
+
self.access_token = _result.get('access_token')
|
43
|
+
else:
|
44
|
+
self.access_token = None
|
45
|
+
return True
|
46
|
+
except:
|
47
|
+
return False
|
48
|
+
|
49
|
+
def get_agent_list(self) -> dict | None:
|
50
|
+
try:
|
51
|
+
self.getaccess_token() if self.access_token == None else next
|
52
|
+
_response = requests.get(f'{self.url_prefix}/cgi-bin/agent/list?access_token={self.access_token}')
|
53
|
+
if _response.status_code == 200:
|
54
|
+
_response_data: dict = _response.json()
|
55
|
+
if _response_data.get('errcode') == 42001:
|
56
|
+
self.getaccess_token()
|
57
|
+
time.sleep(1)
|
58
|
+
self.get_agent_list()
|
59
|
+
return _response_data
|
60
|
+
return {'response': _response.text}
|
61
|
+
except:
|
62
|
+
return None
|
63
|
+
|
64
|
+
def get_department_list(self, id) -> dict | None:
|
65
|
+
try:
|
66
|
+
self.getaccess_token() if self.access_token == None else next
|
67
|
+
_response = requests.get(f'{self.url_prefix}/cgi-bin/department/list?access_token={self.access_token}&id={id}')
|
68
|
+
if _response.status_code == 200:
|
69
|
+
_response_data: dict = _response.json()
|
70
|
+
if _response_data.get('errcode') == 42001:
|
71
|
+
self.getaccess_token()
|
72
|
+
time.sleep(1)
|
73
|
+
self.get_department_list(id)
|
74
|
+
return _response_data
|
75
|
+
return {'response': _response.text}
|
76
|
+
except:
|
77
|
+
return None
|
78
|
+
|
79
|
+
def get_user_list(self, id) -> dict | None:
|
80
|
+
try:
|
81
|
+
self.getaccess_token() if self.access_token == None else next
|
82
|
+
_response = requests.get(f'{self.url_prefix}/cgi-bin/user/list?access_token={self.access_token}&department_id={id}')
|
83
|
+
if _response.status_code == 200:
|
84
|
+
_response_data: dict = _response.json()
|
85
|
+
if _response_data.get('errcode') == 42001:
|
86
|
+
self.getaccess_token()
|
87
|
+
time.sleep(1)
|
88
|
+
self.get_user_list(id)
|
89
|
+
return _response_data
|
90
|
+
return {'response': _response.text}
|
91
|
+
except:
|
92
|
+
return None
|
93
|
+
|
94
|
+
def get_user_id_by_mobile(self, mobile) -> dict | None:
|
95
|
+
try:
|
96
|
+
self.getaccess_token() if self.access_token == None else next
|
97
|
+
_json_dict = {'mobile': mobile}
|
98
|
+
_json_string = json.dumps(_json_dict)
|
99
|
+
_response = requests.post(f'{self.url_prefix}/cgi-bin/user/getuserid?access_token={self.access_token}', data=_json_string)
|
100
|
+
if _response.status_code == 200:
|
101
|
+
_response_data: dict = _response.json()
|
102
|
+
if _response_data.get('errcode') == 42001:
|
103
|
+
self.getaccess_token()
|
104
|
+
time.sleep(1)
|
105
|
+
self.get_user_id_by_mobile(id)
|
106
|
+
return _response_data
|
107
|
+
return {'response': _response.text}
|
108
|
+
except:
|
109
|
+
return None
|
110
|
+
|
111
|
+
def get_user_info(self, id) -> dict | None:
|
112
|
+
try:
|
113
|
+
self.getaccess_token() if self.access_token == None else next
|
114
|
+
_response = requests.get(f'{self.url_prefix}/cgi-bin/user/get?access_token={self.access_token}&userid={id}')
|
115
|
+
if _response.status_code == 200:
|
116
|
+
_response_data: dict = _response.json()
|
117
|
+
if _response_data.get('errcode') == 42001:
|
118
|
+
self.getaccess_token()
|
119
|
+
time.sleep(1)
|
120
|
+
self.get_user_info(id)
|
121
|
+
return _response_data
|
122
|
+
return {'response': _response.text}
|
123
|
+
except:
|
124
|
+
return None
|
125
|
+
|
126
|
+
def send_text(self, users, message) -> dict | None:
|
127
|
+
"""发送消息"""
|
128
|
+
"""
|
129
|
+
参考文档:
|
130
|
+
|
131
|
+
https://developer.work.weixin.qq.com/document/path/90235
|
132
|
+
"""
|
133
|
+
try:
|
134
|
+
self.getaccess_token() if self.access_token == None else next
|
135
|
+
_json_dict = {
|
136
|
+
'touser': users,
|
137
|
+
'msgtype': 'text',
|
138
|
+
'agentid': self.agent_id,
|
139
|
+
'text': {'content': message},
|
140
|
+
'safe': 0,
|
141
|
+
'enable_id_trans': 0,
|
142
|
+
'enable_duplicate_check': 0,
|
143
|
+
'duplicate_check_interval': 1800
|
144
|
+
}
|
145
|
+
_json_string = json.dumps(_json_dict)
|
146
|
+
_response = requests.post(f'{self.url_prefix}/cgi-bin/message/send?access_token={self.access_token}', data=_json_string)
|
147
|
+
if _response.status_code == 200:
|
148
|
+
_response_data = _response.json()
|
149
|
+
if _response_data.get('errcode') == 42001:
|
150
|
+
self.getaccess_token()
|
151
|
+
time.sleep(1)
|
152
|
+
self.send_text(users, message)
|
153
|
+
return _response_data
|
154
|
+
return {'response': _response.text}
|
155
|
+
except:
|
156
|
+
return None
|
@@ -1,20 +1,21 @@
|
|
1
1
|
ezKit/__init__.py,sha256=v6kh1vyXewSi_0PE0CMXrGz0aME4tISx_7BPXIKtZ9E,70
|
2
2
|
ezKit/bottle.py,sha256=iJVdWAfpOi2ksPZlyZtALczPj9aqqcNXrSXSClUCJwc,151993
|
3
|
+
ezKit/bottle_extensions.py,sha256=OQUwHNg4cbZ0UZXwT6FJjwl4uAg00_Q-Zpogt_xHElk,1088
|
3
4
|
ezKit/cipher.py,sha256=fDyc-ST8s9a9o07MUj_TeoXNHZhOOnL53LKHU3e49as,2820
|
4
5
|
ezKit/database.py,sha256=imOeBSU6kCIrVHei485HEROnmsr5UZtCcqwHk0vDzwY,6741
|
5
6
|
ezKit/files.py,sha256=GoNdai3Ul0lg4wTkJAQm5kys1Sv3NCTNLIZlzHQKuZQ,12714
|
6
|
-
ezKit/http.py,sha256=
|
7
|
+
ezKit/http.py,sha256=LTeyPVBm8deL_m-YRVW2O5w83-k3b1I1hU4cqkxS_B0,1845
|
7
8
|
ezKit/mongo.py,sha256=VtiNgl_WAA7AtHLNBDlzbIrfOcO8zj8WqU9KKTNHNmU,1914
|
8
9
|
ezKit/plots.py,sha256=QUtoVfZ49ZSNcY8gcQ2TYVkMjDDzoW-myMtqTi5WN2U,5322
|
10
|
+
ezKit/qywx.py,sha256=CJHlJbdesJxx2qk73Wq3P7c9a0LcrT_mOdQfAkObOws,6009
|
9
11
|
ezKit/redis.py,sha256=pY4SPlcgQ7S8IeY2xoDpxy-xCZxzZQrQJNAoWRsC1dI,1773
|
10
12
|
ezKit/reports.py,sha256=dBBggggCCLuk5YD6SjdUPuxTr3wiJojP3lA7dQfg6Pk,8898
|
11
13
|
ezKit/sendemail.py,sha256=PItznLBcZ6Om8NU7rep69m3QNZ9YkmOovup7pPGyY58,4840
|
12
14
|
ezKit/utils.py,sha256=HzScpKwVQ7VaZMvLiBbYaJkU8cNC8oQii65BGfQIZnI,46079
|
13
|
-
ezKit/weixin.py,sha256=Sxm_yNEvcztFNCZyjZetVwqxoGoL2PJHlQABIWkd1pk,5075
|
14
15
|
ezKit/xftp.py,sha256=qbCqFcGe22TDBSisj0Zoz78tnydDWoOfvywWpXdfaGw,6982
|
15
16
|
ezKit/zabbix.py,sha256=EF0-tQ1FTMBqawXKf3JEoPYoAJmYENXXIm9T5ICSdHM,32345
|
16
|
-
ezKit-1.4.
|
17
|
-
ezKit-1.4.
|
18
|
-
ezKit-1.4.
|
19
|
-
ezKit-1.4.
|
20
|
-
ezKit-1.4.
|
17
|
+
ezKit-1.4.3.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
18
|
+
ezKit-1.4.3.dist-info/METADATA,sha256=4trojSZ2NQV6UcRxnamJcpNSVqqnwJFZRF360rY7BKM,226
|
19
|
+
ezKit-1.4.3.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
20
|
+
ezKit-1.4.3.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
|
21
|
+
ezKit-1.4.3.dist-info/RECORD,,
|
ezKit/weixin.py
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
import time
|
3
|
-
|
4
|
-
import requests
|
5
|
-
|
6
|
-
|
7
|
-
class WeiXin(object):
|
8
|
-
|
9
|
-
'''
|
10
|
-
企业微信开发者中心
|
11
|
-
|
12
|
-
https://developer.work.weixin.qq.com/
|
13
|
-
https://developer.work.weixin.qq.com/document/path/90313 (全局错误码)
|
14
|
-
|
15
|
-
参考文档:
|
16
|
-
|
17
|
-
https://www.gaoyuanqi.cn/python-yingyong-qiyewx/
|
18
|
-
https://www.jianshu.com/p/020709b130d3
|
19
|
-
'''
|
20
|
-
|
21
|
-
_work_id, _agent_id, _agent_secret, _access_token = None, None, None, None
|
22
|
-
|
23
|
-
def __init__(self, work_id, agent_id, agent_secret):
|
24
|
-
''' Initiation '''
|
25
|
-
self._work_id = work_id
|
26
|
-
self._agent_id = agent_id
|
27
|
-
self._agent_secret = agent_secret
|
28
|
-
|
29
|
-
''' 获取 Token '''
|
30
|
-
self.get_access_token()
|
31
|
-
|
32
|
-
def get_access_token(self):
|
33
|
-
_response = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self._work_id}&corpsecret={self._agent_secret}')
|
34
|
-
if _response.status_code == 200:
|
35
|
-
_result = _response.json()
|
36
|
-
self._access_token = _result.get('access_token')
|
37
|
-
else:
|
38
|
-
self._access_token = None
|
39
|
-
|
40
|
-
def get_agent_list(self):
|
41
|
-
|
42
|
-
self.get_access_token() if self._access_token == None else next
|
43
|
-
|
44
|
-
_response = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/agent/list?access_token={self._access_token}')
|
45
|
-
|
46
|
-
if _response.status_code == 200:
|
47
|
-
_response_data = _response.json()
|
48
|
-
if _response_data.get('errcode') == 42001:
|
49
|
-
self.get_access_token()
|
50
|
-
time.sleep(1)
|
51
|
-
self.get_agent_list()
|
52
|
-
return _response_data
|
53
|
-
return {'response': _response.text}
|
54
|
-
|
55
|
-
def get_department_list(self, id):
|
56
|
-
|
57
|
-
self.get_access_token() if self._access_token == None else next
|
58
|
-
|
59
|
-
_response = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token={self._access_token}&id={id}')
|
60
|
-
|
61
|
-
if _response.status_code == 200:
|
62
|
-
_response_data = _response.json()
|
63
|
-
if _response_data.get('errcode') == 42001:
|
64
|
-
self.get_access_token()
|
65
|
-
time.sleep(1)
|
66
|
-
self.get_department_list(id)
|
67
|
-
return _response_data
|
68
|
-
return {'response': _response.text}
|
69
|
-
|
70
|
-
def get_user_list(self, id):
|
71
|
-
|
72
|
-
self.get_access_token() if self._access_token == None else next
|
73
|
-
|
74
|
-
_response = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token={self._access_token}&department_id={id}')
|
75
|
-
|
76
|
-
if _response.status_code == 200:
|
77
|
-
_response_data = _response.json()
|
78
|
-
if _response_data.get('errcode') == 42001:
|
79
|
-
self.get_access_token()
|
80
|
-
time.sleep(1)
|
81
|
-
self.get_user_list(id)
|
82
|
-
return _response_data
|
83
|
-
return {'response': _response.text}
|
84
|
-
|
85
|
-
def get_user_id_by_mobile(self, mobile):
|
86
|
-
|
87
|
-
self.get_access_token() if self._access_token == None else next
|
88
|
-
|
89
|
-
_json_dict = {'mobile': mobile}
|
90
|
-
|
91
|
-
_json_string = json.dumps(_json_dict)
|
92
|
-
|
93
|
-
_response = requests.post(f'https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token={self._access_token}', data=_json_string)
|
94
|
-
|
95
|
-
if _response.status_code == 200:
|
96
|
-
_response_data = _response.json()
|
97
|
-
if _response_data.get('errcode') == 42001:
|
98
|
-
self.get_access_token()
|
99
|
-
time.sleep(1)
|
100
|
-
self.get_user_id_by_mobile(id)
|
101
|
-
return _response_data
|
102
|
-
return {'response': _response.text}
|
103
|
-
|
104
|
-
def get_user_info(self, id):
|
105
|
-
|
106
|
-
self.get_access_token() if self._access_token == None else next
|
107
|
-
|
108
|
-
_response = requests.get(f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={self._access_token}&userid={id}')
|
109
|
-
|
110
|
-
if _response.status_code == 200:
|
111
|
-
_response_data = _response.json()
|
112
|
-
if _response_data.get('errcode') == 42001:
|
113
|
-
self.get_access_token()
|
114
|
-
time.sleep(1)
|
115
|
-
self.get_user_info(id)
|
116
|
-
return _response_data
|
117
|
-
return {'response': _response.text}
|
118
|
-
|
119
|
-
def send_text(self, users, message):
|
120
|
-
'''
|
121
|
-
https://developer.work.weixin.qq.com/document/path/90235
|
122
|
-
'''
|
123
|
-
|
124
|
-
self.get_access_token() if self._access_token == None else next
|
125
|
-
|
126
|
-
_json_dict = {
|
127
|
-
'touser': users,
|
128
|
-
'msgtype': 'text',
|
129
|
-
'agentid': self._agent_id,
|
130
|
-
'text': {'content': message},
|
131
|
-
'safe': 0,
|
132
|
-
'enable_id_trans': 0,
|
133
|
-
'enable_duplicate_check': 0,
|
134
|
-
'duplicate_check_interval': 1800
|
135
|
-
}
|
136
|
-
|
137
|
-
_json_string = json.dumps(_json_dict)
|
138
|
-
|
139
|
-
_response = requests.post(f'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self._access_token}', data=_json_string)
|
140
|
-
|
141
|
-
if _response.status_code == 200:
|
142
|
-
_response_data = _response.json()
|
143
|
-
if _response_data.get('errcode') == 42001:
|
144
|
-
self.get_access_token()
|
145
|
-
time.sleep(1)
|
146
|
-
self.send_text(users, message)
|
147
|
-
return _response_data
|
148
|
-
return {'response': _response.text}
|
File without changes
|
File without changes
|
File without changes
|