wechatpy.enterprise.client.api.external_contact   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 388
Duplicated Lines 0 %

Test Coverage

Coverage 96.43%

Importance

Changes 0
Metric Value
eloc 103
dl 0
loc 388
rs 10
c 0
b 0
f 0
ccs 54
cts 56
cp 0.9643
wmc 18

18 Methods

Rating   Name   Duplication   Size   Complexity  
A WeChatExternalContact.edit_corp_tag() 0 16 1
A WeChatExternalContact.mark_tag() 0 20 1
A WeChatExternalContact.add_contact_way() 0 28 1
A WeChatExternalContact.list() 0 8 1
A WeChatExternalContact.get_follow_user_list() 0 7 1
A WeChatExternalContact.get_corp_tag_list() 0 12 1
A WeChatExternalContact.update_contact_way() 0 26 1
A WeChatExternalContact.send_welcome_msg() 0 49 1
A WeChatExternalContact.del_contact_way() 0 10 1
A WeChatExternalContact.get_group_msg_result() 0 13 1
A WeChatExternalContact.add_corp_tag() 0 23 1
A WeChatExternalContact.transfer() 0 18 1
A WeChatExternalContact.get() 0 9 1
A WeChatExternalContact.get_unassigned_list() 0 15 1
A WeChatExternalContact.get_user_behavior_data() 0 19 1
A WeChatExternalContact.add_msg_template() 0 52 1
A WeChatExternalContact.get_contact_way() 0 11 1
A WeChatExternalContact.del_corp_tag() 0 15 1
1
# -*- coding: utf-8 -*-
2 10
"""
3
file: external_contact.py
4
author: Beck
5
created at: 2019-06-06
6
email: [email protected]
7
"""
8 10
from __future__ import absolute_import, unicode_literals
9
10 10
from optionaldict import optionaldict
11
12 10
from wechatpy.client.api.base import BaseWeChatAPI
13
14
15 10
class WeChatExternalContact(BaseWeChatAPI):
16
    """
17
    https://work.weixin.qq.com/api/doc#90000/90135/90221
18
    """
19
20 10
    def get_follow_user_list(self):
21
        """
22
        获取配置了客户联系功能的成员列表
23
        https://work.weixin.qq.com/api/doc#90000/90135/91554
24
        :return: 返回的 JSON 数据包
25
        """
26 10
        return self._get('externalcontact/get_follow_user_list')
27
28 10
    def list(self, userid):
29
        """
30
        获取外部联系人列表
31
        https://work.weixin.qq.com/api/doc#90000/90135/91555
32
        :param userid: 企业成员的userid
33
        :return: 返回的 JSON 数据包
34
        """
35 10
        return self._get('externalcontact/list', params={'userid': userid})
36
37 10
    def get(self, external_userid):
38
        """
39
        获取外部联系人详情
40
        https://work.weixin.qq.com/api/doc#90000/90135/91556
41
        :param external_userid: 外部联系人的userid,注意不是企业成员的帐号
42
        :return: 返回的 JSON 数据包
43
        """
44 10
        return self._get('externalcontact/get',
45
                         params={'external_userid': external_userid})
46
47 10
    def add_contact_way(self, type, scene, style=None,
48
                        remark=None, skip_verify=True, state=None,
49
                        user=None, party=None):
50
        """
51
        配置客户联系「联系我」方式
52
        https://work.weixin.qq.com/api/doc#90000/90135/91559
53
54
        :param type: 联系方式类型,1-单人, 2-多人
55
        :param scene: 场景,1-在小程序中联系,2-通过二维码联系
56
        :param style: 在小程序中联系时使用的控件样式,详见附表
57
        :param remark: 联系方式的备注信息,用于助记,不超过30个字符
58
        :param skip_verify: 外部客户添加时是否无需验证,默认为true
59
        :param state: 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值
60
        :param user: 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个
61
        :param party: 使用该联系方式的部门id列表,只在type为2时有效
62
        :return: 返回的 JSON 数据包
63
        """
64 10
        data = optionaldict(
65
            type=type,
66
            scene=scene,
67
            style=style,
68
            remark=remark,
69
            skip_verify=skip_verify,
70
            state=state,
71
            user=user,
72
            party=party
73
        )
74 10
        return self._post('externalcontact/add_contact_way', data=data)
75
76 10
    def get_contact_way(self, config_id):
