首页 > 其他分享 >通过爬虫方式获取小红书授权登录的cookie的代码

通过爬虫方式获取小红书授权登录的cookie的代码

时间:2024-11-13 16:46:19浏览次数:3  
标签:code 小红书 爬虫 content url qr cookie id

1、代码里的normal_sign.js代码是某书签名算法xs,xt的实现-CSDN博客里的;
2、CookieUtil工具代码见抖音最新bd-ticket-guard-client-data逆向方法(2024年11月)-CSDN博客里的CookieUtil.py;

import json
import time
import zlib
from urllib.parse import urlparse

import execjs
import requests
import random
import uuid
import os
import qrcode
import hashlib
from fake_useragent import UserAgent

from CookieUtil import CookieUtil

normal_js = execjs.compile(open(r"xiaohongshu/normal_sign.js", "r", encoding="utf-8").read())


def get_platform_code():
    # PlatformCode.MacOs; // 3
    # PlatformCode.Android; // 2
    # PlatformCode.iOS;    // 1
    # PlatformCode.Linux;  // 4
    # PlatformCode.other;  // 5
    return 3

def gen_random_string(length):
    CHARSET = '0123456789abcdefghijklmnopqrstuvwxyz'
    return ''.join(random.choice(CHARSET) for _ in range(length))

def generate_local_id():
    LOCAL_ID_SECRET_VERSION = "0"
    platform_code = get_platform_code()
    timestamp_hex = hex(int(time.time() * 1000))[2:]  # 获取当前时间的十六进制字符串
    random_str = gen_random_string(30)
    u = f"{timestamp_hex}{random_str}{platform_code}{LOCAL_ID_SECRET_VERSION}000"
    crc32_value = zlib.crc32(u.encode('utf-8')) & 0xffffffff
    return (u + str(crc32_value))[:52]

def get_gid_acw_tc(user_agent):
    url = "https://www.xiaohongshu.com/api/sec/v1/shield/webprofile"

    headers = {
        'origin': 'https://creator.xiaohongshu.com',
        'referer': 'https://creator.xiaohongshu.com/',
        'user-agent': user_agent,
        'content-type': 'application/json;charset=UTF-8'
    }

    data = {
        "platform": "Mac OS",
        "sdkVersion": "3.7.8",
        "svn": "2",
        "profileData": ""
    }

    json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)
    response = requests.post(url, headers=headers, data=json_str)
    cookies = response.cookies
    return cookies.get("gid"), cookies.get("acw_tc")

def create_qr_code(qr_code_id):
    url = f"https://customer.xiaohongshu.com/loginconfirm?fullscreen=true&sceneId=sso&qrCodeId={qr_code_id}"
    qr = qrcode.QRCode(
        version=1,  # 控制QR码的大小(1为最小)
        error_correction=qrcode.constants.ERROR_CORRECT_L,  # 容错率
        box_size=10,  # 每个“点”的像素大小
        border=4,  # 边框的宽度
    )

    qr.add_data(url)
    qr.make(fit=True)

    img = qr.make_image(fill="black", back_color="white")
    img.save("xiaohongshu_qrcode.png")
    os.system("open xiaohongshu_qrcode.png")

def get_qr_code(cookie_content, user_agent):
    request_url = "https://customer.xiaohongshu.com/api/cas/customer/web/qr-code"

    data = {
        "service": "https://creator.xiaohongshu.com"
    }

    parsed_url = urlparse(request_url)
    uri_with_query = parsed_url.path + ('?' + parsed_url.query if parsed_url.query else '')

    cookie_dict = CookieUtil.cookies_to_dict(cookie_content)
    a1 = cookie_dict['a1']

    xs = normal_js.call("get_xs_xt", uri_with_query, data, a1)

    headers = {
        'user-agent': user_agent,
        'x-s': xs['X-s'],
        'x-t': str(xs['X-t']),
        'Cookie': cookie_content,
        'content-type': 'application/json;charset=UTF-8'
    }

    print(headers['x-s'])
    print(headers['x-t'])

    json_str = json.dumps(data, separators=(',', ':'), ensure_ascii=False)
    response = requests.post(request_url, headers=headers, data=json_str)
    print(response.status_code)
    jsonObj = json.loads(response.text)
    print(json.dumps(jsonObj, indent=4, ensure_ascii=False))
    qr_code_id = jsonObj['data']['id']
    # 将二维码保存为本地图片,方便扫码测试
    create_qr_code(qr_code_id)
    return qr_code_id


