“JS逆向 | Python爬虫 | 动态cookie如何破~”

Python爬虫如何搞定动态Cookie?小白也能学会! Chrome DevTools Protocol (CDP) 是Chrome浏览器提供的一套调试协议,允许开发者与浏览器进行深度交互,包括检查和控制页面元素、网络请求、性能分析等。通过这个协议 ,我们可以实时监听浏览器的Network事件,包括Cookie的生成和变化。接入CDP通常需要借助支持此协议的库 ,如Python的pyppeteer或,这些库提供了与Chrome DevTools Protocol交互的高级API。以下以pyppeteer为例说明如何开始:首先,安装pyppeteer。 阅读详情

案例目标

目标网址:aHR0cHMlM0EvL21hdGNoLnl1YW5yZW54dWUuY29tL21hdGNoLzI=

本题目标:提取全部 5 页发布日热度的值,计算所有值的加和,并提交答案

常规 JavaScript 逆向思路

JavaScript 逆向工程通常分为以下三步:

  1. 寻找入口:逆向工程的核心在于找出加密参数的生成方式。关键逻辑可能隐藏在某个方法或变量中。一个网站可能加载了大量 JavaScript 文件,关键在于从这些文件中找到核心代码的位置。

  2. 调试分析:找到入口后,定位到可能执行关键参数的方法。接着,分析内部逻辑,了解使用了哪些加密算法和变量赋值变换。通过整理整体思路,利用断点或反混淆工具进行详细调试分析。

  3. 模拟执行:通过调试分析,掌握了逻辑后,需要复现加密过程,以获取最终所需的数据。

开始分析

1、打开chrome浏览器后,打开开发者工具,然后在开始之前,先清空一下缓存

2、重新刷新网页,发现网站开始进入 debugger;

解决的办法有以下几种:

1.禁用此处断点,在 debugger 行数单击鼠标右键,选择【never paush here】然后刷新页面h或点击下一步断点(F8)即可。
2.添加条件断点,同样,在行数单击右键,选择【add conditional breakpoint】然后输入 false,回车后再刷新页面
...

3、 在 Network 中可以看到热度值的 api 数据接口为2,响应预览中可以看到当前页面各手机型号发布日热度值:

4、查看这个接口,好像也没什么特殊的地方

5、点击到第二页的时候有概率会提示:cookie 失效,正在重置页面:

6、点击确定,对比请求头,再结合题目,判定问题就出在这个动态cookie上,而且就是 m :

7、看下 m 的具体属性,并非服务器直接设置:

cookie 中的 m 参数的样式如下:

2df979fcd34a0bfe193d10c45cae4632|1717209153000

8、(右键)清除 m 值重新加载页面

可以看到两个一样的请求,但是一个cookie 没有 m,看不到响应,且响应头没有 setcookie,另一个请求的 cookie 带有 m 值。由此猜测,cookie 中的 m 值是第一次请求后由 js 生成出来的。

9、既然第一个请求这么奇怪,我们使用 requests 看下它到底作了什么妖0*0。

用 fidder 抓包或者 python 请求可以发现其返回的是一个混淆的 js 代码:

#!usr/bin/env python
# -*- coding:utf-8 _*-

import requests

cookies = {
   
   
    'tk': '-5621756640779912732',
    'sessionid': 'qdlnifuic3h3iygdq3rcaoxpyrdo9c82',
    'qpfccr': 'true',
    'no-alert3': 'true',
}

headers = {
   
   
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh',
    'cache-control': 'no-cache',
    # 'cookie': 'tk=-5621756640779912732; sessionid=qdlnifuic3h3iygdq3rcaoxpyrdo9c82; qpfccr=true; no-alert3=true',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'referer': 'https://match.yuanrenxue.cn/match/2',
    'sec-ch-ua': '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',
}

response = requests.get('https://match.yuanrenxue.cn/match/2', cookies=cookies, headers=headers)

print(response.text)