77
        """
78
        获取企业已配置的「联系我」方式
79
        https://work.weixin.qq.com/api/doc#90000/90135/91559
80
        :param config_id: 联系方式的配置id, e.g.42b34949e138eb6e027c123cba77fad7
81
        :return: 返回的 JSON 数据包
82
        """
83 10
        data = optionaldict(
84
            config_id=config_id
85
        )
86 10
        return self._post('externalcontact/get_contact_way', data=data)
87
88 10
    def update_contact_way(self, config_id, remark, skip_verify=True,
89
                           style=None, state=None, user=None,
90
                           party=None):
91
        """
92
        更新企业已配置的「联系我」方式
93
        https://work.weixin.qq.com/api/doc#90000/90135/91559
94
95
        :param config_id: 企业联系方式的配置id
96
        :param remark: 联系方式的备注信息,不超过30个字符,将覆盖之前的备注
97
        :param skip_verify: 外部客户添加时是否无需验证
98
        :param style: 样式,只针对“在小程序中联系”的配置生效
99
        :param state: 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值
100
        :param user: 使用该联系方式的用户列表,将覆盖原有用户列表
101
        :param party: 使用该联系方式的部门列表,将覆盖原有部门列表,只在配置的type为2时有效
102
        :return: 返回的 JSON 数据包
103
        """
104 10
        data = optionaldict(
105
            config_id=config_id,
106
            remark=remark,
107
            skip_verify=skip_verify,
108
            style=style,
109
            state=state,
110
            user=user,
111
            party=party
112
        )
113 10
        return self._post('externalcontact/update_contact_way', data=data)
114
115 10
    def del_contact_way(self, config_id):
116
        """
117
        删除企业已配置的「联系我」方式
118
        :param config_id: 企业联系方式的配置id
119
        :return: 返回的 JSON 数据包
120
        """
121 10
        data = optionaldict(
122
            config_id=config_id
123
        )
124 10
        return self._post('externalcontact/del_contact_way', data=data)
125
126 10
    def add_msg_template(self, template):
127
        """
128
        添加企业群发消息模板
129
        https://work.weixin.qq.com/api/doc#90000/90135/91560
130
131
        {
132
          "external_userid":[
133
            "woAJ2GCAAAXtWyujaWJHDDGi0mACas1w",
134
            "wmqfasd1e1927831291723123109r712"
135
          ],
136
          "sender":"zhangsan",
137
          "text":{
138
            "content":"文本消息内容"
139
          },
140
          "image":{
141
            "media_id":"MEDIA_ID"
142
          },
143
          "link":{
144
            "title":"消息标题",
145
            "picurl":"https://example.pic.com/path",
146
            "desc":"消息描述",
147
            "url":"https://example.link.com/path"
148
          },
149
          "miniprogram":{
150
            "title":"消息标题",
151
            "pic_media_id":"MEDIA_ID",
152
            "appid":"wx8bd80126147df384",
153
            "page":"/path/index"
154
          }
155
        }
156
        external_userid	否	客户的外部联系人id列表,不可与sender同时为空,最多可传入1万个客户
157
        sender	否	发送企业群发消息的成员userid,不可与external_userid同时为空
158
        text.content	否	消息文本内容
159
        image.media_id	是	图片的media_id
160
        link.title	是	图文消息标题
161
        link.picurl	否	图文消息封面的url
162
        link.desc	否	图文消息的描述
163
        link.url	是	图文消息的链接
164
        miniprogram.title	是	小程序消息标题
165
        miniprogram.pic_media_id	是	小程序消息封面的mediaid,封面图建议尺寸为520*416
166
        miniprogram.appid	是	小程序appid,必须是关联到企业的小程序应用
167
        miniprogram.page	是	小程序page路径
168
169
        text、image、link和miniprogram四者不能同时为空;
170
        text与另外三者可以同时发送,此时将会以两条消息的形式触达客户
171
        image、link和miniprogram只能有一个,如果三者同时填,则按image、link、miniprogram的优先顺序取参,也就是说,如果image与link同时传值,则只有image生效。
172
        media_id可以通过素材管理接口获得。
173
174
        :param template: 见上方说明.
175
        :return: 返回的 JSON 数据包
176
        """
177 10
        return self._post('externalcontact/add_msg_template', data=template)
178
179 10
    def get_group_msg_result(self, msgid):
