batch.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. from optionaldict import optionaldict
  4. from wechatpy.client.api.base import BaseWeChatAPI
  5. from wechatpy.utils import to_text
  6. class WeChatBatch(BaseWeChatAPI):
  7. """
  8. https://work.weixin.qq.com/api/doc#90000/90135/90979
  9. 异步批量接口用于大批量数据的处理,提交后接口即返回,企业微信会在后台继续执行任务。
  10. 执行完成后,企业微信后台会通过任务事件通知企业获取结果。事件的内容是加密的,解密过程请参考 [消息的加解密处理][signure],任务事件请参考异步任务完成事件推送。
  11. 目前,仅为通讯录更新提供了异步批量接口
  12. """
  13. def sync_user(self, url, token, encoding_aes_key, media_id, to_invite=True):
  14. """
  15. 增量更新成员
  16. https://work.weixin.qq.com/api/doc#90000/90135/90980
  17. :param url: 企业应用接收企业微信推送请求的访问协议和地址,支持http或https协议
  18. :param token: 用于生成签名
  19. :param encoding_aes_key: 用于消息体的加密,是AES密钥的Base64编码
  20. :param media_id: 上传的csv文件的media_id
  21. :param to_invite: 是否邀请新建的成员使用企业微信(将通过微信服务通知或短信或邮件下发邀请,每天自动下发一次,最多持续3个工作日),默认值为true。
  22. :return: 返回的 JSON 数据包
  23. """
  24. return self._post(
  25. 'batch/syncuser',
  26. data={
  27. 'media_id': media_id,
  28. 'to_invite': to_invite,
  29. 'callback': {
  30. 'url': url,
  31. 'token': token,
  32. 'encodingaeskey': encoding_aes_key
  33. }
  34. }
  35. )
  36. def replace_user(self, url, token, encoding_aes_key, media_id, to_invite=True):
  37. """
  38. 全量覆盖成员
  39. https://work.weixin.qq.com/api/doc#90000/90135/90981
  40. :param url: 企业应用接收企业微信推送请求的访问协议和地址,支持http或https协议
  41. :param token: 用于生成签名
  42. :param encoding_aes_key: 用于消息体的加密,是AES密钥的Base64编码
  43. :param media_id: 上传的csv文件的media_id
  44. :param to_invite: 是否邀请新建的成员使用企业微信(将通过微信服务通知或短信或邮件下发邀请,每天自动下发一次,最多持续3个工作日),默认值为true。
  45. :return: 返回的 JSON 数据包
  46. """
  47. return self._post(
  48. 'batch/replaceuser',
  49. data={
  50. 'media_id': media_id,
  51. 'to_invite': to_invite,
  52. 'callback': {
  53. 'url': url,
  54. 'token': token,
  55. 'encodingaeskey': encoding_aes_key
  56. }
  57. }
  58. )
  59. def replace_party(self, url, token, encoding_aes_key, media_id):
  60. """
  61. 全量覆盖部门
  62. https://work.weixin.qq.com/api/doc#90000/90135/90982
  63. :param url: 企业应用接收企业微信推送请求的访问协议和地址,支持http或https协议
  64. :param token: 用于生成签名
  65. :param encoding_aes_key: 用于消息体的加密,是AES密钥的Base64编码
  66. :param media_id: 上传的csv文件的media_id
  67. :return: 返回的 JSON 数据包
  68. """
  69. return self._post(
  70. 'batch/replaceparty',
  71. data={
  72. 'media_id': media_id,
  73. 'callback': {
  74. 'url': url,
  75. 'token': token,
  76. 'encodingaeskey': encoding_aes_key
  77. }
  78. }
  79. )
  80. def get_result(self, job_id):
  81. """
  82. 获取异步任务结果
  83. https://work.weixin.qq.com/api/doc#90000/90135/90983
  84. :param job_id: 异步任务id,最大长度为64字符
  85. :return: 返回的 JSON 数据包
  86. """
  87. return self._get('batch/getresult', params={'jobid': job_id})
  88. def invite(self, user=None, party=None, tag=None):
  89. """
  90. 邀请成员
  91. https://work.weixin.qq.com/api/doc#90000/90135/90975
  92. 企业可通过接口批量邀请成员使用企业微信,邀请后将通过短信或邮件下发通知。
  93. :param user: 成员ID列表, 最多支持1000个。
  94. :param party: 成员ID列表, 最多支持100个。
  95. :param tag: 成员ID列表, 最多支持100个。
  96. :return: 返回的 JSON 数据包
  97. """
  98. data = optionaldict(user=user, party=party, tag=tag)
  99. return self._post('batch/invite', data=data)
  100. def invite_user(self, url, token, encoding_aes_key, user_ids=None,
  101. party_ids=None, tag_ids=None, invite_tips=None):
  102. """
  103. 邀请成员关注(deprecated)
  104. https://qydev.weixin.qq.com/wiki/index.php?title=异步任务接口
  105. :param url: 企业应用接收企业微信推送请求的访问协议和地址,支持http或https协议
  106. :param token: 用于生成签名
  107. :param encoding_aes_key: 用于消息体的加密,是AES密钥的Base64编码
  108. :param user_ids: 可选,成员ID列表,多个接收者用‘|’分隔,最多支持1000个。
  109. :param party_ids: 可选,部门ID列表,多个接收者用‘|’分隔,最多支持100个。
  110. :param tag_ids: 可选,标签ID列表,多个接收者用‘|’分隔。
  111. :param invite_tips: 可选,推送到微信上的提示语
  112. :return: 返回的 JSON 数据包
  113. """
  114. data = optionaldict()
  115. data['callback'] = {
  116. 'url': url,
  117. 'token': token,
  118. 'encodingaeskey': encoding_aes_key
  119. }
  120. if isinstance(user_ids, (tuple, list)):
  121. user_ids = '|'.join(map(to_text, user_ids))
  122. if isinstance(party_ids, (tuple, list)):
  123. party_ids = '|'.join(map(to_text, party_ids))
  124. if isinstance(tag_ids, (tuple, list)):
  125. tag_ids = '|'.join(map(to_text, tag_ids))
  126. data['touser'] = user_ids
  127. data['toparty'] = party_ids
  128. data['totag'] = tag_ids
  129. data['invite_tips'] = invite_tips
  130. return self._post('batch/inviteuser', data=data)