发现返回了一堆 js 代码,进一步验证了 cookie 是由 js 生成的猜想:

浏览器调试

知道了大概位置,就可以开始找具体代码了。

在源代码选项卡中找到事件监听断点,勾选脚本,这样在遇到js时会自动断下,清除浏览器中保存的 cookie,刷新界面


这里 hook 下 cookie:

(function () {
   
   
    Object.defineProperty(document, 'cookie', {
   
   
        set: function (val) {
   
   
            debugger;
            return val;
        },
    });
})();

hook 好以后 让网页继续运行,成功断在 cookie 生成位置:

此时的 m 已经生成出来了,不过可以通过调用堆栈往前找到生成的位置。

_0x36f9ed[$dbsm_0x2d28('\x30\x78\x34\x63\x31', '\x51\x6e\x61\x7a') + '\x79\x68'](_0x36f9ed['\x4c\x4b\x61' + '\x79\x68'](_0x36f9ed[$dbsm_0x2d28('\x30\x78\x34\x39\x33', '\x34\x33\x55\x36') + '\x63\x4a'](_0x36f9ed[$dbsm_0x2d28('\x30\x78\x31\x36\x66', '\x7a\x6f\x74\x26') + '\x63\x7a'](_0x36f9ed[$dbsm_0x2d28('\x30\x78\x31\x64\x35', '\x65\x38\x34\x67') + '\x43\x44'](_0x36f9ed['\x54\x65\x61' + '\x43\x44']('\x6d', _0x36f9ed[$dbsm_0x2d28('\x30\x78\x33\x32\x37', '\x40\x6e\x71\x49') + '\x46\x4b'](_0x49aa7c)), '\x3d'), _0x36f9ed['\x57\x58\x6b' + '\x66\x77'](_0x5d6009, _0x26b6ca)), '\x7c'), _0x26b6ca), _0x36f9ed['\x41\x73\x54' + '\x75\x6d']);
                location[$dbsm_0x2d28('\x30\x78\x63\x34', '\x57\x6f\x5b\x4f') + $dbsm_0x2d28('\x30\x78\x34\x64\x36', '\x72\x50\x50\x79')]();

再来看下_0x36f9ed:

这个_0x36f9ed里面包含了很多字符串和函数,也就是说上面的代码都是在调用它里面的函数。

稍加整理:

_0x36f9ed['LKayh'](
_0x36f9ed['LKayh'](
_0x36f9ed['yYtcJ'](
_0x36f9ed['TCacz'](
_0x36f9ed['TeaCD'](
_0x36f9ed['TeaCD']('m', 
_0x36f9ed["TZmFK"](_0x49aa7c)), '='), 
_0x36f9ed['WXkfw'](_0x5d6009, _0x26b6ca)), '|'), _0x26b6ca),
 _0x36f9ed['AsTum']);


这是个大套娃函数,逐一验证:

也就是最后只要计算:

_0x36f9ed['WXkfw'](_0x5d6009, _0x26b6ca) + '|' + _0x26b6ca

剩下的就是补环境了。