180
        """
181
        获取企业群发消息发送结果
182
        企业和第三方可通过该接口获取到添加企业群发消息模板生成消息的群发发送结果。
183
        https://work.weixin.qq.com/api/doc#90000/90135/91561
184
185
        :param msgid: 群发消息的id,通过添加企业群发消息模板接口返回
186
        :return: 返回的 JSON 数据包
187
        """
188 10
        data = optionaldict(
189
            msgid=msgid
190
        )
191 10
        return self._post('externalcontact/get_group_msg_result', data=data)
192
193 10
    def get_user_behavior_data(self, userid,
194
                               start_time, end_time):
195
        """
196
        获取员工行为数据
197
198
        企业可通过此接口获取员工联系客户的行为数据,包括聊天数,发送消息数,消息回复比例和平均首次回复时长等维度。
199
        https://work.weixin.qq.com/api/doc#90000/90135/91580
200
201
        :param userid: 	userid列表
202
        :param start_time: 数据起始时间
203
        :param end_time: 数据结束时间
204
        :return: 返回的 JSON 数据包
205
        """
206 10
        data = optionaldict(
207
            userid=userid,
208
            start_time=start_time,
209
            end_time=end_time
210
        )
211 10
        return self._post('externalcontact/get_user_behavior_data', data=data)
212
213 10
    def send_welcome_msg(self, template):
214
        """
215
        发送新客户欢迎语
216
        企业微信在向企业推送添加外部联系人事件时,会额外返回一个welcome_code,企业以此为凭据调用接口,即可通过成员向新添加的客户发送个性化的欢迎语。
217
        为了保证用户体验以及避免滥用,企业仅可在收到相关事件后20秒内调用,且只可调用一次。
218
        如果企业已经在管理端为相关成员配置了可用的欢迎语,则推送添加外部联系人事件时不会返回welcome_code。
219
        https://work.weixin.qq.com/api/doc#90000/90135/91688
220
221
        {
222
          "welcome_code":"CALLBACK_CODE",
223
          "text":{
224
            "content":"文本消息内容"
225
          },
226
          "image":{
227
            "media_id":"MEDIA_ID"
228
          },
229
          "link":{
230
            "title":"消息标题",
231
            "picurl":"https://example.pic.com/path",
232
            "desc":"消息描述",
233
            "url":"https://example.link.com/path"
234
          },
235
          "miniprogram":{
236
            "title":"消息标题",
237
            "pic_media_id":"MEDIA_ID",
238
            "appid":"wx8bd80126147df384",
239
            "page":"/path/index"
240
          }
241
        }
242
        welcome_code	是	通过添加外部联系人事件推送给企业的发送欢迎语的凭证,有效期为20秒
243
        text.content	否	消息文本内容
244
        image.media_id	是	图片的media_id
245
        link.title	是	图文消息标题
246
        link.picurl	否	图文消息封面的url
247
        link.desc	否	图文消息的描述
248
        link.url	是	图文消息的链接
249
        miniprogram.title	是	小程序消息标题
250
        miniprogram.pic_media_id	是	小程序消息封面的mediaid,封面图建议尺寸为520*416
251
        miniprogram.appid	是	小程序appid,必须是关联到企业的小程序应用
252
        miniprogram.page	是	小程序page路径
253
254
        text、image、link和miniprogram四者不能同时为空;
255
        text与另外三者可以同时发送,此时将会以两条消息的形式触达客户
256
        image、link和miniprogram只能有一个,如果三者同时填,则按image、link、miniprogram的优先顺序取参,也就是说,如果image与link同时传值,则只有image生效。
257
        media_id可以通过素材管理接口获得。
258
        :param template: 见上方说明.
259
        :return: 返回的 JSON 数据包
260
        """
261 10
        return self._post('externalcontact/send_welcome_msg', data=template)
262
263 10
    def get_unassigned_list(self, page_id, page_size):
264
        """
265
        获取离职成员的客户列表
266
        企业和第三方可通过此接口,获取所有离职成员的客户列表,并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员。
267
        https://work.weixin.qq.com/api/doc#90000/90135/91563
268
269
        :param page_id: 分页查询,要查询页号,从0开始
270
        :param page_size: 每次返回的最大记录数,默认为1000,最大值为1000
271
        :return:
272
        """
273 10
        data = optionaldict(
274
            page_id=page_id,
275
            page_size=page_size
276
        )
277 10
        return self._post('externalcontact/get_unassigned_list', data=data)
278
279 10
    def transfer(self, external_userid, handover_userid,
280
                 takeover_userid):
