1. 程式人生 > >django搭建微信後臺——批量獲取使用者資訊

django搭建微信後臺——批量獲取使用者資訊

最近在給一個服務號做後臺,有各種許可權的感覺真好^_^

資料庫設計

這次的需求需要針對訂閱使用者的等級提供不同的許可權等,因此需要獲取所有訂閱使用者的資訊,建立了一個簡單的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')

當然這只是簡單實現了抓取過程,考慮到細節還要新增新關注使用者自動建立使用者例項,取關使用者刪除使用者例項,以及手動重新整理使用者資訊等等功能。