记爬虫一个网站图片,反反爬虫破解一个图片加密算法

目录

一、初遇拦路虎

二、破解加密

1、详细分析

2、分析js代码

三、转化为python爬虫代码

四、全部代码


心血来潮想玩下最近比较火的AI绘画,于是想要搞点图片丢到模型上训练

一、初遇拦路虎

随便找个外国的图片网站来爬点图片,随手f12打开、检视元素: 

突然发现图片的链接居然是jpg.txt的形式,而图片1是data:xxx的形式,再f12抓包看看,发现这个jpg返回的是很长的一串,加上末尾标志性的两个等号,判断是一个加密后的密文:

 

解密后就变成了二进制的图片编码直接可以看到

二、破解加密

初步分析判断:这个网站初始使用一个默认的图片做占位,然后在图片src中获取到http://xxx.jpg.txt的密文,然后解密后获取到图片的二进制编码,拼接上data:image/jpg;base64,的前缀替换掉src元素的值然后在页面上就能看到真实的图片了。

根据目前的分析,破解加密的关键就在获取到解密函数了。好,大清早的还给我出个难题,你越是反抗我越是兴奋

1、详细分析

 先看下前端节点元素,看下有没有可以用于分析线索的关键字

 看了下也没有什么有用的信息,就一个class的name:lazy可能有用

接下来看下前端访问过程中请求的所有js

这些js先大致过一下,其中可能有用的大概就是:

crypto-js.js

encrypt.min.js

以上两个估计是加密函数(其实我先打断点分析图片是不是使用这些加密的,后来发现不是,文中就不再赘述了)

LazyLoad.js

detail.js

以上可能是和内容显示有关的,其中LazyLoad由于和节点的class名字一致,所以是优先分析对象

2、分析js代码

 右击打开文件

贴上代码

!function(t, e, r, i) {var o = t(e);t.fn.lazyload = function(n) {var a, f = this, l = {threshold: 0,failure_limit: 0,event: "scroll",effect: "show",container: e,data_attribute: "original",skip_invisible: !0,appear: null,load: null,prefix: "prefix",placeholder: "/assets/images/default/loading/470x666.jpg",host: image_url};function d() {var e = 0;f.each((function() {var r = t(this);if (!l.skip_invisible || r.is(":visible"))if (t.abovethetop(this, l) || t.leftofbegin(this, l));else if (t.belowthefold(this, l) || t.rightoffold(this, l)) {if (++e > l.failure_limit)return !1} elser.trigger("appear"),e = 0}))}return n && (i !== n.failurelimit && (n.failure_limit = n.failurelimit,delete n.failurelimit),i !== n.effectspeed && (n.effect_speed = n.effectspeed,delete n.effectspeed),t.extend(l, n)),a = l.container === i || l.container === e ? o : t(l.container),0 === l.event.indexOf("scroll") && a.bind(l.event, (function() {return d()})),this.each((function() {var e = this, r = t(e), o = r.attr("data-" + l.prefix), n = r.attr("data-placeholder"), a = r.attr("data-" + l.data_attribute);a = o ? o + a : a;let d = r.attr("data-aes");if ((r.attr("src") === i || !1 === r.attr("src")) && r.is("img")) {let i = t(e).attr("data-loading");t(e).attr("data-no-loading") || (i ? r.attr("src", i) : n ? r.attr("src", img_host + n) : r.attr("src", img_host + l.placeholder))}r.one("appear", (function() {if (!this.loaded) {if (l.appear) {var i = f.length;l.appear.call(e, i, l)}"true" == d && a.indexOf(".txt") > -1 ? (e.loaded = !0,t.ajax({url: l.host + a,type: "get",success: function(t) {let e = desDecrypt(t);r.is("img") ? r.attr("src", e) : r.css({"background-image": "url('" + e + "') !important"})},error: function(t) {r.attr("load-status", "error")}})) : t("<img />").bind("load", (function() {var i = r.attr("data-" + l.prefix), o = r.attr("data-" + l.data_attribute);o = i ? i + o : o,o = l.host + o,r.hide(),r.is("img") ? r.attr("src", o) : r.css({"background-image": "url('" + o + "')"}),r[l.effect](l.effect_speed),e.loaded = !0;var n = t.grep(f, (function(t) {return !t.loaded}));if (f = t(n),l.load) {var a = f.length;l.load.call(e, a, l)}})).attr("src", a)}})),0 !== l.event.indexOf("scroll") && r.bind(l.event, (function() {e.loaded || r.trigger("appear")}))})),o.bind("resize", (function() {d()})),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion) && o.bind("pageshow", (function(e) {e.originalEvent && e.originalEvent.persisted && f.each((function() {t(this).trigger("appear")}))})),t(r).ready((function() {d()})),this},t.belowthefold = function(r, n) {return (n.container === i || n.container === e ? (e.innerHeight ? e.innerHeight : o.height()) + o.scrollTop() : t(n.container).offset().top + t(n.container).height()) <= t(r).offset().top - n.threshold},t.rightoffold = function(r, n) {return (n.container === i || n.container === e ? o.width() + o.scrollLeft() : t(n.container).offset().left + t(n.container).width()) <= t(r).offset().left - n.threshold},t.abovethetop = function(r, n) {return (n.container === i || n.container === e ? o.scrollTop() : t(n.container).offset().top) >= t(r).offset().top + n.threshold + t(r).height()},t.leftofbegin = function(r, n) {return (n.container === i || n.container === e ? o.scrollLeft() : t(n.container).offset().left) >= t(r).offset().left + n.threshold + t(r).width()},t.inviewport = function(e, r) {return !(t.rightoffold(e, r) || t.leftofbegin(e, r) || t.belowthefold(e, r) || t.abovethetop(e, r))},t.extend(t.expr[":"], {"below-the-fold": function(e) {return t.belowthefold(e, {threshold: 0})},"above-the-top": function(e) {return !t.belowthefold(e, {threshold: 0})},"right-of-screen": function(e) {return t.rightoffold(e, {threshold: 0})},"left-of-screen": function(e) {return !t.rightoffold(e, {threshold: 0})},"in-viewport": function(e) {return t.inviewport(e, {threshold: 0})},"above-the-fold": function(e) {return !t.belowthefold(e, {threshold: 0})},"right-of-fold": function(e) {return t.rightoffold(e, {threshold: 0})},"left-of-fold": function(e) {return !t.rightoffold(e, {threshold: 0})}})
}($ || jQuery, window, document);

