zoukankan      html  css  js  c++  java
  • 爬虫之微信项目

     1.登录页面需要有二维码:

    根据在network中查找,找到和他相关的内容

    如果想要获取那些数据就要访问这个url

    此url需要如何拼接,

    登录渲染出二维码的flask代码

    #encoding=utf-8
    from flask import  Flask,request,render_template,request,session,jsonify
    import time
    import re
    import requests
    app=Flask(__name__)
    app.debug=True
    app.secret_key='aa'
    @app.route('/login',methods=["GET","POST"])
    def login():
        if request.method=="GET":
            ctime= time.time()
            a=str(int(ctime*1000))
            #微信登录页面是
            #获取url
            url="https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%
          2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_={0}
    ".format(a) # print('*'*50,url) #通过访问此地址,获取返回值,在返回值中获取那个字段,拼接到 登录 login.html中的 img标签的 # src标签里表就能在页面中渲染出获取的二维码 ret=requests.get(url) ret1=ret.text #使用正则来吧数据取出来 c=re.findall('uuid = "(.*)";',ret1)[0] #当检查是否扫码的时候,会用到这个值,由于Flask是上下文管理的形式,能够保存的数据只有保存在session中, session["c"]=c return render_template('login.html',c=c,) else: pass

    login.html初级代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <style>
    
        </style>
    </head>
    <body>
      <div style=" 200px;margin: 0 auto">
    <h3 style="text-align: center">微信登录</h3>
          <!--通过看微信网页版登录页面可以得知,二维码这个图片的src是这个值,只是最后的数据发生了变化-->
    <img id="img" style=" 200px;height: 200px" src="https://login.weixin.qq.com/qrcode/{{c}}" alt="">
      </div>
    </body>
    </html>

    继续:

    功能一:我这个也页面需要实时的检测用户是否扫码

    功能实现

    参照微信扫码前后数据变化可以得知

    点进去看一下  :这里用到了一个长轮询的机制:优点:轮询和长轮询

    当用户扫码之但是没有在手机上确认登录的时候

    扫码之后,但是没有确认登录页面上显示的内容如下,将用户的头像替代了二维码

    检查用户是否扫码,是否登录的代码

    #encoding=utf-8
    from flask import  Flask,request,render_template,request,session,jsonify
    import time
    import re
    import requests
    app=Flask(__name__)
    app.debug=True
    app.secret_key='aa'
    @app.route('/login',methods=["GET","POST"])
    def login():
        if request.method=="GET":
            ctime= time.time()
            a=str(int(ctime*1000))
            #微信登录页面是
            #获取url
            url="https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_={0}".format(a)
            # print('*'*50,url)
            #通过访问此地址,获取返回值,在返回值中获取那个字段,拼接到 登录 login.html中的 img标签的
            #  src标签里表就能在页面中渲染出获取的二维码
            ret=requests.get(url)
            ret1=ret.text
            #使用正则来吧数据取出来
            c=re.findall('uuid = "(.*)";',ret1)[0]
            #当检查是否扫码的时候,会用到这个值,由于Flask是上下文管理的形式,能够保存的数据只有保存在session中,
            session["c"]=c
    
            return render_template('login.html',c=c,)
        else:
            pass
    
    @app.route('/checklogin',methods=["GET","POST"])
    def checklogin():
        #这边创建一个字典:并将code的值默认设置为408,表示用户未扫码,
        response={"code":408}
        import time
        time.sleep(2)
        ctime = time.time()
        a = str(int(ctime * 1000))
        #获取当前的时间戳的1000倍的值,这里注意要将内容转换成字符串类型用于拼接url
        c=session.get("c")
        # print("这是获取的ac",a,c)
        # URL:https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=QcksT_RRig==&tip=0&r=-1055866945&_=1525769055588"
        url="https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={0}&tip=0&r=-1055866945&_={1}".format(c,a)
        #去服务器端去访问并获取数据: 通过微信官网观察
        # 如果没扫描,code为408  扫描未登录 code:201 扫描登录 code:200
        # 而且这些数据是手机扫码手机将数据发送给服务端,然后服务端改变code
        ret4=requests.get(url)
    
        print("這是獲取的ret",ret4.text)
    
        if "code=201" in ret4.text:
            print('用戶已掃碼')
            #从发送会的数据中获取用户头像的url
            src=re.findall("userAvatar = '(.*)';",ret4.text)
    
            response["code"]=201
            #将url保存在response中返回给客户端
            response["src"]=src
    
            # return response
    
        elif "code=200" in ret4.text:
    
            response["code"] = 200
            print(ret4.text)
            #当用户确定登录后,访问的地址
            currenturl=re.findall('redirect_uri="(.*)";',ret4.text)[0]+"&fun=new&version=v2"
            ret5=requests.get(currenturl)
            print('這是ret5的内容',ret5)
            from bs4 import BeautifulSoup
            soup=BeautifulSoup(ret5.text,'html.parser')
            # soup.find(ret5.text,recursive)
            #从返回值中获取内容,将内容拼接到字典中去,用于渲染出用户登录后的初始数据
            error=soup.find(name='error')
            print(error)
            items=error.find_all(recursive=False)
            print(items)
            dict1={}
            for item in items:
                dict1[item.name]=item.text
    
            print(dict1)
            #将字典内容写到session中去,在显示页面中显示用户的初始信息
            session["dict1"]=dict1
            print('登陸成功')
    
        else:
    
    
            print('用戶為掃碼')
    
        #返回一个json类型的数据(字典类型的)
        return jsonify(response)
    
    @app.route('/index',methods=["GET","POST"])
    #渲染用户信息页面
    def index():
        
        d1=session.get('dict1')
        #通过视频可以知道渲染出数据需要将资格字典穿过去,
        dict = {"BaseRequest":{"Uin":d1.get("wxuin"), "Sid": d1.get("wxsid"), "Skey": d1.get("skey"), "DeviceID":"e108769709273733", }}
        #发送一个post请求,把内容传过去。
        ret6=requests.post("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1067834323&pass_ticket={0}".format(d1.get("pass_ticket")),
                      json=dict,
                      )
        ret6.encoding=ret6.apparent_encoding
        import json
        dd=json.loads(ret6.text)
        print(dd)
        return render_template('index.html',data=dd.get('User'))
    
    if __name__ == '__main__':
    
        app.run()

    lgoin html页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
        <style>
    
        </style>
    </head>
    <body>
      <div style=" 200px;margin: 0 auto">
    <h3 style="text-align: center">微信登录</h3>
          <!--通过看微信网页版登录页面可以得知,二维码这个图片的src是这个值,只是最后的数据发生了变化-->
    <img id="img" style=" 200px;height: 200px" src="https://login.weixin.qq.com/qrcode/{{c}}" alt="">
      </div>
    <script src="../static/jquery-1.12.4.js"></script>
    <script>
       $(function () {
            checklogin();
        });
        function checklogin() {
            $.ajax({
                url:'/checklogin',
                type:'GET',
    //            获取的数据类型为json格式,接受后不用再解码
                dataType:'JSON',
                success:function (arg) {
                   if(arg.code===201){
                       console.log(arg.src);
                       $("#img").attr("src",arg.src);
                       checklogin()
                   }else if(arg.code===200){
                       location.href='/index'
                   }else{checklogin()}
    
    
                }
            })
            
        }
        
        
    </script>
    <!--https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=wf4SqxD0tA==&tip=0&r=-1051590008&_=1525764953929-->
    </body>
    </html>

    index页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
    {{data.NickName}}
    
    
    </body>
    </html>
  • 相关阅读:
    CMD命令提示符的基本操作指令
    JDBC连接Oracle
    JDBC连接MySQL
    Oracle树状结构的存储与展示
    C语言 深入学习
    C# widget
    C#深入多线程
    数据库常用知识
    ASP.NET开发总结
    ASP.NET —— Web Pages
  • 原文地址:https://www.cnblogs.com/wangkun122/p/9011333.html
Copyright © 2011-2022 走看看