最近在给一个服务号做后台,有各种权限的感觉真好^_^
数据库设计
这次的需求需要针对订阅用户的等级提供不同的权限等,因此需要获取所有订阅用户的信息,创建了一个简单的user类来保存每个用户,django自带的user太复杂了,而且这里也根本不需要用户自己登陆什么的。
#models.py
class SimpleUser(models.Model):
name = models.CharField(max_length=50, null=False, blank=False)
open_id = models.CharField(max_length=100, null=False, blank=False)
group = models.IntegerField(default=1, blank=False, null=False)
def __unicode__(self):
return str(self.group) + ':' + self.name
拿到权限后可以获取的用户信息很详细,以下是微信开发的文档里面给的示例:
{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0
}
在这里我只需要名字和分组两个信息,openid是拉取用户信息时就需要的不用说了。其他的可以按需求保存在数据库。
拉取逻辑
根据wechat_sdk的文档,获取用户信息有两种方式:
- 官方接口:
get_followers(first_user_id=None)
方法获取所有关注者的openid(列表形式),返回的json数据包如下:
{
"total":23000,
"count":10000,
"data":{"
openid":[
"OPENID1",
"OPENID2",
...,
"OPENID10000"
]
},
"next_openid":"NEXT_OPENID1"
}
此处需要注意的是,count的最大值为10000,当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求。 参考文档:
http://mp.weixin.qq.com/wiki/3/17e6919a39c1c53555185907acf70093.html
然后遍历列表,通过get_user_info(user_id[, lang='zh_CN'])
方法挨个抓取所有用户的信息。
- 非官方接口 :
get_user_list(page=0, pagesize=10, groupid=0)
方法获取关注者列表,给出的返回实例是这样的:
{
"contacts": [
{
"id": 2431798261,
"nick_name": "Doraemonext",
"remark_name": "",
"group_id": 0
},
{
"id": 896229760,
"nick_name": "微信昵称",
"remark_name": "",
"group_id": 0
}
]
}
信息比较少,非官方接口相当于直接使用账号密码登陆到微信后台,目前还没使用过,我采用的是第一种方法。
def get_all_user(request):
users_data = wechat.get_followers()
for open_id in users_data['data']['openid']:
#print open_id
cur_user_info = wechat.get_user_info(open_id)
#print cur_user_info
cur_username = cur_user_info['nickname']
cur_group_id = cur_user_info['groupid']
cur_simpleuser = SimpleUser(
name = cur_username,
open_id=open_id,
group=cur_group_id,
)
cur_simpleuser.save()
return HttpResponse(json.dumps(users_data, ensure_ascii=False), content_type='application/json')
当然这只是简单实现了抓取过程,考虑到细节还要添加新关注用户自动创建用户实例,取关用户删除用户实例,以及手动刷新用户信息等等功能。