def check_login_status(cookie_content, user_agent, qr_code_id):
    request_url = f"https://customer.xiaohongshu.com/api/cas/customer/web/qr-code?service=https:%2F%2Fcreator.xiaohongshu.com&qr_code_id={qr_code_id}&source="

    parsed_url = urlparse(request_url)
    uri_with_query = parsed_url.path + ('?' + parsed_url.query if parsed_url.query else '')

    cookie_dict = CookieUtil.cookies_to_dict(cookie_content)
    a1 = cookie_dict['a1']

    while True:
        xs = normal_js.call("get_xs_xt", uri_with_query, '', a1)

        headers = {
            'origin': 'https://creator.xiaohongshu.com',
            'referer': 'https://creator.xiaohongshu.com/',
            'user-agent': user_agent,
            'x-s': xs['X-s'],
            'x-t': str(xs['X-t']),
            'Cookie': cookie_content
        }
        response = requests.get(request_url, headers=headers)
        print(response.status_code)
        print(response.text)
        jsonObj = json.loads(response.text)
        status = jsonObj['data']['status']
        if status == 1:
            print("登录成功!!!")
            cookie_string = '; '.join([f'{key}={value}' for key, value in response.cookies.items()])
            return cookie_content + "; " + cookie_string
        elif status == 2:
            print("待扫码...")
        elif status == 3:
            print("已扫码,请在手机app上确认...")
        elif status == 4:
            print("二维码已过期,请重新生成!")
            break
        else:
            print("status: ", status)
            break

        time.sleep(1)


def compute_md5(input_string):
    # 创建MD5哈希对象
    md5_hash = hashlib.md5()

    # 计算哈希值,输入字符串需要先编码为字节
    md5_hash.update(input_string.encode('utf-8'))

    # 获取计算结果并转为16进制字符串表示
    return md5_hash.hexdigest()

def login(user_agent):
    a1 = generate_local_id()
    webid = compute_md5(a1)
    sec_poison_id = str(uuid.uuid4())
    websectiga = gen_random_string(64)
    gid, acw_tc = get_gid_acw_tc(user_agent)

    cookie_content = f"xsecappid=ugc; a1={a1}; webId={webid}; websectiga={websectiga}; sec_poison_id= {sec_poison_id}; gid={gid}; acw_tc={acw_tc}"
    qr_code_id = get_qr_code(cookie_content, user_agent)

    login_cookie_content = check_login_status(cookie_content, user_agent, qr_code_id)
    print("login cookie:\n", login_cookie_content)
    with open('xiaohongshu_cookie.txt', 'w', encoding='utf-8') as file:
        file.write(login_cookie_content)


if __name__ == '__main__':
    ua = UserAgent(platforms=['pc'], os=["windows", "macos"])
    user_agent = ua.chrome

    login(user_agent)

标签:code,小红书,爬虫,content,url,qr,cookie,id
From: https://blog.csdn.net/sh_moranliunian/article/details/143747074