分析代码发现,以下可疑对象:1、以.txt结尾;2、使用了一个desDecrypt函数;3、会对src元素进行处理:

在desDecrypt处打断点看下,果然在加载图片的时候触发了断点,输出过程中变量看看:

直接调用函数解密试试:

 应该就是这个函数了,看下这个函数内容,跳转到了另一个js文件:

三、转化为python爬虫代码

找到了目标函数后,直接丢到chatgpt转化为python代码:

 咦怎么还要密钥,打个断点,获取下:

试试:

找chatgpt问问怎么把图片保存到本地:

 大功告成,破译过程结束,接下来加到爬虫代码里就行了,再让chatgpt生成下示例代码,开20个进程下载:

四、全部代码

import requests
import multiprocessing
import re
import time
import os
import base64
from Crypto.Cipher import DES
from Crypto.Util.Padding import pad, unpad
from Crypto.Util.strxor import strxor
import logging
import base64
from PIL import Image
from io import BytesIOlogging.basicConfig(filename="request.log")def des_decrypt(data):# 解密函数key = b'jeH3O1VX'  # 密钥iv = b'nHnsU4cX'  # 初始向量cipher = DES.new(key, DES.MODE_CBC, iv)ciphertext = base64.b64decode(data)decrypted = cipher.decrypt(ciphertext)unpadded = unpad(decrypted, DES.block_size)return unpadded.decode('utf-8')# 定义一个函数,用于下载图片
def download_image(url):# 发送请求try:response = requests.get(url, timeout=10)except Exception as e:# 获取响应内容logging.error(f"[ERROR] get url [{url}] Failed! error:[{e}]")returnprint(f"[INFO] get url [{url}] Success!")try:content = des_decrypt(response.content)except Exception as e:logging.error(f"[ERROR] decrypt url content [{url}] Failed! error:[{e}]")return# 把二进制图片保存为文件download_path = rf"data\{url.split('/')[3]}_{int(time.time())}.jpg"try:# 从base64编码的字符串中提取图像数据image_data = content.split(',')[1]image_data = bytes(image_data, encoding='utf-8')image = Image.open(BytesIO(base64.b64decode(image_data)))# 保存图像image.save(download_path)except Exception as e:logging.error(f"[ERROR] save image [{url}] to [{download_path}] Failed! error:[{e}]")returnprint(f"[INFO] save image [{url}] to [{download_path}] success!")if __name__ == '__main__':with open("requests3.log") as f:l = f.readlines()# 这里的链接是直接暴力枚举的图片二进制加密数据,不需要再请求网页了url_list = [f"http://xxx/{i}.jpg" for i in range(10000)]# 启动20个进程pool = multiprocessing.Pool(processes=20)# 并行访问urlpool.map(download_image, url_list)# 关闭进程池pool.close()pool.join()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统文件删除怎么恢复,鸿蒙系统升级后会删除东西吗?鸿蒙系统游戏数据互通吗?...

