小红书扫码登录分析与python实现

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 代码实现

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

1. 写在前面

  今天周末,抽时间更一下之前分析过的红薯扫码协议登录。思路反正是这么个思路,此类的应用场景很多。将登录后的CK给到爬虫采集使用,这样的一个闭环,在爬虫领域的圈子内基本很多工程师都用过。本期文章作者主要讲解分析过程与实现思路

2. 接口分析

首先打开Web端页面,会自动弹出一个二维码登录框,可以扫码并在手机点击确认登录。这里我们分析一下接口发包请求,如下所示:

在这里插入图片描述

create这个即二维码生成接口,但是不同于其他网站,有固定的二维码URL,将码图片生成并存储在本地。接口也有一个登录的URL直链,码的话则是通过JS渲染生成的。当然有这个URL就够了,接口响应数据如下所示:

在这里插入图片描述

这里需要注意比较重要的三个字段,都将在后续使用上!qr_id、code你可以理解为二维码的标识,唯一且动态生成,即一码一ID!url登录链接,不是二维码链接!没有现成的二维码图或直链没有关系,我们可以使用Python生成二维码联动登录直链

一般扫码登录不知道大家有没有了解过,一张二维码创建出来后,一般是有一个服务会不断扫,扫什么?扫用户是否扫码、是否登录、码状态是否失效等等

所以这里也是一样,页面刷新生成二维码那一刻起,可以看到监测二维码状态一直在请求,直到二维码失效。这部分也是我们接下来需要构造实现的,如下所示:

在这里插入图片描述

这里的码状态监测请求频率在一秒钟扫一次,注意最好也保持在这个频率去构造监测二维码状态的请求

在这里插入图片描述

监测二维码状态的接口响应主要就是码是否被扫描了、是否确认登录了、登录是否成功了的一系列反馈。主要体现在code_status这个字段

0是二维码未被扫描、1是二维码已被扫描,但是待确认登录、2是登录成功、3则是码已经失效

3. 代码实现

  流程实现主要涉及到两个接口,倒不是特别复杂。唯一需要分析与技术攻关的就是请求头内的x-s参数,这个是在生成二维码信息以及监测二维码状态请求中必须的一个参数,动态加密生成的

这个参数的话作者在很早之前就分别完成了补环境跟纯算分析还原,这里就不再复述。感兴趣的可以阅读之前的文章:x-s与x-s-common参数分析

在这里插入图片描述

扫码登录的话它只监测x-s,不用去管x-s-c这个参数,这个参数在请求的时候可以不携带!接下来我们先实现二维码创建,通过create接口生成二维码信息,代码实现如下:

# -*- coding: utf-8 -*-

import execjs
import qrcode
import requests
from PIL import Image
from io import BytesIO

def get_xs(url, data):
 	a1 = '' # 自行获取
    with open("xsAndxscommon.js", encoding='utf-8') as f:
        ctx = execjs.compile(f.read())
    res = ctx.call(
        "getXs",
        url,
        data,
        a1)
    return res

def generate_qrcode():
   headers = {
     # 自动获取
    }
    url = '' # 自动获取
    api = "/api/sns/web/v1/login/qrcode/create"
    data = {
        "qr_type": 1
    }
    sign = get_signature(api, data)
    headers['x-s'] = sign['x-s']
    data = json.dumps(data, separators=(',', ':'))
    json_data = self.session.post(url, headers=headers, data=data).json()
    code = json_data.get('code', -1)
    if code == 0:
        data = json_data.get('data', {})
        if data:
            logger.log('INFOR', f'二维码生成完成!信息如下: {json_data}')
            code = data.get('code', '')
            qr_id = data.get('qr_id', '')
            loginurl = data.get('url', '')
            qr = qrcode.QRCode()
            qr.add_data(loginurl)
            img = qr.make_image()
            a = BytesIO()
            img.save(a, 'png')
            png = a.getvalue()
            a.close()
            t = showpng(png)
            t.start()

            login_status_monitor(code, qr_id)

    else:
        logger.log('ERROR', f'二维码生成出现异常: {json_data}')

在创建生成二维码时,请求的cookie信息,是没有登录的,可以使用网站固定的即可!上面程序运行后会弹出一张二维码,等待扫描

另外可以看到代码中有一个方法login_status_monitor则是在生成码之后就需要调用的,模拟对码扫描状态的监测,这一部分的代码实现如下所示:

def login_status_monitor(code, qr_id):
	while True:
	        cookies = {
	            # 自行获取
	        }
	        url = "" # 自行获取监测接口URL
	
	        params = {
	            "qr_id": qr_id,
	            "code": code
	        }
	        api = api = f'/api/sns/web/v1/login/qrcode/status?qr_id={qr_id}&code={code}'
	        sign = get_xs(url=api, data='')
	        headers.update(sign)
	        response = requests.get(url, headers=headers, cookies=cookies, params=params).json()
	        logger.info(response)
	        code_status = response["data"]["code_status"]
	        if code_status == 0:
	            logger.info("【二维码等待扫描】")
	        elif code_status == 1:
	            logger.info("【已扫码,请确认登录】")
	        elif code_status == 2:
	            logger.info("【登录成功】")
	            break
	        elif code_status == 3:
	            logger.info("【二维码已失效】")
	        time.sleep(1)

