二维码长轮询获取登陆并获取用户基本信息

a、status=408什么也没有操作

b、status=201微信扫了码但是没有点击确认

c、status=200代表扫码成功并确认登陆

前端是当页面加载完成才弄下一次请求,利用ajax请求,当status=408时,一直在加载请求,当status=201时,获取用户头像一直加载请求,直到status=200才跳转到另一个页面,涉及到登陆记得加cookie

1、请求登陆的地址,请求登陆的 时候会有上面说的三种状态,分别判断

2、如果是确认扫码登陆了,会返回一个redirect_uri地址,这个地址用来请求获取用户的信息ticket,返回的地址与页面请求返回的少了"&fun=new&version=v2&lang=zh_CN",得加上这个才能获取ticket

返回的ticket如下:

<error>
    <ret>0</ret>
    <message></message> <skey>@crypt_dd043c47_d6303d6aed797c295a21960d9c2d729c</ske y> <wxsid>hYiHcYEqVMC4Kim9</wxsid> <wxuin>795592819</wxuin> <pass_ticket>aNUg%2B%2FHFbBavV3w9ndTBh8hjSErIhrkBBGVl0PV F%2B9lQhFi5KtGYjlWCv2%2FoBrQf</pass_ticket>
    <isgrayscale>1</isgrayscale>
</error>

3、url地址,webchat/urls.py

    path('polling/', views.long_pooling, name="long_pooling"),

4、前端页面,templates/webch.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Wechat</title>
</head>
<body>
    <div style="width: 300px;margin: 0 auto;">
        <img id="qcode"  style="width: 300px;height: 300px;" src="https://login.weixin.qq.com/qrcode/{{code}}"/>
    </div>
    <script src="/static/js/jquery.min.js"></script>
    <!--<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>-->

    <script>
        //页面加载完在请求polling()
        $(function () {
           polling();
        })
        function polling() {
            $.ajax({
                url:'/polling/',
                type:"GET",
                dataType:"json",
                success:function (arg) {
                    if(arg.status == 408){
                        polling()
                    }else if(arg.status == 201){
                        //获取图片接着发
                        $("#qcode").attr('src',arg.data);
                        polling()
                    }else{
                        location.href="/index/"
                    }

                }
            })
        }
    </script>

</body>
</html>

5、后台登陆的三种状态判断,web/views.py

# Create your views here.
from django.shortcuts import render
from django.shortcuts import HttpResponse
import requests
import re
import time
import json
from bs4 import BeautifulSoup
VERIFY_TIME =None
verifi_uuid =None
LOGIN_COOKIE_DICT = {}
TICKET_COOKIE_DICT= {}
TICKET_DATA_DICT = {}
TIPS=1
def long_pooling(request):
    """二维码长轮询获取登陆"""
    """
    1、status=408什么也没有操作
    2、status=201微信扫了码但是没有操作
    3、status=200代表扫码成功并确认登陆
    """
    #返回的json状态和数据
    ret = {"status":408,"data":None}
    #二维码长轮询url
    try:
        #TIPS=0是没有过于频繁的轮询.刚开始是为1
        global TIPS
        #请求的地址,uuid=verifi_uuid,后面那个值是随机生产时间戳
        base_pooling_url = "https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={0}&tip={1}&r=-1322669031&={2}"
        pooling_url= base_pooling_url.format(verifi_uuid,TIPS,VERIFY_TIME)
        reponse_login = requests.get(url=pooling_url)
        #print("pooling_reponse.text",pooling_reponse.text)
        #扫码一直没有点击登陆,状态码是201,获取返回头像数据
        if "window.code=201" in reponse_login.text:
            #获取头像图片地址
            TIPS = 0
            #获取图片地址
            avatar = re.findall("userAvatar = '(.*)';",reponse_login.text)[0]
            #print("avatar",avatar)
            #更新状态和内容
            ret["status"] = 201
            ret["data"] = avatar
        #print("reponse_login",reponse_login.text)
        elif "window.code=200" in reponse_login.text:
            #登陆时候获取的cookies
            LOGIN_COOKIE_DICT.update(reponse_login.cookies.get_dict())
            #登陆成功返回一个重定向地址,这个地址请求可以获取用户信息ticket
            redirect_uri = re.findall('redirect_uri="(.*)";',reponse_login.text)[0]
            redirect_uri+="&fun=new&version=v2&lang=zh_CN"
            #print("redirect_uri",redirect_uri)

            #获取ticket和添加ticket的cookie
            reponse_ticket = requests.get(url=redirect_uri,cookies=LOGIN_COOKIE_DICT)
            TICKET_COOKIE_DICT.update(reponse_ticket.cookies.get_dict())
            #print("reponse_ticket:",reponse_ticket.text)
            #找出ticket里的值
            soup=BeautifulSoup(reponse_ticket.text,"html.parser")
            for tag in soup.find():
                #print(tag.name,tag.string)
                #把数据存入到dict中,为了下次请求的时候使用
                TICKET_DATA_DICT[tag.name]=tag.string
            #print("TICKET_DATA_DICT",TICKET_DATA_DICT)
            ret["status"] = 200
    except Exception as e:
        print(e)
    return HttpResponse(json.dumps(ret))