鸿蒙系统无疑是这段时间最大的热点了&#xff0c;也因为太过于火爆&#xff0c;花粉俱乐部已经在维护修理了&#xff0c;不过很多小伙伴还在担忧鸿蒙系统游戏和安卓系统通用吗&#xff1f;鸿蒙系统升级后会丢失数据吗&#xff1f;下面一起来看看升级鸿蒙系统的注意事项。 鸿蒙系…

华为鸿蒙系统HarmonyOS学习之七:鸿蒙Harmony给IoT带来新的契机

华为鸿蒙系统HarmonyOS学习之七&#xff1a;鸿蒙Harmony给IoT带来新的契机 一、物联网将带来生产生活方式的变革 物联网是新一代信息技术的高度集成和综合运用&#xff0c;对产业变革和经济社会绿色、智能、可持续发展具有重要意义。 自从国家把物联网列入重点发展领域以来…

HarmonyOS系统内核中GPIO控制方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用鸿蒙系统控制开发板去点亮LED灯。 目录 第一&#xff1a;鸿蒙外设GPIO简介 第二&#xff1a;鸿蒙外设接口说明 GPIO使用流程图&#xff1a; ​编辑 第三&#xff1a;鸿蒙系统中API分析 第四&#xff1a;硬件设计…

harmonyos鸿蒙系统开发者工具 DevEco Studio详解安装

文章适合新手了解DevEco Studio开发工具。文章在编写过程中难免有疏漏和错误&#xff0c;欢迎大佬指出文章的不足之处&#xff1b;更多内容请点进&#x1f449; Lino_White &#x1f448;查看。 未来的世界充满着各式各样的数据&#xff0c;我们该怎么好好利用起来呢&#xff1…

我的HarmonyOS实战——鸿蒙系统初定义

【本文正在参与“有奖征文 | HarmonyOS征文大赛” 】活动链接 鸿蒙系统介绍 1 官方定义 鸿蒙是一个全场景&#xff0c;面向未来的操作系统。 解释&#xff1a; 鸿蒙并不是一个单纯的手机操作系统&#xff0c;而是手机智能设备的总称。可以安装在包括手机、手表、无人机等很…

我的HarmonyOS实战——鸿蒙系统开发入门学习

1.为什么要学习鸿蒙开发&#xff1f; 开发者的角度&#xff1a; 安卓操作系统连接外部设备时&#xff0c;发现&#xff0c;配对&#xff0c;连接&#xff0c;组合&#xff0c;验证每一步都不能少。连接上了之后才能调用控制第三方设备。换一个设备之后&#xff0c;所有的代码…

HarmonyOS系统中内核实现MQTT协议开发的方法

大家好&#xff0c;今天主要来聊一聊&#xff0c;如何使用鸿蒙开始实现MQTT协议开发的方法 第一&#xff1a;MQTT基本原理 在MQTT协议通讯中&#xff0c;有两个最为重要的角色。它们分别是服务端和客户端。首先我们来初步了解一下它们。 MQTT服务端 MQTT服务端通常是一台…

荣耀30能用鸿蒙系统吗,华为荣耀30 Pro开始测试使用鸿蒙OS系统!

据系统之家了解 最近荣耀30 Pro手机已经开始测试使用鸿蒙OS系统。虽然之前因为多方原因&#xff0c;华为不得已将荣耀转让出去&#xff0c;但是就目前来说两者联系还是非常的大的。 此外&#xff0c;他还透露荣耀 30 系列、V30 系列、Play4 Pro 下个月将升级到华为鸿蒙系统。 荣…

HarmonyOS系统中内核实现UART串口通信方法

大家好&#xff0c;今天主要聊一聊&#xff0c;如何使用鸿蒙系统实现UART数据的读写方法。 目录 第一&#xff1a;串口通信基本原理 第二&#xff1a;鸿蒙UART API分析 第三&#xff1a;硬件设计 第四&#xff1a;软件设计 第五&#xff1a;编译调试 第六&#xff1a…

HarmonyOS鸿蒙开发入门 :鸿蒙系统介绍

