注意,文章是连贯的,应从第一篇来看
上次说了有关二维码的更新问题,下面记录一下获取自己的头像的问题
我们可以查看web微信的界面,发现在扫码成功后其页面并没有发生跳转,从而可以知道其为ajax方式,这里你会发现会有pending的请求,应为要一直发请求,看是否扫码,pending一会断开,返回408状态码,然后接着发请求,一直循环
所以在login.html加入ajax,这里用的jquery,这里关于返回的状态码,你可以进行测试,408-无人扫 201-成功扫 200-手机点击确定登陆
<script> $(function () { checklogin(); }); function checklogin() { $.ajax({ url: '/check-login.html', type: 'GET', dataType: 'JSON', success: function (arg) { if (arg.code == 408){//无人扫码 checklogin();//这里要递归,因为要一直发请求 }else if (arg.code == 201){// $('#qrcode').attr('src',arg.data);//这里是接受用户的头像 checklogin(); }else if (arg.code == 200){ location.href = '/user.html';//手机上确定登陆,页面跳转 } } }) } </script>
当然你需要将django的url配置
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login.html/$', views.login), url(r'^check-login.html/$', views.check_login), url(r'^user.html/$', views.user), url(r'^contact_list.html/$', views.contact_list), url(r'^send_msg.html/$', views.send_msg), url(r'^get_msg.html/$', views.get_msg), ]
首先要确定要发送的url
这里QCODE是上个函数返回二维码的qcode,CTIME是时间戳,TIP是一个登陆凭证这里注意
TIP原来返回的是1,也就是在无人扫是是一,但如果是点击登陆,或者跳转时变为0
这里是views.py的函数
def check_login(request): """ 监听用于是否扫码,是否点击确认 :param request: :return: """ global TIP ret = {'code': 408, 'data': None} r1 = requests.get( url='https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=%s&tip=%s&r=1749695388&_=%s' % ( QCODE, TIP, CTIME) ) if 'window.code=408' in r1.text: print('无人扫') return JsonResponse(ret) elif 'window.code=201' in r1.text: ret['code'] = 201 TIP = 0 avatar = re.findall("window.userAvatar = '(.*)';", r1.text)[0] ret['data'] = avatar return JsonResponse(ret) elif 'window.code=200' in r1.text: """ window.code=200; window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AcXy5ztnQJ2IpDYRovCJl1YW@qrticket_0&uuid=IaOl9pugOw==&lang=zh_CN&scan=1535854116"; """ ALL_COOKIE_DICT.update(r1.cookies.get_dict()) redirect_url = re.findall('window.redirect_uri="(.*)";', r1.text)[0] redirect_url += '&fun=new&version=v2' r2 = requests.get( url=redirect_url ) ALL_COOKIE_DICT.update(r2.cookies.get_dict()) from bs4 import BeautifulSoup soup = BeautifulSoup(r2.text, 'html.parser') for tag in soup.find('error').children: TICKET_DICT[tag.name] = tag.get_text() ret['code'] = 200 return JsonResponse(ret)
当状态码返回201时,在通过正则提取返回的img的url,然后通过ajax的更新,就可以实现对头像的获取
完整源码:https://github.com/LelandYan/weixinroot
欢迎指教