扫码状态的监测需要注意的点就是保持与Web站点时间频率一致,然后每一次构造请求都需要使用最新生成的x-s参数,不然是不行的

接下来,运行程序则会弹出二维码,掏出你的手机扫码并点击确认登录,即可完成!监测二维码状态的服务日志如下所示:

在这里插入图片描述

作者个人的的话,将它做成了一个Web服务,部署到了一台云服务上面,不管在何时何地只要作者打开手机访问就能看到二维码,如下所示:

在这里插入图片描述

手机浏览器刷新就会生成创建出一张新的码。作者平日里,周末的时候啥的,可能会需要获取一两篇爆款的笔记,学习研究一下别的博主是如何创作笔记的,然后就是看看最新的爆款方向啥的。所以这个扫码登录功能还对接了数据获取的爬虫服务

在这里插入图片描述

总之所有的一切一切,都是为了学习!使用技术手段学习自然是Buff加层。最后,今天的技术分享就到这里了,祝大家周末愉快!如果对你有帮助给个赞吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/481776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型:int、bigint、double等数值类型,一般用int、bigint支持设置自动更新时间的字段类型:datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

Leetcode - 周赛389

目录 一,3083. 字符串及其反转中是否存在同一子字符串 二,3084. 统计以给定字符开头和结尾的子字符串总数 三,3085. 成为 K 特殊字符串需要删除的最少字符数 四,3086. 拾起 K 个 1 需要的最少行动次数 一,3083. 字符…

Java的三大特性之一——继承

前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实…

centos7安装jdk详细步骤(yum安装与手动安装)

centos7安装jdk详细步骤(yum安装与手动安装) 一、使用yum安装1. 准备工作2. 检查系统是否自带jdk3. 安装jdk 二、手动安装jdk1. 下载上传jdk2. 安装jdk3. 配置环境变量 一、使用yum安装 1. 准备工作 如果你的机器可以联网可以使用此方法 ping www.baidu…

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…

mysql+keepalived实现对mysql的高可用

mysql数据库出现问题 133 解决方案: 在133mysql终端 实行如下命令 mysqlkeepalived实现对mysql的高可用 132 keepalived配置如下 133 keepalived配置如下 132重启keepalived服务 132关闭mysqld服务&#xff0c;vip不见了 133收到vip 132重启mysqld服务和keepalived服务,vip…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

PTA题解 --- 剪切粘贴(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解剪切粘贴&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 为了解决这个问题&#xff0c;你可以按照以下步骤进行&#xff1a; 读取输入字符串&#xff1a;首先读取原始字符串。 进行操作&#xff1a;根据输入…

【网络】数据中心网络技术概览

数据中心网络技术概览 一、数据中心网络架构 Crossbar架构&#xff1a;源自早期电话交换网络&#xff0c;由多个输入/输出端口和开关矩阵组成&#xff0c;实现设备间的任意连接&#xff0c;灵活且高效。 **Crossbar架构&#xff08;Crossbar Architecture&#xff09;是一种计…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展&#xff0c;人类进入了互联网时代&#xff0c;不仅数据量庞大&#xff0c;而且数据种类繁多&#xff0c;Python简单易学, 语法清晰&#xff0c;在数据操作方面有着一定优势&#xff0c;成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…

MySQL | 视图

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 1.1. 创建视图 create view 视图名 as select语句&#xff1b; 创建测…

(2023,图像放大与超分辨率,扩散,缩放堆叠表示,多分辨率混合,多尺度联合抽样)Ten 的生成能力

Generative Powers of Ten 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 4. 方法 4.1. 缩放堆叠表示 4.2. 多分辨率混合 4.3. 多尺度一致抽样 4.4. 基于照片…

全球大型语言模型(LLMS)现状与比较

我用上个博文的工具将一篇ppt转换成了图片&#xff0c;现分享给各位看官。 第一部分&#xff1a;国外大语言模型介绍 1&#xff0c;openai的Chatgpt 免费使用方法1&#xff1a;choose-carhttps://share.freegpts.org/list 免费使用方法2&#xff1a;Shared Chathttps://share…

查看文件内容的指令:cat,tac,nl,more,less,head,tail.file

目录 cat 介绍 输入重定向 选项 -b -n -s tac 介绍 输入重定向 nl 介绍 示例 more 介绍 选项 less 介绍 搜索文本 选项 head 介绍 示例 选项 -n tail 介绍 示例 选项 file cat 介绍 将标准输入(键盘输入)的内容打印到标准输出: 输入重定向 本应…

Docker 存储

目录 1、概念介绍 Storage Driver 无状态容器 有状态容器 Data Volume 2、bind mount 指定挂载文件只读权限 bind mount 挂载目录 3、docker manage volume 查看 volume 自定义 volume 使用 NFS 存储 4、共享数据 容器与host共享数据 volume container data-pa…