系统定位 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。 在传统的单设备系统能力基础上&#xff0c;HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c;能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备&#xff0c;提供全…

鸿蒙系统(HarmonyOS)体验怎么样

华为鸿蒙系统体验几天后&#xff0c;真的非常好用&#xff0c;首先华为比较聪明的地方&#xff0c;没有改变人们使用习惯。当然被竞争对手吐槽&#xff0c;说界面和安卓一样。这些喷子们以为华为用户都是菜鸟吗&#xff1f;里面很多都是懂手机的人&#xff0c;很多都是第一代玩…

鸿蒙系统是否可以用来做服务器,小米手机也能使用鸿蒙系统?国内厂商使用鸿蒙热情高涨...

原标题:小米手机也能使用鸿蒙系统?国内厂商使用鸿蒙热情高涨 自从6月2日HarmonyOS 2正式发布以来,国内针对鸿蒙系统的热议一直不减。对于新买的华为手机用户来说,能第一批次使用上国产的手机系统,也确实过了一把瘾。本次手机系统更新,华为采用分批次更新。 一是因为手机系…

为什么要学习鸿蒙,HarmonyOS不只是操作系统

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 前言 对于IT行业&#xff0c;头部力量或者已经形成生态的东西…

华为HarmonyOS鸿蒙系统介绍,华为鸿蒙OS系统怎么样 华为HarmonyOS鸿蒙系统介绍

华为鸿蒙OS系统怎么样?华为在8月9日的2019华为开发者大会上正式发布了华为HarmonyOS鸿蒙系统,大家知道这个系统具体是用在哪些产品上的吗?有哪些功能呢?能兼容别的系统吗?下面小编为大家带来了华为HarmonyOS鸿蒙系统介绍,一起来看看吧。 华为HarmonyOS鸿蒙系统介绍 在8月…

华为鸿蒙系统HarmonyOS学习之十:鸿蒙HarmonyOS微内核技术

华为鸿蒙系统HarmonyOS学习之十&#xff1a;鸿蒙HarmonyOS微内核技术 一、前言 把操作系统中更多的成分和功能放到更高的层次&#xff08;即用户模式&#xff09;中去运行&#xff0c;而留下一个尽量小的内核&#xff0c;用它来完成操作系统最基本的核心功能&#xff0c;称这种…

鸿蒙存储系统文件系统,鸿蒙liteWearable操作文件系统的正确姿势

10月20号我在官方论坛提了一个问题&#xff0c;请问文件存储接口的根路径是什么&#xff1f; 原因是在看官方文档学习时测试文件存储的API 作为一个有经验(一点点)的开发人员&#xff0c;把代码贴到onShow()中直接执行。最终报错301&#xff0c;文件不存在。报错了那一定是我没…

华为鸿蒙harmony操作系统 安装使用及下载地址

目录 鸿蒙harmony系统 安装方式 选择我已复制该虚拟机 登录系统 系统界面 下载地址 鸿蒙harmony系统 鸿蒙系统是华为基于Ubuntu linux发行版定制化开发的一款操作系统&#xff0c;将主要应用于Android系统的定制化开发。 已将鸿蒙系统在VMware虚拟机上成功进行了安装&a…

华为鸿蒙系统HarmonyOS学习之十四:方舟编译器

华为鸿蒙系统HarmonyOS学习之十四&#xff1a;方舟编译器 方舟编译器是华为自研的一个支持多种编程语言&#xff0c;多种芯片平台的联合编译编程平台&#xff0c;而经过方舟编译器编译适配后的APP&#xff0c;运行效率会大大提高&#xff0c;拥有更为流畅的体验&#xff0c;足以…

念一句咒语 AI 就帮我写一个应用,我人麻了...

原文链接&#xff1a;https://forum.laf.run/d/232 作为人类&#xff0c;我们时常会有自己独特的想法和脑洞大开的创意。然而&#xff0c;这些想法往往因为成本过高而无法实现&#xff0c;毕竟每个人的能力和精力都是有限的&#xff0c;尤其是对于程序员而言&#xff0c;不可能…

念一句咒语 AI 就帮我写一个应用,我人麻了…

作为人类&#xff0c;我们时常会有自己独特的想法和脑洞大开的创意。然而&#xff0c;这些想法往往因为成本过高而无法实现&#xff0c;毕竟每个人的能力和精力都是有限的&#xff0c;尤其是对于程序员而言&#xff0c;不可能擅长所有技术栈。为了实现一个想法去花费大量的精力…