全国社会组织信用信息公式平台(试运行)爬虫记录

本文详细记录了如何通过爬虫技术抓取全国社会组织信用信息平台的验证码,包括识别并解码滑块验证码的base64参数、理解rsa加密机制,以及计算移动距离的过程。关键步骤包括base64编码、rsa加密和验证码图片处理。
摘要由CSDN通过智能技术生成

全国社会组织信用信息公式平台(试运行)爬虫记录

1. 列表页面请求解析

在这里插入图片描述

输入关键词搜索 会出现滑块验证码

在这里插入图片描述

验证码过了之后,这个请求就是最后的数据请求

有abc三个参数需要关注

1.1获取验证码

请求很简单 返回两个图片base64数据(背景图片,和滑块图片)和ab两个参数

在这里插入图片描述

1.2校验验证码

在这里插入图片描述

请求中带有abc三个参数,初步断定和获取验证码中返回的3个数据有所关联

对比a参数看看:

获取验证码中返回的a参数:

Y1UwZfTHwuyTJ/g5lyfiAUgc+P1BC7ANC79B67oUlTL2OxMALtr50gIqqB2EIaf6tNnHm/aEfJoNNTkUitvU1e8toJCjNI7pQ3mn5o0xYNTZvvTUVKOW6b8qCjQUxmqSQhYc20oJCY6AyMw/mKh83Lede9cVsPL0jPBfY4891Z0=

校验验证码中请求携带的a参数

WxUTDJPeE1BTHRyNTBnSXFxQjJFSWFmNnRObkhtL2FFZkpvTk5Ua1VpdHZVMWU4dG9KQ2pOSTdwUTNtbjVvMHhZTlRadnZUVVZLT1c2YjhxQ2pRVXhtcVNRaFljMjBvSkNZNkF5TXcvbUtoODNMZWRlOWNWc1BMMGpQQmZZNDg5MVowPQ==

对比发现不一样,应该是处理过的参数,这种格式的参数很像base64格式,去编码试一下

在这里插入图片描述

得出结论:
获取验证码中返回的数据a,b经过base64编码后,在后面的请求中作为参数使用

最复杂的c参数来了

c参数可以发现也是一段base64编码格式的数据,要弄清楚他是对什么数据进行了base64编码,要去查看其js代码,看他发送校验验证码时做了哪些操作
在这里插入图片描述

观察这个请求经过了哪些js代码点进去,

由于不知道在哪一步对参数做了处理,每一个都点进去看一下
在这里插入图片描述

在这里插入图片描述

最终找到了他处理abc3个参数的地方
a和b都是简单base64编码了一下
c也是base64编码了一下i这个参数
往上看i = this.$getRsaCode(parseInt(this.moveX) + “”)这段代码
this.moveX可以猜测为滑块验证码移动的距离

在这里插入图片描述

点进去getRsaCode这个方法(这里要打断点调试点进去),就方法名来看可以猜测对移动距离做了rsa加密

在这里插入图片描述

可以看出他对移动距离做了rsa加密处理,公钥就是这串字符串

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCsYUGHMhjSzdMqn9JzPfKs9JbxXTPtHofTv7reV0HrEz4brnE6ZJpNn5s934KO3L4QDF7ELHysIiounhhpF1bewW9jKdcpZA5M1CkGHKcwpLA2liaqOlt/0Mf3ui9jxR9AHxUMFVGfJ6Q4+cEmDBUAEOXlxqk4ZjGpubwGNk9XQIDAQAB

得出结论:

c参数是由移动距离进行rsa加密后再base64编码后形成的参数

难点:拿到移动距离

去网上查了很多办法,大致分为两类

  1. 获取滑块验证码的时候返回3张图片,带缺口的背景图,完好的背景图,滑块

  2. 获取滑块验证码的时候返回2张图片,带缺口的背景图,滑块

该项目中属于第2种

先把两张图片保存下来,再获取移动距离(img1和img2就是获取验证码返回的数据c参数里面的base64字符串)

在这里插入图片描述

with open('a1.png', 'wb') as f:
    f.write(base64.b64decode(img1))
with open('a2.png', 'wb') as f:
    f.write(base64.b64decode(img2))
x = get_distance('a1.png', 'a2.png')

获取滑块验证码移动距离这个方法参考了别人的文章,

注释掉abs(255 - block) 这段代码后,才能正确获取到移动距离,否则需要运行两遍这个方法才能获取到正确的移动距离,具体原因不清楚,只有初步猜测,详情看https://blog.csdn.net/Tracy_LeBron/article/details/84567419

**

import cv2
import numpy as np

def get_distance(img1, img2):
    """获取滑块验证码要移动的距离"""
    block = cv2.imread(img2, 0)
    # 获取 滑块的宽和高
    w, h = block.shape[::-1]
    template = cv2.imread(img1, 0)
    cv2.imwrite(img1, template)
    cv2.imwrite(img2, block)
    block = cv2.imread(img2)
    block = cv2.cvtColor(block, cv2.COLOR_BGR2GRAY)
    # print(block)
    # block = abs(255 - block)
    # print(block)
    cv2.imwrite(img2, block)
    block = cv2.imread(img2)
    template = cv2.imread(img1)
    result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED)
    x, y = np.unravel_index(result.argmax(),result.shape)
    print(w, h)
    cv2.rectangle(template, (y, x), (y + w, x + h), (7, 249, 151), 1)
    print('x坐标为:%d' % (y))
    cv2.imshow('Show', template)

    cv2.waitKey(0)
    return y

在这里插入图片描述

img1是背景图片,img2是滑块图片。

获取到移动距离后对移动距离进行rsa加密

import rsa
import base64

# rsa加密

def rsaEncrypt(content):
    pubkey = """
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCsYUGHMhjSzdMqn9JzPfKs9JbxXTPtHofTv7reV0HrEz4brnE6ZJpNn5s934KO3L4QDF7ELHysIiounhhpF1bewW9jKdcpZA5M1CkGHKcwpLA2liaqOlt/0Mf3ui9jxR9AHxUMFVGfJ6Q4+cEmDBUAEOXlxqk4ZjGpubwGNk9XQIDAQAB
    -----END PUBLIC KEY-----
    """
    pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(pubkey.encode())

    crypto = rsa.encrypt(content.encode(), pubkey)
    s = base64.b64encode(crypto)
    return base64.b64encode(s).decode()

if __name__ == '__main__':

    print(rsaEncrypt('170'))

就此,获取到c参数

2.3获取列表数据

在这里插入图片描述

abc三个参数都获取到了,直接发送请求就完成了,

注意:所有请求都有校验Referer参数,请务必带上,参数失效有时间限制,具体多久未测试,失效了,再次校验验证码重新获取abc参数即可。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值