用猿人学的采集工具解混淆(https://tool.yuanrenxue.cn/decode_obfuscator)看看,简单的读下代码。

解混淆之后的代码如下:

setInterval(function () {
   
   
  $dbsm_0x2cce85();
}, 4000);

(function $dbsm_0x5bf942(_0x31e196) {
   
   
  var _0x39cca0 = function () {
   
   
    var _0x13d1a6 = true;
    return function (_0x4cd36a, _0x4e4df1) {
   
   
      var _0x51fcc5 = _0x13d1a6 ? function () {
   
   
        if (_0x4e4df1) {
   
   
          var _0x174e7c = _0x4e4df1["apply"](_0x4cd36a, arguments);

          _0x4e4df1 = null;
          return _0x174e7c;
        }
      } : function () {
   
   };

      _0x13d1a6 = false;
      return _0x51fcc5;
    };
  }();

  var _0x5a13d7 = function () {
   
   
    var _0x1aa8c9 = true;
    return function (_0xdbfd1d, _0x5bfa4e) {
   
   
      var _0x1409db = _0x1aa8c9 ? function () {
   
   
        if (_0x5bfa4e) {
   
   
          var _0x2f8d9f = _0x5bfa4e["apply"](_0xdbfd1d, arguments);

          _0x5bfa4e = null;
          return _0x2f8d9f;
        }
      } : function () {
   
   };

      _0x1aa8c9 = false;
      return _0x1409db;
    };
  }();

  function _0x7d37cb(_0x47959e, _0x3bc00b) {
   
   
    var _0x11ade0 = (65535 & _0x47959e) + (65535 & _0x3bc00b);

    return (_0x47959e >> 16) + (_0x3bc00b >> 16) + (_0x11ade0 >> 16) << 16 | 65535 & _0x11ade0;
  }

  function _0x142d6a(_0x1bbddf, _0x3f144b) {
   
   
    return _0x1bbddf << _0x3f144b | _0x1bbddf >>> 32 - _0x3f144b;
  }

  function _0x3649fb(_0x21be27, _0xe6370b, _0x5eeffe, _0x11f158, _0x40461a, _0x2ee259) {
   
   
    return _0x7d37cb(_0x142d6a(_0x7d37cb(_0x7d37cb(_0xe6370b, _0x21be27), _0x7d37cb(_0x11f158, _0x2ee259)), _0x40461a), _0x5eeffe);
  }

  function _0x106504(_0x3f4fd4, _0x3c217b, _0x277540, _0x4ef3b1, _0x3be99b, _0x2d706f, _0x180aad) {
   
   
    return _0x3649fb(_0x3c217b & _0x277540 | ~_0x3c217b & _0x4ef3b1, _0x3f4fd4, _0x3c217b, _0x3be99b, _0x2d706f, _0x180aad);
  }

  function _0x569d9f(_0x3a1a35, _0x4e6ac2, _0x5a49a9, _0x312136, _0xd2eee1, _0x156125, _0x396c4c) {
   
   
    return _0x3649fb(_0x4e6ac2 & _0x312136 | _0x5a49a9 & ~_0x312136, _0x3a1a35, _0x4e6ac2, _0xd2eee1, _0x156125, _0x396c4c);
  }

  function _0x25e694(_0x2a8b77, _0x6278a0) {
   
   
    let _0x124cc7 = [99, 111, 110, 115, 111, 108, 101];
    let _0x23a395 = "";

    for (let _0x29cf05 = 0; _0x29cf05 < _0x124cc7["length"]; _0x29cf05++) {
   
   
      _0x23a395 += String["fromCharCode"](_0x124cc7[_0x29cf05]);
    }

    return _0x23a395;
  }

  function _0x573502(_0x21e7a6, _0x87331, _0xb0313, _0x3c93cc, _0x2b42ca, _0x490f6b, _0x18e811) {
   
   
    return _0x3649fb(_0x87331 ^ _0xb0313 ^ _0x3c93cc, _0x21e7a6, _0x87331, _0x2b42ca, _0x490f6b, _0x18e811);
  }

  function _0xc20d2b(_0x130de7, _0x243ab5, _0x5c559a, _0x4eb361, _0x178d6a, _0x3871a0, _0x325335) {
   
   
    return _0x3649fb(_0x5c559a ^ (_0x243ab5 | ~_0x4eb361), _0x130de7, _0x243ab5, _0x178d6a, _0x3871a0, _0x325335);
  }

  function _0x116551(_0x1dbd19, _0x3eb31e) {
   
   
    if (_0x3eb31e) {
   
   
      return _0xc20d2b(_0x1dbd19);
    }

    return _0x25e694(_0x1dbd19);
  }

  function _0x118b69(_0x118b98, _0x4dc3aa) {
   
   
    let _0x5350c = "";

    for (let _0x51d6de = 0; _0x51d6de < _0x118b98["length"]; _0x51d6de++) {
   
   
      _0x5350c += String["fromCharCode"](_0x118b98[_0x51d6de]);
    }

    return _0x5350c;
  }

  function _0x7c9cae(_0x218784, _0x102f11) {
   
   
    var _0x4a24af = _0x39cca0(this, function () {
   
   
      var _0x58b618 = function () {
   
   
        var _0x4e2deb = _0x58b618["constructor"]("return /\" + this + \"/")()["compile"]("^([^ ]+( +[^ ]+)+)+[^ ]}");

        return !_0x4e2deb["test"](_0x4a24af);
      };

      return _0x58b618();
    });

    _0x4a24af();

    (function () {
   
   
      _0x5a13d7(this, function () {
   
   
        var _0x22c2f7 = new RegExp("function *\\( *\\)");

        var _0x1449c8 = new RegExp("\\+\\+ *(?:[a-zA-Z_$][0-9a-zA-Z_$]*)", "i");

        var _0x543b10 = $dbsm_0x2cce85("init");

        if (!_0x22c2f7["test"](_0x543b10 + "chain") || !_0x1449c8["test"](_0x543b10 + "input")) {
   
   
          _0x543b10("0");
        } else {
   
   
          $dbsm_0x2cce85();
        }
      })();
    })();

    _0x116551();

    qz = [10, 99, 111, 110, 115, 111, 108, 101, 32, 61, 32, 110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 41, 10, 99, 111, 110, 115, 111, 108, 101, 46, 108, 111, 103, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 32, 40, 115, 41, 32, 123, 10, 32, 32, 32, 32, 119, 104, 105, 108, 101, 32, 40, 49, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 40, 105, 61, 48, 59, 105, 60, 49, 49, 48, 48, 48, 48, 48, 59, 105, 43, 43, 41, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 104, 105, 115, 116,
【Python】爬虫+动态Cookie获取 一、前言 背景是帮助朋友爬取一个国家网站发布的肺炎疫情统计信息。 二、遇到的问题 朋友本来是打算按照最基本的方法进行爬取,代码如下: import requests import re URL = "xxxxxx" r = requests.get(URL) #print(r) 但这样收到服务器的回复是HTTP 412,没有获得正常的回应。这就非常奇怪了,请求的页面看起来也是静态页面... 阅读详情

相关推荐

猿人学web端爬虫攻防大赛赛题解析_第二题:动态cookie1

观察cookie字段 发现两个会动态变化的cookie字段:m和Hm_lvt_0362c7a08a9a04ccf3a8463c590e1e2f 第一种(作弊法,用selenium模拟访问,一哈子就成功了。。)

仙路尽头谁为峰 1129

JS逆向实战:从零破解a_bogus参数生成算法

在Web安全与数据采集领域,前端参数加密是常见的反爬虫策略。其核心原理是通过JavaScript在客户端对请求参数进行哈希、编码等运算,生成动态令牌(如sign、token),服务端以此验证请求合法性。这项技术能有效防止脚本自动化访问,保障平台数据安全。对于爬虫工程师和Web安全研究者而言,掌握JS逆向技能至关重要,它能将前端加密逻辑还原为可编程算法,实现高效、稳定的自动化数据采集。本文聚焦于实战中常见的a_bogus参数,通过热门的JS逆向技术,详细拆解其生成逻辑,并提供完整的Python还原方案与工程化

weixin_33725239的博客 408

MCP协议:不懂JS也能做逆向,AI辅助逆向工程实战指南

逆向工程是分析软件、协议或系统内部工作原理的技术,常用于安全研究、漏洞挖掘和兼容性开发。其核心原理是通过静态与动态分析,理解代码逻辑、数据流和通信机制。传统逆向对JavaScript等动态语言要求极高,需掌握混淆代码解析、加密算法和动态调试。MCP(Model Context Protocol)协议的出现,通过标准化工具集成,将AI大模型转化为可调度专业逆向工具的智能中枢,极大降低了技术门槛。其技术价值在于实现了从“硬啃代码”到“指挥AI”的范式转变,使工程师能聚焦问题定义与结果验证。在Web前端逆向、AP

cnracht8153的博客 425

AI辅助JS逆向入门:MCP协议与Claude实战指南

JavaScript逆向分析是爬虫开发和Web安全测试中的关键技术,用于解析前端加密逻辑以模拟合法请求。其核心原理在于通过浏览器开发者工具动态调试,定位并理解参数生成算法。传统方法对开发者的JS功底要求较高,而结合AI大模型(如Claude)与MCP(Model Context Protocol)协议的新范式,能显著降低学习门槛。MCP作为AI与本地工具间的桥梁,允许模型直接调用Node.js执行环境、读取文件或发送HTTP请求,实现“描述问题-获取分析-验证结果”的协作流程。这种技术价值在于将繁琐的代码搜

weixin_30598225的博客 471

Python Playwright异步爬虫实战:逆向解析猎聘网高端职位数据

在数据驱动的时代,网络爬虫是获取公开信息的关键技术。其核心原理是通过程序模拟浏览器行为,向目标服务器发送请求并解析返回的HTML文档,从而提取结构化数据。这项技术的价值在于能够自动化、规模化地采集信息,为市场分析、竞品研究和趋势预测提供数据基础。在动态网页和反爬机制日益复杂的应用场景下,传统的静态爬虫库已力不从心。此时,需要借助更强大的浏览器自动化工具来穿透前端交互,直接获取渲染后的内容。本文聚焦于利用Playwright这一现代无头浏览器框架,结合Python异步编程,构建一个能够稳定、高效地逆向解析猎聘

culh2177的博客 631

Python爬虫之cookie操作

session可以处理大部分反爬机制,session处理不了的,我们可以用selenium 两者结合基本是无敌的。#2.使用session发起的请求,目的是为了捕获到cookie,且将其存储到session对象中。#3.就是使用携带了cookie的session对象发起的请求(就是携带者cookie发起的请求)没有cookie的网站,我们就不要用session。滚轮下滑,会加载新的热帖,由此可见热帖是动态加载的。#查看session携带的cookie。查看session携带的cookie。

景天科技苑 1万+

apple游客下单逆向分析

Apple游客下单Cookies注册激活流程逆向分析与算法实现

吴秋霖的博客 1998

PDD直播弹幕协议逆向分析

通过分析接口还原加密算法,使用Python发送PDD直播间弹幕

吴秋霖的博客 3051

【python】JS逆向中,手把手教会你如何层层突破瑞数加密

在Web开发中,JS逆向工程是一种常见的技术手段,用于分析、理解和修改网页的JavaScript代码。其中,瑞数加密技术是许多网站用于保护数据、防止爬虫和自动化工具访问的重要措施。本教程将结合实际案例,详细讲解如何在JS逆向中破解瑞数加密,从而获取所需的数据或绕过网站的保护机制。

景天科技苑 2万+

ICP语序文字点选验证逆向分析(含Py纯算源码)

jsl(加速乐)流程分析、文字点选验证码识别配合孪生网络提取坐标

吴秋霖的博客 3229

Python实战项目:百度翻译爬虫与数据挖掘全流程

很多网站对没有User-Agent的请求直接拒之门外。解决办法很简单——加上就行!params={"from": "zh", "to": "en", "query": "测试"})✅ 最佳实践建议:- 从浏览器开发者工具复制完整headers;- 使用Session对象复用配置,避免重复书写;- 建立UA池,随机选用不同标识降低风险。说到Session,它还有一个隐藏技能——持久连接(Keep-Alive),可以在多次请求间复用TCP连接,大幅提升性能。

weixin_42143092的博客 1794

机器学习kaggle案例:风控评分卡模型(Give_Me_Some_Credit)

kaggle链接:https://www.kaggle.com/c/GiveMeSomeCredit ipynb文件:https://github.com/824024445/KaggleCases/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0kaggle%E6%A1%88%E4%BE%8B%EF%BC%9A%E9%A3%8E%E6%8E%A7%...

weixin_42662126的博客 1万+

数字电路实验避坑指南:如何正确搭建主从JK触发器测试电路(附Proteus仿真)

本文详细解析了主从JK触发器的工作原理及实验搭建指南,重点解决了常见的Catching Problem现象,并提供了Proteus仿真优化方案。通过元器件选型、电路连接步骤和常见错误排查,帮助读者正确搭建测试电路,确保数字电路实验的稳定性和可靠性。

weixin_30790841的博客 469

用SOLIDWORKS从零画一个履带机器人,手把手教你搞定底盘和传动

本文详细介绍了如何使用SOLIDWORKS从零开始设计履带式机器人,重点讲解底盘结构优化和传动系统设计的关键步骤。通过七个阶段的实战指南,包括前期规划、底盘建模、驱动系统装配、履带生成、动态模拟等,帮助工程师和爱好者掌握履带机器人的核心设计技巧,提升地形适应能力和动力效率。

weixin_30872499的博客 632

减小伺服电机共振的方法(以松下伺服为例)

嘿 ! 我是【小黄】 , 我们又见面啦 !!! 毕竟技术只有大家交流才会进步嘛 ! 这博客是对自己学习的一点点记录和总结 ,如果您对自动控制感兴趣的话 ,可以关注一下我的动态 , 我们一起学习呀 ! 我们都还年轻 ,我们还有无限可能 。 YES ! 减小伺服电机共振的方法(以松下伺服为例)1. 准备工作:1.1.1 如何推定共振点:1.1.2 测定实操:1.1.3 总结:2. 下期预告: 在我们调试完伺服参数以后机器人运动到某个特定位置会产生振动或异响,我们要做的就是消除这个异响保..

在下小黄的博客 1万+

Protobuf NDK以及QNX交叉编译

Protobuf 用处很广,尤其是通讯数据序列化,反序列化。TODO。

静虚待令,有物混成 1558

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 213

工业质检升级!C#上位机集成YOLOv8.3.138+Blob分析:尺寸测量+缺陷检测一步到位

工业场景的技术选型,从来不是“选最先进的”,而是“选最适配的”。这个项目的成功,不在于采用了多前沿的技术,而在于找对了“贴合场景的技术组合”和“落地导向的实施思路”。C#上位机的稳定性保障了系统长期运行,YOLOv8.3.138的精度解决了缺陷检测痛点,Blob分析的抗干扰能力确保了尺寸测量准确,三者结合实现了“1+1+1>3”的效果。先摸透场景,再选技术:不要盲目追求最新模型,先深入了解车间环境、生产节奏、精度要求,选择兼容性强、稳定性高的技术方案;数据质量决定模型性能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 608

【报错解决】OpenClaw 报错 `openclaw: command not found`:全局命令未加入系统 PATH 的深度排查与修复指南

在国产AI工具链开发中,OpenClaw作为关键命令行工具常出现command not found报错。本文深度分析该问题的根源——Linux环境变量PATH未包含用户级安装目录(~/.local/bin)。通过四种解决方案(临时PATH修改、永久配置、软链接、虚拟环境处理)和排错Checklist,揭示"命令存在却找不到"的本质是路径配置问题,特别适用于Docker/国产Linux/非root环境。文中强调理解Linux工具链机制对国产AI开发的重要性,并指出这是开发者掌握环境

博客 5381

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: LangChain入门:使用Python和通义千问打造免费的Qwen大模型聊天机器人
下一篇: Python项目代码太多if-else? 这样优化才优雅!
海哥python
博客等级 码龄9年 1487粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海哥python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值