相关文章

  • Python爬虫实战案例(爬取图片)
    爬取图片的信息爬取图片与爬取文本内容相似,只是需要加上图片的url,并且在查找图片位置的时候需要带上图片的属性。这里选取了一个4K高清的壁纸网站(彼岸壁纸https://pic.netbian.com)进行爬取。具体步骤如下:第一步依然是进入这个页面,这个壁纸网站分为好几种类型的壁纸图片,......
  • 【Python爬虫实战】深入解锁 DrissionPage:ChromiumPage 自动化网页操作指南
      ......
  • 爬虫案例-2345天气王历史天气获取
    爬虫案例-2345天气王历史天气获取1.项目简介本项目的目的是利用网络爬虫技术,在2345天气王网站中,获取重庆从2011年至2023年的历史天气数据,包括每日温度、降雨量等信息。通过数据的获取与清洗,我们能够更好地研究重庆的气候变化趋势,为相关分析提供基础数据支持。2.进入网......
  • 程序员必备的几款爬虫软件,搞定复杂数据抓取任务
    作为一名数据工程师,三天两头要采集数据,用过十几种爬虫软件,也用过Python爬虫库,还是建议新手使用现成的软件比较方便。这里推荐3款不错的自动化爬虫工具,八爪鱼、亮数据、WebScraper1.八爪鱼爬虫八爪鱼爬虫是一款功能强大的桌面端爬虫软件,主打可视化操作,即使是没有任何编......
  • 猿人学web端爬虫攻防大赛赛题第5题——js 混淆 - 乱码增强
    题目网址:https://match.yuanrenxue.cn/match/5解题步骤抓数据包。在请求头和请求体中都有加密的内容。比较特殊的就RM4hZBv0dDon443M字段,全局搜索一下。没有任何内容,只能跟第2题一样,利用fiddler来设置断点了。(function(){'usestrict';varcookieTemp=''......
  • 使用 Python 实现高效网页爬虫——从获取链接到数据保存
    前言在这个时代,网络爬虫已成为数据分析与信息收集不可或缺的技术之一。本文将通过一个具体的Python项目来介绍如何构建一个简单的网络爬虫,它能够自动抓取指定网站的文章链接、标题、正文内容以及图片链接,并将这些信息保存为CSV文件。目标网站一、准备工作在开始编写爬......
  • 仿小红书圈子源码圈子源码论坛源码仿贴吧论坛源码仿小红书源码社交源码轻量圈子PHP源
    关于仿小红书圈子源码、仿贴吧论坛源码以及轻量圈子PHP源码等需求,以下是一些详细的信息和建议:仿小红书社交源码技术栈:前端通常使用React、Vue或Angular等现代前端框架来构建用户界面,提供流畅的用户体验;后端则使用Java、SpringBoot等技术构建强大的后端服务,处理用户数据、社......
  • 双十一购物攻略:如何利用爬虫技术获取历史价格趋势,理性购物不踩雷
    双十一购物狂欢节即将到来,作为程序员,利用爬虫技术查询商品的历史价格趋势,似乎是一个合理的需求,毕竟这只是为了自己参考,不涉及商业用途。然而,小伙伴们在进行爬虫操作时一定要谨慎小心,尤其是在数据采集和使用的过程中,务必遵守相关法律法规与平台的使用规范。每次和大家讲解爬虫时,我......
  • # Playwright爬虫(.net)介绍:1 简介
    Playwright是一个由Microsoft开发的开源工具,用于自动化Web浏览器的测试和操作。它提供了一种跨浏览器、跨平台的自动化解决方案,可以在Chromium、FireFox、微软Edge等多种浏览器上进行测试和操作。如果你曾经使用过Selenium,那么我可以告诉你,Playwright的用途与Selenium非常类似,可......
  • Playwright爬虫(.net)介绍:2 安装及第一个应用程序
    Playwright的安装比较简单,只需要使用命令行输入几行命令就可以完成。由于本系统主要通过MicrosoftVisualStudioCommunity2022及C#进行记录,因此在安装Playwright前需要自行完成相关开发环境的搭建。1.运行PowerShell,并定位到某个目录中。2.输入如下命令,新建一个mstest项目:do......