user.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. import six
  4. from library.wechatpy.client.api.base import BaseWeChatAPI
  5. class WeChatUser(BaseWeChatAPI):
  6. def get(self, user_id, lang='zh_CN'):
  7. """
  8. 获取用户基本信息(包括UnionID机制)
  9. 详情请参考
  10. https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839
  11. :param user_id: 普通用户的标识,对当前公众号唯一
  12. :param lang: 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
  13. :return: 返回的 JSON 数据包
  14. 使用示例::
  15. from wechatpy import WeChatClient
  16. client = WeChatClient('appid', 'secret')
  17. user = client.user.get('openid')
  18. """
  19. assert lang in ('zh_CN', 'zh_TW', 'en'), 'lang can only be one of \
  20. zh_CN, zh_TW, en language codes'
  21. return self._get(
  22. 'user/info',
  23. params={
  24. 'openid': user_id,
  25. 'lang': lang
  26. }
  27. )
  28. def get_followers(self, first_user_id=None):
  29. """
  30. 获取一页用户列表(当关注用户过多的情况下,这个接口只会返回一部分用户)
  31. 详情请参考
  32. https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840
  33. :param first_user_id: 可选。第一个拉取的 OPENID,不填默认从头开始拉取
  34. :return: 返回的 JSON 数据包
  35. 使用示例::
  36. from wechatpy import WeChatClient
  37. client = WeChatClient('appid', 'secret')
  38. followers = client.user.get_followers()
  39. """
  40. params = {}
  41. if first_user_id:
  42. params['next_openid'] = first_user_id
  43. return self._get(
  44. 'user/get',
  45. params=params
  46. )
  47. def iter_followers(self, first_user_id=None):
  48. """
  49. 获取所有的用户openid列表
  50. 详情请参考
  51. https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840
  52. :return: 返回一个迭代器,可以用for进行循环,得到openid
  53. 使用示例::
  54. from wechatpy import WeChatClient
  55. client = WeChatClient('appid', 'secret')
  56. for openid in client.user.iter_followers():
  57. print(openid)
  58. """
  59. while True:
  60. follower_data = self.get_followers(first_user_id)
  61. first_user_id = follower_data["next_openid"]
  62. # 微信有个bug(或者叫feature),没有下一页,也返回next_openid这个字段
  63. # 所以要通过total_count和data的长度比较判断(比较麻烦,并且不稳定)
  64. # 或者获得结果前先判断data是否存在
  65. if 'data' not in follower_data:
  66. return
  67. for openid in follower_data['data']['openid']:
  68. yield openid
  69. if not first_user_id:
  70. return
  71. def update_remark(self, user_id, remark):
  72. """
  73. 设置用户备注名
  74. 详情请参考
  75. https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140838
  76. :param user_id: 用户标识
  77. :param remark: 新的备注名,长度必须小于30字符
  78. :return: 返回的 JSON 数据包
  79. 使用示例::
  80. from wechatpy import WeChatClient
  81. client = WeChatClient('appid', 'secret')
  82. client.user.update_remark('openid', 'Remark')
  83. """
  84. return self._post(
  85. 'user/info/updateremark',
  86. data={
  87. 'openid': user_id,
  88. 'remark': remark
  89. }
  90. )
  91. def get_group_id(self, user_id):
  92. """
  93. 获取用户所在分组 ID
  94. 详情请参考
  95. http://mp.weixin.qq.com/wiki/0/56d992c605a97245eb7e617854b169fc.html
  96. :param user_id: 用户 ID
  97. :return: 用户所在分组 ID
  98. 使用示例::
  99. from wechatpy import WeChatClient
  100. client = WeChatClient('appid', 'secret')
  101. group_id = client.user.get_group_id('openid')
  102. """
  103. res = self._post(
  104. 'groups/getid',
  105. data={'openid': user_id},
  106. result_processor=lambda x: x['groupid']
  107. )
  108. return res
  109. def get_batch(self, user_list):
  110. """
  111. 批量获取用户基本信息
  112. 开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
  113. 详情请参考
  114. https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839
  115. :param user_list: user_list,支持“使用示例”中两种输入格式
  116. :return: 用户信息的 list
  117. 使用示例::
  118. from wechatpy import WeChatClient
  119. client = WeChatClient('appid', 'secret')
  120. users = client.user.get_batch(['openid1', 'openid2'])
  121. users = client.user.get_batch([
  122. {'openid': 'openid1', 'lang': 'zh-CN'},
  123. {'openid': 'openid2', 'lang': 'en'},
  124. ])
  125. """
  126. if all((isinstance(x, six.string_types) for x in user_list)):
  127. user_list = [{'openid': oid} for oid in user_list]
  128. res = self._post(
  129. 'user/info/batchget',
  130. data={'user_list': user_list},
  131. result_processor=lambda x: x['user_info_list']
  132. )
  133. return res
  134. def change_openid(self, from_appid, openid_list):
  135. '''微信公众号主体变更迁移用户 openid
  136. 详情请参考
  137. http://kf.qq.com/faq/170221aUnmmU170221eUZJNf.html
  138. :param from_appid: 原公众号的 appid
  139. :param openid_list: 需要转换的openid,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个
  140. :return: 转换后的 openid 信息列表
  141. '''
  142. return self._post(
  143. 'changeopenid',
  144. data={'from_appid': from_appid, 'openid_list': openid_list},
  145. result_processor=lambda x: x['result_list']
  146. )