• 雨课堂模拟登录_获取websocket数据


    写在最前:互联网并非法外之地,爬虫仅供技术交流

    运行环境

    • python 3.7.4
    • requests 2.10.0
    • numpy 1.17.2
    • opencv-python 4.2.0.34

    爬取目标

    • 模拟登录雨课堂

    雨课堂目前的登录流程

    这次想跟大家分享一下websocket协议的爬虫怎么做。我们以雨课堂的扫码登录为例。

    雨课堂扫码登录的流程是

    1. https://www.yuketang.cn/web?next=/v2/web/index&type=3页面加载完毕后,客户端与服务端建立websocket链接。
    2. 随即客户端发送一段数据,用于请求微信二维码。
    3. 服务端拿到数据后反馈二维码相关信息。
    4. 并每隔一段时间重新发送一次二维码信息(我记得之前测试的时候是这样的,但是最近好像都需要客户端重发,服务端才回馈啊,那这样用websocket的意义何在)。
    5. 客户端根据信息去请求二维码图片。
    6. 用户扫码,由移动客户端发送信息至服务端确认用户正在登录。
    7. 服务端再通过websocket发送登录的相关信息回客户端。
    8. 客户端拿到登录的相关信息后post到login接口进行登录,至此登录成功。

    具体步骤

    一、找到websocket接口

    雨课堂的websocket接口为wss://www.yuketang.cn/wsapp/

    headers其实可以不带,雨课堂好像没有做相关鉴权。之前好像看到网上有说要带Sec-WebSocket相关属性的headers,其实不用啊,这个使用websocket就会自动生成。

    二、查看websocket数据交流情况

    数据 时间
    WebSocket 连接已建立 1602385999.188397
    {"op":"requestlogin","role":"web","version":1.4,"type":"qrcode","from":"web"} 1602385999.4041245
    {"op":"requestlogin","loginid":19xxx22,"expire_seconds":60,"ticket":"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=xxxxxxxxx","qrcode":"http://weixin.qq.com/q/xxxxxxxxx"} 1602385999.4143353

    第二行(不包含表头)的数据就是我们需要发给客户端的。

    第三行就是他会反馈的数据,隐私信息已经打码。

    ticket就是登录二维码的链接啦。

    可以下载到本地然后用PIL这个库显示出来,用手机扫码,服务端就会通过websocket链接发送如下数据给我们。

    {"subscribe_status":true,
     "AppOpenID":"打码",
     "profile_edit_status":true,
     "UserID":"打码",
     "DateJoined":"2019-04-30T13:31:55",
     "Role":2,
     "LastLogin":"2019-04-30T13:34:18",
     "Department":"",
     "WeixinUnionID":"打码",
     "LastLoginIP":"打码",
     "noRecArticle":true,
     "Auth":"打码",
     "ppt_config_data":{},
     /*姓名、性别、年龄、头像、位置等相关信息已经全部删除*/
     "Language":"zh-cn",
     "is_self_set":false,
     "MinaOpenID":"",
     "isBind":true,
     "user_on_lessons":[],
     "AndroidOpenID":"",
     "op":"loginsuccess",
     "loginid":"打码"}
    

    关键信息就是里面的UserID和Auth,是接下来登录的关键。

    三、登录

    我们要先去GET这个链接https://www.yuketang.cn/v/course_meta/user_info获取一个csrftoken。

    接着就可以将之前获得的UserID和Auth POST到https://www.yuketang.cn/pc/web_login获取sessionid,至此登录成功。

    具体的代码

    import requests
    import websocket
    import json
    import cv2 as cv
    import numpy as np
    
    userinfo = {}
    session = requests.session()
    
    def on_message(ws, message):
        global userinfo
        userinfo = json.loads(message)
        if 'subscribe_status' in userinfo:
            ws.close()
            return
        req = session.get(userinfo['ticket'])
        cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
        cv.imshow('input_image', cv.imdecode(np.array(bytearray(req.content), dtype='uint8'), cv.IMREAD_UNCHANGED))
        cv.waitKey(0)
        cv.destroyAllWindows()
    def on_error(ws, error):
        print(error)
    def on_open(ws):
        ws.send(data=json.dumps({"op":"requestlogin","role":"web","version":1.4,"type":"qrcode","from":"web"}))
    		print("open")
    
    # websocket数据交互
    ws = websocket.WebSocketApp("wss://www.yuketang.cn/wsapp/",
                                    on_message = on_message,
                                    on_error = on_error)
    ws.on_open = on_open
    ws.run_forever()
    
    # 登录
    req = session.get("https://www.yuketang.cn/v/course_meta/user_info")
    session.post("https://www.yuketang.cn/pc/web_login",data=json.dumps({'UserID':userinfo['UserID'],'Auth':userinfo['Auth']}))
    
    # 获取自己的课程列表
    req = session.get("https://www.yuketang.cn/v2/api/web/courses/list?identity=2")
    print(json.loads(req.content))
    
  • 相关阅读:
    html部分
    elementUi 新建和编辑dialog-input无法输入的小坑
    js array methods
    css-渐变背景,爱了爱了。
    css-iview官网布局
    10、TypeScript中的装饰器
    常见的预制注解
    javadoc工具
    元注解
    注解的概念
  • 原文地址:https://www.cnblogs.com/xuanyu-10-18/p/13797159.html
Copyright © 2020-2023  润新知