django搭建微信後臺——批量獲取使用者資訊
阿新 • • 發佈:2019-01-02
最近在給一個服務號做後臺,有各種許可權的感覺真好^_^
資料庫設計
這次的需求需要針對訂閱使用者的等級提供不同的許可權等,因此需要獲取所有訂閱使用者的資訊,建立了一個簡單的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"
}
然後遍歷列表,通過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')
當然這只是簡單實現了抓取過程,考慮到細節還要新增新關注使用者自動建立使用者例項,取關使用者刪除使用者例項,以及手動重新整理使用者資訊等等功能。