external_contact.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. # -*- coding: utf-8 -*-
  2. """
  3. file: external_contact.py
  4. author: Beck
  5. created at: 2019-06-06
  6. email: beck@ilife.co
  7. """
  8. from __future__ import absolute_import, unicode_literals
  9. from optionaldict import optionaldict
  10. from wechatpy.client.api.base import BaseWeChatAPI
  11. class WeChatExternalContact(BaseWeChatAPI):
  12. """
  13. https://work.weixin.qq.com/api/doc#90000/90135/90221
  14. """
  15. def get_follow_user_list(self):
  16. """
  17. 获取配置了客户联系功能的成员列表
  18. https://work.weixin.qq.com/api/doc#90000/90135/91554
  19. :return: 返回的 JSON 数据包
  20. """
  21. return self._get('externalcontact/get_follow_user_list')
  22. def list(self, userid):
  23. """
  24. 获取外部联系人列表
  25. https://work.weixin.qq.com/api/doc#90000/90135/91555
  26. :param userid: 企业成员的userid
  27. :return: 返回的 JSON 数据包
  28. """
  29. return self._get('externalcontact/list', params={'userid': userid})
  30. def get(self, external_userid):
  31. """
  32. 获取外部联系人详情
  33. https://work.weixin.qq.com/api/doc#90000/90135/91556
  34. :param external_userid: 外部联系人的userid,注意不是企业成员的帐号
  35. :return: 返回的 JSON 数据包
  36. """
  37. return self._get('externalcontact/get',
  38. params={'external_userid': external_userid})
  39. def add_contact_way(self, type, scene, style=None,
  40. remark=None, skip_verify=True, state=None,
  41. user=None, party=None):
  42. """
  43. 配置客户联系「联系我」方式
  44. https://work.weixin.qq.com/api/doc#90000/90135/91559
  45. :param type: 联系方式类型,1-单人, 2-多人
  46. :param scene: 场景,1-在小程序中联系,2-通过二维码联系
  47. :param style: 在小程序中联系时使用的控件样式,详见附表
  48. :param remark: 联系方式的备注信息,用于助记,不超过30个字符
  49. :param skip_verify: 外部客户添加时是否无需验证,默认为true
  50. :param state: 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值
  51. :param user: 使用该联系方式的用户userID列表,在type为1时为必填,且只能有一个
  52. :param party: 使用该联系方式的部门id列表,只在type为2时有效
  53. :return: 返回的 JSON 数据包
  54. """
  55. data = optionaldict(
  56. type=type,
  57. scene=scene,
  58. style=style,
  59. remark=remark,
  60. skip_verify=skip_verify,
  61. state=state,
  62. user=user,
  63. party=party
  64. )
  65. return self._post('externalcontact/add_contact_way', data=data)
  66. def get_contact_way(self, config_id):
  67. """
  68. 获取企业已配置的「联系我」方式
  69. https://work.weixin.qq.com/api/doc#90000/90135/91559
  70. :param config_id: 联系方式的配置id, e.g.42b34949e138eb6e027c123cba77fad7
  71. :return: 返回的 JSON 数据包
  72. """
  73. data = optionaldict(
  74. config_id=config_id
  75. )
  76. return self._post('externalcontact/get_contact_way', data=data)
  77. def update_contact_way(self, config_id, remark, skip_verify=True,
  78. style=None, state=None, user=None,
  79. party=None):
  80. """
  81. 更新企业已配置的「联系我」方式
  82. https://work.weixin.qq.com/api/doc#90000/90135/91559
  83. :param config_id: 企业联系方式的配置id
  84. :param remark: 联系方式的备注信息,不超过30个字符,将覆盖之前的备注
  85. :param skip_verify: 外部客户添加时是否无需验证
  86. :param style: 样式,只针对“在小程序中联系”的配置生效
  87. :param state: 企业自定义的state参数,用于区分不同的添加渠道,在调用“获取外部联系人详情”时会返回该参数值
  88. :param user: 使用该联系方式的用户列表,将覆盖原有用户列表
  89. :param party: 使用该联系方式的部门列表,将覆盖原有部门列表,只在配置的type为2时有效
  90. :return: 返回的 JSON 数据包
  91. """
  92. data = optionaldict(
  93. config_id=config_id,
  94. remark=remark,
  95. skip_verify=skip_verify,
  96. style=style,
  97. state=state,
  98. user=user,
  99. party=party
  100. )
  101. return self._post('externalcontact/update_contact_way', data=data)
  102. def del_contact_way(self, config_id):
  103. """
  104. 删除企业已配置的「联系我」方式
  105. :param config_id: 企业联系方式的配置id
  106. :return: 返回的 JSON 数据包
  107. """
  108. data = optionaldict(
  109. config_id=config_id
  110. )
  111. return self._post('externalcontact/del_contact_way', data=data)
  112. def add_msg_template(self, template):
  113. """
  114. 添加企业群发消息模板
  115. https://work.weixin.qq.com/api/doc#90000/90135/91560
  116. {
  117. "external_userid":[
  118. "woAJ2GCAAAXtWyujaWJHDDGi0mACas1w",
  119. "wmqfasd1e1927831291723123109r712"
  120. ],
  121. "sender":"zhangsan",
  122. "text":{
  123. "content":"文本消息内容"
  124. },
  125. "image":{
  126. "media_id":"MEDIA_ID"
  127. },
  128. "link":{
  129. "title":"消息标题",
  130. "picurl":"https://example.pic.com/path",
  131. "desc":"消息描述",
  132. "url":"https://example.link.com/path"
  133. },
  134. "miniprogram":{
  135. "title":"消息标题",
  136. "pic_media_id":"MEDIA_ID",
  137. "appid":"wx8bd80126147df384",
  138. "page":"/path/index"
  139. }
  140. }
  141. external_userid 否 客户的外部联系人id列表,不可与sender同时为空,最多可传入1万个客户
  142. sender 否 发送企业群发消息的成员userid,不可与external_userid同时为空
  143. text.content 否 消息文本内容
  144. image.media_id 是 图片的media_id
  145. link.title 是 图文消息标题
  146. link.picurl 否 图文消息封面的url
  147. link.desc 否 图文消息的描述
  148. link.url 是 图文消息的链接
  149. miniprogram.title 是 小程序消息标题
  150. miniprogram.pic_media_id 是 小程序消息封面的mediaid,封面图建议尺寸为520*416
  151. miniprogram.appid 是 小程序appid,必须是关联到企业的小程序应用
  152. miniprogram.page 是 小程序page路径
  153. text、image、link和miniprogram四者不能同时为空;
  154. text与另外三者可以同时发送,此时将会以两条消息的形式触达客户
  155. image、link和miniprogram只能有一个,如果三者同时填,则按image、link、miniprogram的优先顺序取参,也就是说,如果image与link同时传值,则只有image生效。
  156. media_id可以通过素材管理接口获得。
  157. :param template: 见上方说明.
  158. :return: 返回的 JSON 数据包
  159. """
  160. return self._post('externalcontact/add_msg_template', data=template)
  161. def get_group_msg_result(self, msgid):
  162. """
  163. 获取企业群发消息发送结果
  164. 企业和第三方可通过该接口获取到添加企业群发消息模板生成消息的群发发送结果。
  165. https://work.weixin.qq.com/api/doc#90000/90135/91561
  166. :param msgid: 群发消息的id,通过添加企业群发消息模板接口返回
  167. :return: 返回的 JSON 数据包
  168. """
  169. data = optionaldict(
  170. msgid=msgid
  171. )
  172. return self._post('externalcontact/get_group_msg_result', data=data)
  173. def get_user_behavior_data(self, userid,
  174. start_time, end_time):
  175. """
  176. 获取员工行为数据
  177. 企业可通过此接口获取员工联系客户的行为数据,包括聊天数,发送消息数,消息回复比例和平均首次回复时长等维度。
  178. https://work.weixin.qq.com/api/doc#90000/90135/91580
  179. :param userid: userid列表
  180. :param start_time: 数据起始时间
  181. :param end_time: 数据结束时间
  182. :return: 返回的 JSON 数据包
  183. """
  184. data = optionaldict(
  185. userid=userid,
  186. start_time=start_time,
  187. end_time=end_time
  188. )
  189. return self._post('externalcontact/get_user_behavior_data', data=data)
  190. def send_welcome_msg(self, template):
  191. """
  192. 发送新客户欢迎语
  193. 企业微信在向企业推送添加外部联系人事件时,会额外返回一个welcome_code,企业以此为凭据调用接口,即可通过成员向新添加的客户发送个性化的欢迎语。
  194. 为了保证用户体验以及避免滥用,企业仅可在收到相关事件后20秒内调用,且只可调用一次。
  195. 如果企业已经在管理端为相关成员配置了可用的欢迎语,则推送添加外部联系人事件时不会返回welcome_code。
  196. https://work.weixin.qq.com/api/doc#90000/90135/91688
  197. {
  198. "welcome_code":"CALLBACK_CODE",
  199. "text":{
  200. "content":"文本消息内容"
  201. },
  202. "image":{
  203. "media_id":"MEDIA_ID"
  204. },
  205. "link":{
  206. "title":"消息标题",
  207. "picurl":"https://example.pic.com/path",
  208. "desc":"消息描述",
  209. "url":"https://example.link.com/path"
  210. },
  211. "miniprogram":{
  212. "title":"消息标题",
  213. "pic_media_id":"MEDIA_ID",
  214. "appid":"wx8bd80126147df384",
  215. "page":"/path/index"
  216. }
  217. }
  218. welcome_code 是 通过添加外部联系人事件推送给企业的发送欢迎语的凭证,有效期为20秒
  219. text.content 否 消息文本内容
  220. image.media_id 是 图片的media_id
  221. link.title 是 图文消息标题
  222. link.picurl 否 图文消息封面的url
  223. link.desc 否 图文消息的描述
  224. link.url 是 图文消息的链接
  225. miniprogram.title 是 小程序消息标题
  226. miniprogram.pic_media_id 是 小程序消息封面的mediaid,封面图建议尺寸为520*416
  227. miniprogram.appid 是 小程序appid,必须是关联到企业的小程序应用
  228. miniprogram.page 是 小程序page路径
  229. text、image、link和miniprogram四者不能同时为空;
  230. text与另外三者可以同时发送,此时将会以两条消息的形式触达客户
  231. image、link和miniprogram只能有一个,如果三者同时填,则按image、link、miniprogram的优先顺序取参,也就是说,如果image与link同时传值,则只有image生效。
  232. media_id可以通过素材管理接口获得。
  233. :param template: 见上方说明.
  234. :return: 返回的 JSON 数据包
  235. """
  236. return self._post('externalcontact/send_welcome_msg', data=template)
  237. def get_unassigned_list(self, page_id, page_size):
  238. """
  239. 获取离职成员的客户列表
  240. 企业和第三方可通过此接口,获取所有离职成员的客户列表,并可进一步调用离职成员的外部联系人再分配接口将这些客户重新分配给其他企业成员。
  241. https://work.weixin.qq.com/api/doc#90000/90135/91563
  242. :param page_id: 分页查询,要查询页号,从0开始
  243. :param page_size: 每次返回的最大记录数,默认为1000,最大值为1000
  244. :return:
  245. """
  246. data = optionaldict(
  247. page_id=page_id,
  248. page_size=page_size
  249. )
  250. return self._post('externalcontact/get_unassigned_list', data=data)
  251. def transfer(self, external_userid, handover_userid,
  252. takeover_userid):
  253. """
  254. 离职成员的外部联系人再分配
  255. 企业可通过此接口,将已离职成员的外部联系人分配给另一个成员接替联系。
  256. https://work.weixin.qq.com/api/doc#90000/90135/91564
  257. :param external_userid: 外部联系人的userid,注意不是企业成员的帐号
  258. :param handover_userid: 离职成员的userid
  259. :param takeover_userid: 接替成员的userid
  260. :return: 返回的 JSON 数据包
  261. """
  262. data = optionaldict(
  263. external_userid=external_userid,
  264. handover_userid=handover_userid,
  265. takeover_userid=takeover_userid
  266. )
  267. return self._post('externalcontact/transfer', data=data)