微信登陆的页面初始化,获取用户的基本信息

找到获取用户信息请求地址

返回的用户信息


path('index/', views.index, name="index"),

后台的请求获取用户信息,web/views.py

def index(request):
    """微信登陆的页面初始化,获取用户的基本信息"""
    user_init_url = "https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1332226764"
    payload_data = {
        "DeviceID":"e379444626462097",
        "Sid":TICKET_DATA_DICT["wxsid"],
        "Skey":TICKET_DATA_DICT["skey"],
        "Uin":TICKET_DATA_DICT["wxuin"]
    }
    cookie_all = {}
    #因为不知道用哪个cookie所以上面两个都给加上了
    cookie_all.update(LOGIN_COOKIE_DICT)
    cookie_all.update(TICKET_COOKIE_DICT)
    #返回的内容是用户的信息
    reponse_init=requests.post(url=user_init_url,json=payload_data,cookies=cookie_all)
    print("reponse_init",reponse_init)
    return render(request,"index.html",{"data":reponse_init.text,})

注:因为之前是图片加载完成就发送请求,造成前端status不等于200就不断轮询pedding,然后使django的wsgi引发错误(太多的请求,wsgi不知获取那个信息):

self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split'

解决:是等页面加载完再轮询,当刚开始请求时候刚开始url的tip=1,当status=201的时候tip=0。,这样他就不会不断的轮询,

原文地址:https://www.cnblogs.com/venvive/p/11565253.html

时间: 2024-10-25 04:30:34

二维码长轮询获取登陆并获取用户基本信息的相关文章

新版的复制统计工具介绍,微信加粉推广辅助工具,增强了复制统计功能以外,新增了二维码轮播,电话拨打统计

今年已经发展到了3.x版本,新版的比老版本新增了很多功能,除了之前已有的微信号在线管理,和复制统计,以及网页状态监控等功能以外.新增了扫码统计,二维码轮播,微信号自动上下控制,手动控制,拨打电话统计,点击复制,打开微信等,还有更强大的拦截功能.到现在为止,我们应该是最完善的微信加粉推广辅助工具了. 并且我们一直提供免费版,相对于付费版功能并无过多缩减,只是限制了能统计的落地页的数量,因为统计流量巨大,如果免费开放更多会统计的数量会占用更多的服务器资源造成服务器压力过大,从而服务器成本也会直线上升

COMET探索系列二【Ajax轮询复用模型】

COMET探索系列二[Ajax轮询复用模型] 写在前面:Ajax轮询相信大家都信手拈来在用,可是有这么一个问题,如果一个网站中同时有好多个地方需要用到这种轮询呢?就拿我们网站来说,有一个未读消息数提醒.还有一个时实时加载最新说说.昨天又加了一个全网喊话,以后还会要有类似功能添加是肯定的,难道要为每个功能都创建一个独立的轮询?要知道轮询请求中有大半是无用,会对服务器资源和宽带造成巨大的浪费.因此在页面中每增加一个轮询点,对服务器的压力及宽带浪费都将成倍的增长.再考虑一个情况,如果当前网页中需要的不

复制统计工具好多粉已升级到了3.0版本,新增二维码轮播,返回拦截,扫码统计,打开微信号,拨打电话统计

好多粉3.0版已正式发布!3.0版采用全新的ui界面系统,和全新的服务器架构开发,继承旧版本的强大功能,新增更多实用新功能. 更新说明: 后台采用全新的界面,使用更方便. 服务器采用集群部署,避免单服务器宕机故障问题. 服务端加入Redis缓存技术,页面实现毫秒级无感加载微信号,跟本地加载微信速度无异. js和管理页面均采用CDN加速技术,访问更快捷. 全站启用更安全的https访问,js文件均支持https访问. 新增返回拦截功能. 新增微信扫码功能. 新增支持拨打电话统计. 新增二维码同步微

框架基础:ajax设计方案(二)---集成轮询技术

上一篇文章介绍了ajax技术核心方法,和跨域的问题(只要后台支持跨域默认post就可以),这篇文章讲解一下使用ajax实现的轮询技术,至于iframe,SSE服务器单向推送,以及webSocket双工通道暂时不涉及. 一些概念: 短轮询:浏览器通过循环或者setTimeout方法,每隔一段时间往后台发送一次请求,无线循环 长轮询:不停的向后台请求数据,但是后台如果检测不到数据变动,就会将这个请求挂掉.如果检测到数据变动,就会响应这个请求变动数据 区别概念: 长连接:在进行http数据传输的时候,

负载均衡算法(二)加权轮询负载均衡算法

/// <summary> /// 加权轮询算法 /// </summary> public static class WeightRoundRobin { private static object obj = new object(); private static int pos = 0; static Dictionary<string, int> dic = new Dictionary<string, int> { { "192.168

好多粉微信复制统计加粉系统_更新二维码长按识别统计等

很多客户开通了腾讯广点通等广告推广,有的广告是投放在微信或者qq客户端里面.那么推广页面就可以直接加入微信二维码,让用户直接长按识别,然后添加好友等操作.这样的好处不言而喻,省去了访客复制添加等多步操作,避免访客复制错误或者记忆错误的麻烦,也就减少了流失率,提高了添加好友的成功率. 好多粉为满足广大用户对推广的精细化统计数据的要求,在统计点击行为的前提下,率先新增支持长按识别等行为. 操作很简单,步骤如下: 使用所有功能前,请添加基础统计代码! 基础统计代码安装教程: 1.落地页管理中开启行为转

C二维字符数组的使用及如何获取二维数组的总行数和总列数!

#include <stdio.h> #include <stdlib.h> int main(){ char str[][30] = {"zhangsan","lisi","wangwu"}; char (*p)[30] = str; //定义行指针 printf("%p %p %p 行数:%d 列数:%d\n",str, &str[0], &str[0][0], sizeof(str

QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

参考链接:https://github.com/bingoogolapple/BGAQRCode-Android 原文地址:https://www.cnblogs.com/xindejiyi/p/10440006.html

ajax 轮询(适合web端二维码请求)

(前几天 一直弄二维码轮询登录 想了半天 总算弄出来了 分享给大家    ^-^) 轮询: 所谓轮询 肯定需要 setInterval   但是怎么加ajax请求  需要有点小问题而且轮询成功后需要停止  下来看代码吧 var tis = setInterval(function(){$.ajax(getting)},3000);//{调用ajax(自己封装的数据)},每3秒执行一次 var getting = { type:'GET', url://地址, success: function