ezKit 1.4.2__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/qywx.py +156 -0
- {ezKit-1.4.2.dist-info → ezKit-1.4.3.dist-info}/METADATA +1 -1
- {ezKit-1.4.2.dist-info → ezKit-1.4.3.dist-info}/RECORD +6 -6
- ezKit/weixin.py +0 -148
- {ezKit-1.4.2.dist-info → ezKit-1.4.3.dist-info}/LICENSE +0 -0
- {ezKit-1.4.2.dist-info → ezKit-1.4.3.dist-info}/WHEEL +0 -0
- {ezKit-1.4.2.dist-info → ezKit-1.4.3.dist-info}/top_level.txt +0 -0
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
|
@@ -7,15 +7,15 @@ ezKit/files.py,sha256=GoNdai3Ul0lg4wTkJAQm5kys1Sv3NCTNLIZlzHQKuZQ,12714
|
|
7
7
|
ezKit/http.py,sha256=LTeyPVBm8deL_m-YRVW2O5w83-k3b1I1hU4cqkxS_B0,1845
|
8
8
|
ezKit/mongo.py,sha256=VtiNgl_WAA7AtHLNBDlzbIrfOcO8zj8WqU9KKTNHNmU,1914
|
9
9
|
ezKit/plots.py,sha256=QUtoVfZ49ZSNcY8gcQ2TYVkMjDDzoW-myMtqTi5WN2U,5322
|
10
|
+
ezKit/qywx.py,sha256=CJHlJbdesJxx2qk73Wq3P7c9a0LcrT_mOdQfAkObOws,6009
|
10
11
|
ezKit/redis.py,sha256=pY4SPlcgQ7S8IeY2xoDpxy-xCZxzZQrQJNAoWRsC1dI,1773
|
11
12
|
ezKit/reports.py,sha256=dBBggggCCLuk5YD6SjdUPuxTr3wiJojP3lA7dQfg6Pk,8898
|
12
13
|
ezKit/sendemail.py,sha256=PItznLBcZ6Om8NU7rep69m3QNZ9YkmOovup7pPGyY58,4840
|
13
14
|
ezKit/utils.py,sha256=HzScpKwVQ7VaZMvLiBbYaJkU8cNC8oQii65BGfQIZnI,46079
|
14
|
-
ezKit/weixin.py,sha256=Sxm_yNEvcztFNCZyjZetVwqxoGoL2PJHlQABIWkd1pk,5075
|
15
15
|
ezKit/xftp.py,sha256=qbCqFcGe22TDBSisj0Zoz78tnydDWoOfvywWpXdfaGw,6982
|
16
16
|
ezKit/zabbix.py,sha256=EF0-tQ1FTMBqawXKf3JEoPYoAJmYENXXIm9T5ICSdHM,32345
|
17
|
-
ezKit-1.4.
|
18
|
-
ezKit-1.4.
|
19
|
-
ezKit-1.4.
|
20
|
-
ezKit-1.4.
|
21
|
-
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
|