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.
@@ -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 bottle, utils
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ezKit
3
- Version: 1.4.1
3
+ Version: 1.4.3
4
4
  Summary: Easy Kit
5
5
  Author: septvean
6
6
  Author-email: septvean@gmail.com
@@ -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=CFS7zB2RuM8MksGpq_2C08k-B3eGApBVmyrO4oWzUYA,2866
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.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
17
- ezKit-1.4.1.dist-info/METADATA,sha256=6uxmTqGXb-KBo373Ci1DSJ_Hc0WHYA64RDePr-ma2eI,226
18
- ezKit-1.4.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
19
- ezKit-1.4.1.dist-info/top_level.txt,sha256=aYLB_1WODsqNTsTFWcKP-BN0KCTKcV-HZJ4zlHkCFw8,6
20
- ezKit-1.4.1.dist-info/RECORD,,
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