281
        """
282
        离职成员的外部联系人再分配
283
        企业可通过此接口,将已离职成员的外部联系人分配给另一个成员接替联系。
284
        https://work.weixin.qq.com/api/doc#90000/90135/91564
285
286
        :param external_userid: 外部联系人的userid,注意不是企业成员的帐号
287
        :param handover_userid: 离职成员的userid
288
        :param takeover_userid: 接替成员的userid
289
        :return: 返回的 JSON 数据包
290
        """
291 10
        data = optionaldict(
292
            external_userid=external_userid,
293
            handover_userid=handover_userid,
294
            takeover_userid=takeover_userid
295
        )
296 10
        return self._post('externalcontact/transfer', data=data)
297
298 10
    def get_corp_tag_list(self, tag_ids=None):
299
        """
300
        企业可通过此接口获取企业客户标签详情
301
        https://work.weixin.qq.com/api/doc/90000/90135/92116
302
303
        :param tag_ids:要查询的标签id,如果不填则获取该企业的所有客户标签,目前暂不支持标签组id ,示例:["etXXXXXXXXXX","etYYYYYYYYYY"]
304
        :return: 返回的 JSON 数据包
305
        """
306
        data = optionaldict(
307
            tag_id=tag_ids
308
        )
309
        return self._post('externalcontact/get_corp_tag_list', data=data)
310
311 10
    def add_corp_tag(self, group_id, group_name, order, tags):
312
        """
313
314
        企业可通过此接口向客户标签库中添加新的标签组和标签。
315
        https://work.weixin.qq.com/api/doc/90000/90135/92117
316
317
        :param group_id: 标签组id
318
        :param group_name: 标签组名称,最长为30个字符
319
        :param order: 否	标签组次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
320
        :param tags:[
321
                    tag.name	是	添加的标签名称,最长为30个字符
322
                    tag.order	否	标签次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
323
                    ]
324
        :return:返回的 JSON 数据包
325
        """
326 10
        data = optionaldict(
327
            group_id=group_id,
328
            group_name=group_name,
329
            order=order,
330
            tag=tags
331
        )
332
333 10
        return self._post('externalcontact/add_corp_tag', data=data)
334
335 10
    def edit_corp_tag(self, id, name, order):
336
        """
337
        企业可通过此接口编辑客户标签/标签组的名称或次序值。
338
        https://work.weixin.qq.com/api/doc/90000/90135/92117
339
340
        :param id:标签或标签组的id列表
341
        :param name:新的标签或标签组名称,最长为30个字符
342
        :param order:标签/标签组的次序值。order值大的排序靠前。有效的值范围是[0, 2^32)
343
        :return:返回的 JSON 数据包
344
        """
345 10
        data = optionaldict(
346
            id=id,
347
            name=name,
348
            order=order
349
        )
350 10
        return self._post('externalcontact/edit_corp_tag', data=data)
351
352 10
    def del_corp_tag(self, tag_id=None, group_id=None):
353
        """
354
        企业可通过此接口删除客户标签库中的标签,或删除整个标签组。
355
        如果一个标签组下所有的标签均被删除,则标签组会被自动删除。
356
        https://work.weixin.qq.com/api/doc/90000/90135/92117
357
358
        :param tag_id:标签的id列表  tag_id和group_id不可同时为空。
359
        :param group_id:标签组的id列表  tag_id和group_id不可同时为空。
360
        :return:返回的 JSON 数据包
361
        """
362 10
        data = optionaldict(
363
            tag_id=tag_id,
364
            group_id=group_id
365
        )
366 10
        return self._post('externalcontact/del_corp_tag', data=data)
367
368 10
    def mark_tag(self, userid, external_userid, add_tag=None, remove_tag=None):
369
        """
370
        企业可通过此接口为指定成员的客户添加上由企业统一配置的标签。
371
        https://work.weixin.qq.com/api/doc/90000/90135/92118
372
373
        :param userid:添加外部联系人的userid
374
        :param external_userid:外部联系人userid
375
        :param add_tag:要标记的标签列表
376
        :param remove_tag:要移除的标签列表
377
        :return:返回的 JSON 数据包
378
        """
379 10
        add_tag = add_tag or []
380 10
        remove_tag = remove_tag or []
381 10
        data = optionaldict(
382
            userid=userid,
383
            external_userid=external_userid,
384
            add_tag=add_tag,
385
            remove_tag=remove_tag
386
        )
387
        return self._post('externalcontact/mark_tag', data=data)
388