注意,文章是连贯的,应从第一篇来看
上次说了有关二维码的更新问题,下面记录一下获取自己的头像的问题
我们可以查看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/[email protected]_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
欢迎指教