目录

一、Cookie介绍二、cookie生成来源区分查找三、如何判断是否有cookie反爬四、来自服务器生成的cookie反爬解决方法(视频讲解见b站十一姐时一)五、来自js生成的cookie反爬解决方法(视频讲解见b站十一姐时一)1、hook-cookie脚本2、过无限debugger之(function(){}constructor('debugger')()3、逆向扣代码生成cookie-acw_sc__v2

一、Cookie介绍

先推荐该篇文章简单了解Cookie、Session、Token、JWT1、cookie的类型:会话cookie和持久cookie;其唯一的区别在于过期时间,如果设置了Discard参数,或者没有设置Expires或Max-Age参数来说明扩展的过期时间,这个cookie就是一个会话cookie2、会话cookie:是一种临时的cookie,它记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就被删除了。3、 持久cookie的生存时间更长一些,它们存储在硬盘上,浏览器退出,计算机重启时它们仍然存在。通常用持久cookie维护某个用户会周期性访问的配置文件或登录名。

二、cookie生成来源区分查找

1、cookie参数一般是通过两种方式生成,一种是服务端返回的cookie,另一种是网页端有javascript代码生成的cookie2、首先将打开谷歌开发者工具(一般按F12即可打开),清除掉网页缓存的cookie参数以及其他的参数,一般我们选择一个Clear Storage即可 3、清掉缓存后,再刷新网页,同样在谷歌开发者工具Application的位置查看是否有HttpOnly属性,或者是第一个请求的响应头里面的Set-Cookie , 测试网站

三、如何判断是否有cookie反爬

删掉cookie,重放请求,看是否还能和之前一样请求到一样的响应数据内容,如果能,则没有cookie反爬,如果不能,则有cookie反爬如何确定cookie哪个参数是反爬的关键,测试法,多个键值对一个一个删,看谁影响到了,具体的看b站视频十一姐时一介绍讲解测试:通过重放请求与删除单个cookie测试

四、来自服务器生成的cookie反爬解决方法(视频讲解见b站十一姐时一)

1、来自服务器生成的cookie,一般我们不用管,只需要请求对应的链接即可,可以直接用会话session保持,比如requests里面的session 2、案例一,szxx_session的cookie反爬 , 以及请求头参数X-Csrf-Token反爬 , 案例视频手把手讲解 3、代码-仅供学习交流 # -*- coding: utf-8 -*-

# @Time : 2023-07-23

# @Author: sy

# @公众号: 逆向OneByOne

# @url: http://www.zjmazhang.gov.cn/hdjlpt/published?via=pc

import urllib3

import re

from loguru import logger

import requests

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def _requests(url, data=None):

if data:

res = ses.post(url, headers=headers, data=data, timeout=10)

else:

res = ses.get(url, headers=headers, timeout=10)

logger.info(f">>>requests {url}")

logger.success(f">>>status_code 【{res.status_code}】 res.cookies {res.cookies} ses.cookies {ses.cookies}")

if res.status_code in [521, 412, 202, 200]:

return res

def page(token):

post_url = "http://www.zjmazhang.gov.cn/hdjlpt/letter/pubList"

form_data = {

"offset": "0",

"limit": "20",

"site_id": "759010"

}

headers.update({"X-Csrf-Token": token})

resp = _requests(post_url, form_data)

print(resp.text)

print("请问麻章区办理居住证需要满足什么条件?" in resp.text)

def index():

index_url = "http://www.zjmazhang.gov.cn/hdjlpt/published?via=pc"

resp = _requests(index_url)

print("请问麻章区办理居住证需要满足什么条件?" in resp.text)

xsrf_token = re.search(r"var _CSRF = '(.*?)';",resp.text).group(1)

return xsrf_token

ses = requests.session()

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.9",

"Accept-Encoding": "gzip, deflate",

"Accept-Language": "zh-CN,zh;q=0.9",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"

}

_token = index()

page(_token)

五、来自js生成的cookie反爬解决方法(视频讲解见b站十一姐时一)

1、hook-cookie脚本

1、来自js生成的cookie需要解密研究,可以通过hook-cookie的方式定位,cookie生成位置,然后回溯生成逻辑过程, 案例视频手把手教-上(function() {

'use strict';

var _cookie = ""; // hook cookie

Object.defineProperty(document, 'cookie', {

set: function(val) {

console.log('cookie set->', new Date().getTime(), val);

debugger;

_cookie = val;

return val;

},

get: function() {

return _cookie;

}

});

})()

