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

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。,这样他就不会不断的轮询,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


$.AJAX()方法中的PROCESSDATA参数 在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的) 默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded 如果想发送不
form表单提交的几种方式 表单提交方式一:直接利用form表单提交 html页面代码: &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot; /&gt; &lt;title&gt;Ins
文章浏览阅读1.3k次。AJAX的无刷新机制使得在注册系统中对于注册名称的检测能即时显示。常见的用户注册是用户输入用户名,后台程序检测数据库中用户名是否重复而做出注册的成功与失败之提示(当用户注册重名时将返回重新注册),或者稍微人性化一点就是在用户名文本框后添加一个检测按钮,让用户检测后再做注册。以上操作,对于用户体验方面来说是比较“差劲”的,一个很好的用户体验就是:当用户输入完注册用户名后,Web系统应能即时检查并即时_用户注册 实时异步检测
文章浏览阅读1.2k次。 本文将解释如何使用AJAX和JSON分析器在客户端和服务器之间创建复杂的JSON数据传输层。一、 引言毫无疑问,AJAX已经成为当今Web开发中一种强有力的用户交互技术,但是它的许多可能性应用仍然鲜为人知。在本文中,我们将来共同探讨如何 使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将_ajax技术可行性
文章浏览阅读2.2k次。/************************** 创建XMLHttpRequest对象 **************************/function CreateRequest(){ var xmlObj = null; try { xmlObj = new XMLHttpRequest(); } catch(e) {
文章浏览阅读3.7k次。在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖 掉,如果每次都创建一个新的XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有 空闲的对象,则使用此对象,否则将创建一个新的对象。下面是我最近写的一个简单的类:* XMLHttpReques_xmlhttprequest发送多个请求
文章浏览阅读3.1k次。Ajax 同一页面如何同时执行多个 XMLHTTP 呢,比如博客页,需要同时利用 Ajax 读取作者信息、文章信息、评论信息……我们的第一反应可能是创建多个全局 XMLHTTP 对象,但这并不现实。其实实现方式非常简单,就是给 onreadystatechange 对应的回调函数加上参数,以下代码是解决方案中一个函数中的一段代码。xmlhttp.open("GET", "ajax_proc_ajax响应多个mxl文件
文章浏览阅读1.5k次。数据岛指的是存在Html网页中的xml代码段,它在Html中形成了一个数据的集合,数据岛允许我们在Html网页中集成xml,对xml编写脚本.数据岛有它特有的形式,由标记xml开始,在开始标记中要有一个ID属性,用于指定该指定数据岛的名称。 (当然要以/xml结束).元素xml包含的内容就是xml代码。数据岛也分为2种:1)内嵌的数据岛形式2)外嵌的数据岛形式说了那么多废话,还_数据中岛计算模式
文章浏览阅读2.1k次。AJAX 流行之后,总想好好学习一下。但是众多的框架实在难以选择。说明一下 ASP.NET AJAX 并不包括在 AJAX 框架之中。刚开始学了 JQuqery, 众多的 $get(),...等等符号早已把我搞晕了。暂时就放弃了。后来学习 ASP.NET AJAX ,在微软的领导下,逐渐由服务器端转向客户端编程。 激起我客户端编程的兴趣,才想起学习一下了 Jquery. 随着WEB2._jquery ajax asp.net 认证
文章浏览阅读1.7k次。前段时间在用google map api的函数库的时候,发现里面的downloadUrl函数非常好用,所以自己写了一个。用腻了那些什么框架什么池,到头来发现越简单的东西越是适合我这种懒人。downloadUrl(url, callback, data);参数说明: url不用说了; callback是回调函数,函数调用的时候会有两个参数:data, responseCode,data就_xmlhttprequest downloadurl
文章浏览阅读956次。前些时间写了几篇关于XMLHTTP运用的实例.(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)近来看论坛上经常有人提问关于如何无刷新,自动更新数据.传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.我们可以让程序自动刷新.定时_后端xml怎么实现数据有救新增,没有就更新
文章浏览阅读3.3k次。 XMLHttpRequest调用XMLHttpRequest Call ●●●调用,回调,下载,抓取,实时,查询,远程通信(Remoting),远程通信脚本(RemoteScripting),同步,上传,XMLHttpRequest图6-2:XMLHttpRequest调用 目标故事Reta正在一个批发商网站上购买商品。每次她添加一个商品到购物车时,web站点发出_createxmlhttpre
文章浏览阅读1.3k次。function clearitem(){ var drp1 = document.getElementById("drp1"); while(drp1.options.length>0) { drp1.options.remove(0); } }//动态更改方法(根据城市代码取得该市商业区并添加到DropDownList中_dropdownlist根據動態變化
文章浏览阅读1.9k次。因為 Json.net 是有附原始碼的,他也附了單元測試的專案,底下是我額外增加的UnitTest,我的目標就是讓底下的測試可以pass,而且原來的Test 也要都能通過。 ValueTypeTest.csusing System;using NUnit.Framework;namespace Newtonsoft.Json.Test { [TestFixture] public cl_vb 無效的 json 基本型別
文章浏览阅读844次。利用XMLHTTP无刷新获取数据. 客户端和服务器端数据的交互有几种方法.1.提交,通过提交到服务器端.也称"有刷新"吧.2.通过XMLHTTP无刷新提交到服务器端,并返回数据.也称"无刷新"吧.利用XMLHTTP我们可以实现很多很强大的应用.这文章主要介绍它的一些简单的应用.附:因为XMLHTTP是IE5.0+支持的对象.所以你必须要有IE5.0+才能看到效果.client.htm_xmlhttp取源码没有更新
文章浏览阅读1.8k次。Json.Net 無法序列基本型別(string, int),Asp.Net Ajax 無法正確序列日期,AjaxPro序列出我不想要的_type字串 1. Json.Net 是我最常使用的序列/反序列json套件,標榜速度快,對於一對多關係的object 也都能正常運作, 己能滿足我平日的需要,但前幾天突然有個情況,我要序列的是一個泛型參數,該參數不一定是物object型別,有可能是st_token string in state start
文章浏览阅读1.3k次。转载自:http://www.cnblogs.com/JeffreyZhao/archive/2007/01/31/update_the_updatepanels_by_js.html众 所周知,UpdatePanel是通过Trigger来更新的。被设定为Trigger的控件在PostBack之后会被客户端所截获,并且使用 XMLHttpRequest对象发送内容,然后服务器端由ScriptMan_web.ui.updatepanel 和 updatepanel 的区别
文章浏览阅读1.9k次。有些时候,只是需要更新页面的一个部分甚至只是更新中间的几个数据却需要从服务器DOWN整个页面,导致各种资源的浪费。使用数据岛技术可以很好的解决这个问题:通过定时器或用户事件触发数据岛(XML对象)象服务器获取数据,在数据获取完成后,适时更新相关数据。示例HTML部分:http://localhost/WebService/LoadData/FeaturedService.asmx/GetScore_web数据岛
文章浏览阅读1k次。在页面上使用ActiveXObject的代价是很大的,如果我们的无刷新页面使用xmlhttp技术,我们或许需要频繁的建立xmlhttp对象,当然 我们也可以使用全局变量来cache一个xmlhttp对象实例。但是这样的方法适合于同步方式xmlhttp通信,而对于异步方式xmlhttp通信将 会出现问题。由于没有了进程的堵塞,用户可能再次调用同一个xmlhttp实例,如果这时前一个通信未完成,那么就
文章浏览阅读998次。 by Lokesh Dhakar 译: croc查看原文概要:Lightbox JS 是一个简单而又谦恭的用来把图片覆盖在当前页面上的脚本. 它能被快速安装并且运作于所有流行的浏览器.最新更新 Version 2.0 图片集: 分组相关的图片并且能轻松的导航它们 视觉特效: 奇特的自适应调整 向后兼容: yes! 点击这里查看实例_on lightbox 2 by lokesh dhakar