2、过无限debugger之(function(){}constructor(‘debugger’)()

1、为什么浏览器打开控制台会进入无限debugger的代码,而不打开就会正常执行也不会卡死? ,案例视频手把手教-中

代码中明确插入了 debugger 关键字,浏览器才会在相应位置进入调试模式。所以可以通过检测控制台是否打开,并在代码中插入 debugger 关键字,让在控制台打开的情况下触发调试器断点,从而阻止爬虫程序的正常执行如果浏览器的控制台没有打开,那么 (function(){}constructor('debugger')() 这段代码将被正常执行,而不会触发调试器断点当控制台打开时,浏览器会执行 (function(){}constructor('debugger')() 这段代码,并在构造函数中的字符串参数 ‘debugger’ 处触发调试器断点,导致代码陷入循环调试状态 2、一种检验浏览器控制台打开的方式之一 3、不推荐 Never pause here过无限debugger,RangeError: Maximum call stack size exceeded , 这个错误表示递归调用的层级太深,超过了 JavaScript 引擎的处理能力;从而造成内存溢出,浏览器卡死 4、本次案例,过无限debugger,选择如下方式 , (function(){}constructor('debugger')() // 1. 备份之前的Function.prototype.constructor

Function.prototype.constructor_= Function.prototype.constructor

// 2. 重写Function.prototype.constructor

Function.prototype.constructor = function() {

if (arguments[0] === 'debugger') {

return

} else {

return Function.prototype.constructor_.apply(this, arguments)

}

}

3、逆向扣代码生成cookie-acw_sc__v2

1、本次案例,来自客户端生成的cookie反爬acw_sc__v2 和服务器的cookie反爬xq_a_token ,案例视频手把手教-下2、代码-仅供学习交流# -*- coding: utf-8 -*-

# @Time : 2023-07-30

# @Author: sy

# @公众号: 逆向OneByOne

# @url: https://xueqiu.com/today

# @desc: acw_sc__v2 cookie xq_a_token 反爬

# encoding: utf-8

import execjs # pip install execjs

from loguru import logger

import requests

import re

def get_acw_sc__v2(arg1):

"""python还原逻辑"""

def unsbox(_string):

_a = [15, 35, 29, 24, 33, 16, 1, 38, 10, 9, 19, 31, 40, 27, 22, 23, 25, 13, 6, 11, 39, 18, 20, 8, 14, 21, 32,

26, 2, 30, 7, 4, 17, 5, 3, 28, 34, 37, 12, 36]

_b = [""] * len(_a)

for _i in range(len(_string)):

_temp = _string[_i]

for _j in range(len(_a)):

if _a[_j] == _i + 1:

_b[_j] = _temp

_b = [x for x in _b if x.strip() != ""]

return "".join(_b)

def hex_xor(_string, _x):

result = ""

_i = 0

while _i < len(_string) and _i < len(_x):

_a = int(_string[_i: _i + 2], 16)

_b = int(_x[_i: _i + 2], 16)

_c = hex(_a ^ _b).replace("0x", "")

_c = "0" + _c if len(_c) == 1 else _c

result += _c

_i += 2

return result

# string1 = '0F4A08CC6A35765EC0286D04833CFDEFF20E73F5'

string1 = "3000176000856006061501533003690027800375"

string2 = unsbox(arg1)

arg2 = hex_xor(string2, string1)

return arg2

def method_2():

""" 第二种方式直接python请求 """

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",

}

url = "https://xueqiu.com/today"

# 第一次请求

ses = requests.session()

res = ses.get(url, headers=headers, timeout=10)

arg1 = re.search("arg1='(.*?)'", res.text).group(1)

print(dict(ses.cookies))

ses.cookies.update({"acw_sc__v2": get_acw_sc__v2(arg1)})

# # 第二次请求

ses.get(url, headers=headers, timeout=10)

print(dict(ses.cookies))

# 第三次请求

url = "https://xueqiu.com/query/v1/status/hots.json?count=10&page=1&scope=day&type=news"

resp = ses.get(url=url, headers=headers, timeout=10)

for item in resp.json()['data'][:1]:

title = item['title']

desc = item['description']

logger.success(f"title is {title} >>>>> {desc}")

method_2()

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: