目标网址
https://match.yuanrenxue.com/match/4
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据
逆向题目
采集这5页的全部数字,计算加和并提交结果
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_03猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据


开始分析 
打开chrome浏览器 打开开发者工具后,清除缓存,然后刷新页面

在network面板中,可以看到 返回数据的api

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_06猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

并且在返回这个的api中 也可以发现一个问题就是 没有直接返回页面中的值

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_09猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 

info 返回的是 HTML 的字符串 

iv: "smohe"
key: "qfnuidgsej"
value: "kK1dv0l2iu"

返回的是 一些随机字符串   每次刷新 都不一样
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

然后在 network往下 拉信息的时候,发现了这个
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_v8_13猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

对应的是 数字的 base64 编码后的 图片

那么在这里 我们可以想到的是 哦 网页中的数字都是一张张的图片组合起来的

那么在这里我们可以有一个想法 就是做映射关联

在python中 建立一个 字典 key的值为 图片的base64编码 value的值就是对应的数字

然后做判断即可
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 


我们首先可以从 返回的数据api下手看一下  具体的请求获取的是哪些 数据 

哪些数据是有用的 哪些数据是迷惑人的 
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_v8_17猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

在 api请求数据的  堆栈信息  请求点里面 跟进去看一下

进去 进行格式化 后,可以看到 是一个ajax的请求
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_20猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 

代码也没有加密,可以很清楚的看到一些数据是代表什么意思的

我大概给大家解释一下 这些代码的含义

我们可以看到的是 success 中

data 就是 这个api 发送回来的包 其中

================================

datas = data.info  就是 返回的 info值 赋值给了 datas

$('.number').text('').append(datas);  

就是在网页元素的class 名称为number 把这个datas 添加进去

这个就是数字图片的返回数据

================================

var j_key = '.' + hex_md5(btoa(data.key + data.value).replace(/=/g, ''));

定义了以一个 j_key的变量 把 data中的key 和value 先进行拼接

然后进行base64的编码 再把这个编码里面的等于号 进行制空 

最后进行了一个hex_md5的加密 在进行到字符串

================================

 $(j_key).css('display', 'none');

把包含这个class名称为 MD5值的j_key  的CSS 进行修改

添加以一个属性为 display:none 的展示效果

其实就是 不展示

 ================================

 $('.img_number').removeClass().addClass('img_number')

把 class 名称为img_number的 删除掉

并且重新添加一个叫做 img_number 的class


猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

在这里我们可以看到很多关于前端操作的一些代码,毕竟这道题目是css加密

所以我们可以在elements的面板中看看有没有什么新的发现
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_f5_24猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

可以看到 每一个 <td></td>标签 包裹的就是 一组数字

并且 其顺序都还是不一样的  而且显示的数量也是不一样
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_3c_27猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

 

当然我们也可以看到 style的样式 直接明了的看到了 

不显示的数字图片 style里面都是有  display:none 的

也就是不展出

并且可以看到  left的属性值 也是不一样的



越靠近左边的  其数值就越小 有的甚至是负数

也就是说 越小越排名在前,如果是0的情况就根据展示顺序排序

那么在这里我们就可以通过数值的大小 来判别数字的排序问题了
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

脚本编写逻辑
开始的话,我们可以先建立一个字典,字典的key值为图片的base64的编码值,value就是对应的数字

====================================

然后 做 api的请求 获取 data.info 的值 也就是 返回的一大串的字符串

我们可以通过正则去匹配出每页的十组图片数据

可以建立一个list 列表 来存放这个数据


====================================

然后我们获取 data.key 和 data.value 的值 然后进行 base64的编码 判断 编码是否有=号

如果存在就替换为空,在进行一次md5的加密  这个MD5比较好扣 

通过测试 网页中的MD5的加密 是普通的MD5加密,没有进行魔改 

自己可以通过一些第三方库 直接使用

====================================

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_3c_31猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_32

 

通过格式化 info的数据 我们是可以看到 每条图片数据中都有 一个MD5值产生

那么我们就可以通过 查找判断的方式 获取到不一样的MD5值的图片的数据

因为之前我们分析过知道 如果图片的MD5值 如果和 j_key 的 值一样的话

就会添加 display:none的属性 也就是不展出 我们获取不一样的MD5知道数据即可
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据
然后把 获取到的展示图片的数据  重新存放到一个列表里面

这个时候 就需要进行 style left 的数值大小的判断了

数值越小 排名越前  如果都是0的情况那么就按照顺序排

这个时候还是需要通过正则的方式去提取 style left的值

获取到后 进行排序

=========================================

排序好后,然后通过最初的图片映射 吧之前对应的图片编码值 和 数字对应来进行获取

最后进行相加即可
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据
脚本参考
# coding:utf-8
# @Author : Steven
# @QQ : 2621228281
# @Email : 2621228281@qq.com

import requests
import base64
import re
import hashlib

num_dict = {
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAMTSURBVEhLrZY/TBNRHMe/bY82LeGA0Dp4NTGYqO1gdKEMwmQcGh38M5CQlGDSwWiMAwwYg2iCJsZJQ9CJ0ETsQMJgwuagLIUFXIAFXNoYcqDloLRXrq3v7v3aXktbSPCTXO77fZRvf/feu9+r5dz5iwX8R+oESigMPka6/wb2vSJUBx+1QoVD3kTz7DScb+f4YBVHA6U+ZKLPsON1IE9DtbDLP9AxEIawRgOEle4cKYSD+ZeQq8IcKquMXTbyOllPL7aiEWgSDRCmQAnahyHsiGQZruUvkIKXcObyFeM62zcOd1ylvwJ5MYDkuxA5Tjlw8A2S12iyGM7YODrujsFqfqTFCJw9L+CWyTPS3QPIBMgwKFBC9n4AaW4AdQVtQxEy1czBObkIJznAi9TDO6SLgVIYqt9QBq5YFEKCTC2momg2VXngD5bmnAc+uIqUIXQUOL/X3hJl5mHfUEgzPJ04pMUxAnN+CYeG1UlAmCLZANtqAk2kARG5m1zxQI9paWUZAsmGsArLnxOh0ZSxwCBypjwo2zQPxzCTgJ2kTtbbZ9zZ/7pRKO8WOOWqrX9iePyJiqnNGgTTuhRhgT5o5kc+JaeosDYssHbpx+OtXEziSIWqx0fqOFpg7ns2Zd24s8B1WE0V5h2mJW/ELTc0kjo2Zcm4s8ClikCIlR+si59tZpL66yosc2U8clM8bhgDkfVFUzuqR569rqXOqG7CPsOlEWiJJSraUaa/i3Q9upC94CHNCtr4WXoN+aJMzcFlakd73eGG5wnuhZHykmZ1tnx9TboYqDfNWLxoWDvqhfK+h0w1Pcg87cUBOavMmu1HMoxShuXJNNpNi7N3ewLJTyEUzIdQIIT0wgQ7EcmzxWifZMcEOZ3KY3Qwgp3RQOnbOfqJx5XGtlSOS4aK1tlHEIcXyHNsrW0dY6SBFX0ufShc70S21OwE5AR+lb+ZVfb5OVpGviGTTkHeSmBfScJqtdX55SAFoY0OsMXxISM6SvvNrshwrS7A9WoENupyv+O/oGm831sslno/RU6OsvsHu3+3yQH/AOyW6SvqnweCAAAAAElFTkSuQmCC':0,
    'iVBORw0KGgoAAAANSUhEUgAAABUAAAAcCAYAAACOGPReAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAD0SURBVEhLY5RVUPvPQGXABKUJAA2GvzP3Mry6f5PhzfI4qBhuQNjQqD6Gzxc3Mjxzk2H4CRUiBHAYKs3wP7Gd4evhSwzPWr0ZPvBBhYkEqIaaBzL8nrmS4f3FfQzP6oIY3smwM/yFSpECkAyNY/g2q4PhhZsBwxegy/5BRZlfP2HgIdbfUIAnTD8xCGyuZ5AyW8jATqmhzD9fMwjumsUgbWPKwJu3AipKGkAydC8DZ24sg5SGDQNPei8D01OoMBkAydCnDIyHTkHZlAE8YUo+GDWU+mAEGfq46RCUhQAUGypbZwdlIcBoRFEfjBpKfUADQxkYAKYHOb9g+7HMAAAAAElFTkSuQmCC':1,
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAKCSURBVEhLrZZLaBNRFIb/PDp5SFMxjqVOAjYLNUGUbhI3cdEGwaAgbmopWFIQBEUwFhQVldIqCuqilLoymEVVlCqWuNdVXRk31Y1uTKAQMRI0ycQk453JaWaSJjYPPxjmnJPwcefOuSfROXftlvAfaSAUIIXOITfuR9bBQzQBZfqEEzPgVuPY8uIeuMXPVK2lVnjoCrKzJ5F2mKqSZpi/xGCfCEOfpAKhCkPz+HEpgN9sRVpMoqjcJZMJBSVS0Wfeoz94CkaNVE93wOOqygyZr9i+cBnOwT3YsXe/cvUPDsMxHcPWTOU7MmWbD+m5i5RVUIUKGfQt38DOA0dgufuSauskoYuE0RuchV0jzQ8FIAqUMFShmIB9+jhs559SoQnJKKwLcZgpBVwoTFLIUIXXTsMaqdvhZjz8qBECRYeXog2P3CoJts8UMko2F0UdC90o2ihkcAl1mzoTnnGh0kwyGRhXKWR0IBRQOOZGnjL57RsjFDLaF87MI+1Ru9+ysgSOYpn2hKEovo+71RMjfoJtKkpJhRaFAsozr5C67kOOKvLe2e+cBVfXaZsLhSD+LD3DGluZum8p5RA06tt/C4/exK83D7A2xKNEJT07UfzV0aaHoImQHnFuDGlNv8kja2BkBObF5ieqgdDf8BG3PboAPrBx/tVTN7H9KMTuI+WxVQesIRUHPzWKnndU2ATNCgUUn9TKrB8eY8DbukxGFYZu4+dBVWZZYXPvxC3oKG8VEnqRn1R7rCfBfi/Gahu2VSpC3wRyDiViiOhdDre9snUqwsOCZnqkYHhLYSfIb9n5+psESerq6nvOPMylrLDEa7q3C7L7hrVt0z1Fu9Dor0g3AH8BJlTqZkAngxQAAAAASUVORK5CYII=':2,
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAALaSURBVEhLrZVPSBRRHMe/O+rOuuaUyRoyBlGQfw5lh9xTekg8qIdMKSsQFKRAD0WUROhBCIlSBD1YQsJKQSB1iRa8VRf1Up4UQiNcRVw1nXVdx3V3euP+ZnZmR9EVP/CY3/vx5sPMe+/3nu3suYsKjhGrUCxB5GErNssKERIEyDzlIYOX/MgY+4r0zm5w85ROwCRU2j1Yu+fGhi7ZG072Iau3Bc6BacrE4ejJ6EKgySyzy+yrdptpIKJ8HlbahrHZKFImjnEcIeHU6FuIlfk4U3AJObstH2L9C7hmJKTQKEBg0h7sUE/DJLT5x5FbeRWZ99kcTVFSY9wDR/kN5Pxkn6vBFyPUTjFhEPYjs6YBqYkiE/NIfTeODOqpyEUNFMUwCNmy7bNyJr5M787pfuwxhwfhh+1YhWIxtgWKGXafh6IYSQuVjssIUgxMwdFLIZGc8IEHKxV5iFL3xGg37AnzfnAtu68jUlYFueIa1i4IiFDaOfYa2XcGqRfHKnzlxVzdeepYSZVmkfXyERwfrGWnktQvc7If6T62yrxhVRKwCvX6jTet3KK8C4EiN5Y6hrEw6YV811rLhzwPRSi19dhqqmFCFzvINPzI7rwN51B8ZQ4pNNA4iNW2UgTpVOL835Fb0qz/atL7EEPNyPrm01+MutwIPaUOI3khw9Y5aTggeISu1FN8RCHm5YQX7fQ8qlDk9WpR4eRlinQhW37rDtgXpc1Yz2xrsYtLg4StCHz+iHD1IazVPQgY6hnSLzgGKGbov6y4irHY58W/T13YKS2grIHCGoTfeLHcV4V1w9V6+v0zwz2j78MuSH9uYp2SKhwbnKbvYB5hJjHOmyo7OdIC4ckP6segL5wAb7rR1Jd5dslrzSxLYQeE6/ktXbYVCmJp0YfghpRQKbWPsVVXjs0iEWGBxzalVXhZQtrMFJwj/eCHJigbY2FuFpFI7EJNvvT2wPf3NxRF1QD/AbAv8WdRHzjKAAAAAElFTkSuQmCC':3,
    'iVBORw0KGgoAAAANSUhEUgAAABUAAAAbCAYAAACTHcTmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHHSURBVEhLrZW9LwNhHMe/WrT10mrKVE2EROIfUAuTTQxMLISBQSxeIjQSTZRIsYgYhYVRIrWzaCxiMjFVoqjWaatPaR9Pe09bbfT6XHKf5Mn9vne9T+55fs/1qhxtnRRqWD1DcLILSR5Nfg+aR495ktHxoyBDiA8WhOVQJaXeKUgtPCggLrXPs6dsxzePSghLU9sjiBh4qICYtG8fUo8Z6UxNXlEvZc+WRUDaC+LpR5SnhssLGHldjopS6l1BpFWuda9XsEwH5KCAstS5iU/WHHkLSbAerAmtl8JvupH0DOCDN8d4e4q6wyc5VKCslHrdCHdwI7mHZXZHrgX4X9r3d9oElvMN1Io9ZJZ/pL1IeIbz06598KFx8UYOgpRI7fg52UWIdzszbev4Mqp4FKVYOrGJSG6Ts27btmZUTTtHQcrWUVpy4otHk39PuNulyFL7GOJ7hXWsCfhgK/mPVAOTstfwaAEhMz9DHmF1zalexyIcbj81UUqh0TBdr9OS7muDDoRAz4ZBxajmN2dggqJrepKE+g8fWFPvXPkeaPDhE0MzaeIrhpfnAGJRSTvp+1sQJBFHOBTUTppOp7LHzM7STGpusvEK+AUL4d3X/AgqvQAAAABJRU5ErkJggg==':4,
    'iVBORw0KGgoAAAANSUhEUgAAABUAAAAcCAYAAACOGPReAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAIxSURBVEhLrZU/aBNRHMe/bWKexnoiaSg0FSSCaAfFwT+L7dKloUs7OqRVcHBwcZOCiCAOhk4dxAwdHFRwEEoRSjvoZNqhdDE4tC7aIYmWvOiV1941vnf51dy7S0ou6Qfu+P5+B9/7/e7e+72us+cuVHHE+EzF0jcUzlPQCjyH/itphChUdKub+bcCXv4tVQr7hsp0hmNqWXsob5ek6kWVqUxneNpPw1yfxi+nWo7Y02uIzjkPAuFUWucSrKNqvzEcoUWSAdFNbyewSxJK/SQZEN1U+0kCXaSCopvGGfZJgsv2SQbFY2rI+jqn+Y/ipbYr1dap/WYVWzfra0q98f/nkDDBcWwjj+j7WbC5Fcr6aV6pxG2oEMzAn8EbKDx+ja31jxBytTRCM7WNepVhIWRl6qKEB9tIovDsA8w7fuPWR9/QPezenQAfTmKHUg5iE32To4jkKJYc2r7G5ywiU6PoTWUQK7rKZ0lU7o9TUKN10wPyWUQfLOA0hQrz6jhs0orgporcI0TXXNUacVgkFe2ZSsI/iqT8tG162DBv23RvYICURG4K3xkVmKEZmIOkJWqXhUkrgpsm0tjJjKBCoRqRp+afkK7hMr2I6tgt0g1IXIf94h22l6dRkiPygMjXtzj5kgLCtaOeg3+fQNnR/u1pMaatRUVkYwHxyYfo9pwQTdpncnjol24o0PMpg74Rv6HCZbqC41/y6OG1QeKdpSGZO1HcRGz+FRKpyzgzlaUnXoB/3J2gmVZucHAAAAAASUVORK5CYII=':5,
    'iVBORw0KGgoAAAANSUhEUgAAABUAAAAdCAYAAABFRCf7AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAANLSURBVEhLrZZNSFRRFMf/48e8UZtRktFkRsiEdCIKVwaikrlJbZG0MEGDwEWUIPaBQoiIZIJGG4mikoyyIBJKW4gbs4W66WOhtlAXzixq/HzGjG/8eN0378yb+5w3qdAPLnPOmXf/nHfvOfc+U+bR4zL+M/sTrW6F71Ih/CfskAQB2xQ2SyLMU5OwPr+HuEEPRfcSddXB96QeK04BOxQyZg7pWedhJi+GfiOp7sHqwC0s7RKMkyQIwaGfzGdmLFrUAbGlFOsC+ZBwaLwfjqoSZOSeQlpw5MBR1oQjw3NIoKdCGLz+Rfgn72PRTq7khr2tFpbX4TWLwJULTM+QY5Cp/PgGlkOCEJHauYegAieosEuUbUyxU1tDy9c3SOzdQ9AAvWh7ObeOblg7u8k+GJyoA4E8FzbJi5mdhGWCnAPCiVZhM5tMRuLsAFkHJyxakcu6hWy2QcL4pGpW3IR/6AsWZ35iYV4dnvkfWBp7C/+dMvWZ3SglFRzPpuR4WZYRHAtyWsFZ2fFhVha0mPEQFkbljALSoBHO1G7V1hMIQG54Cu+FY6zsVcyhTiI/hOQswq9PfdhyUIChiW7bbWQpOLDOBANMMknppLIcpIc6KasEzrYhJIv0KGPHlo/VrlrydBvFI2CDNXfyu+s4fLkVMdMUDuKBqbcRtvr3SA69BsN/phIByjaKKPvDPQLr7THyDPjcDOuwmxNwYaNBtaKKWse7YSI7GqbO70giWyHgVJdAE431covESipuah/t6fkGMzdNsruCv+FMveuIJzMavpMlEItryIskdGaERYc9XLnYsO0kk2Mr1YG1c3XkRZLgVXc0LDoxAYF7lY28yMm20ZfIbCkij5GfD4mrxFhRPQK5jepjR52XbEW0XCuRaOxcO40/ZLP1g+Wj2tqcKHMesZuRbKVEVl506O4eHRU9WCvWTnPEz47BMqjaOlFMNLJSErVgILsSiyMPsJ3Pp5yLnfY+LHeVclm6kdLWrJWgwR1VCGmkB7+z9V2u9H5wErv3uUZiiEh5xZK5G24UfaZBxiBcaUL6lIhYiigEFLFdgjHsUkztrNEJKvz7Y6K6A76rhfA5lS+TUB1KrHQ8SBztR8LDPpgMemR/nz0HAvgL80YzEyuMQpQAAAAASUVORK5CYII=':6,
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHhSURBVEhLrZY9LANhGMf/PprDVQkxyFXSVCKIwYStiZoqhoqEhTCQWCwiBBEDiUTMBpOJhKQDkw1L1YDFxoSlBi2tlurrrn2uH9xX2/sll/6f4X557n3e903LWhxtDCZSTr/mIXXY4thgjSHGwEp76o7amOkdmih8BHcMlDAULz4DW3htSlf8+RIaJn3Fd8i2ZxAiGeK3sK34UrE4oTCP6JAT31TWneyg8jmdixKyNQ/eOCqCF7AuBKgoRigs48NlR5LK+rP1PEnBwuRmfnf8Kn0rUZhQWEfEJU/if3cSBQmTmwN4o6zUnYRxobh2kb5sd7X+PcWXDQvZohthee3EfWedy042F4PCCXzmTLbGf4hKyn8xJtwYRthGGU/gd9OnQgkDwh7EXB2ZU2G5v0TVFRUK6At7xxCzUxbhb/YoKaMrTM724J2yNIxqha2Si47Qi1hndqtw9wHFYUS7+hF2jaeytnDKi2jGFwfv36GcT6JRQMg9ncqaF+zPwTVe+mi84uc2t4+qbhcZjQ49+GrN7BVYHu50ZRLqwt5BxLLLh6qHfUraqAtHnIhSFG8CcGfa05VRFSZahcxRQ/wZllPKOqgIPfi2yzeBSPAVFRT1UBF2I5GzflzwEWWU9TD5zxLwC1sVsHrJiVs0AAAAAElFTkSuQmCC':7,
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAYAAACqhkzFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAANtSURBVEhLrZXfS1NhGMe/rumZbR4nOcO2IA1CvQi8UW8y8EJqZCR1IQiKwvRCuiqTfomtkkrqIpN+EFSGNaFECL0IbzQvnH/A6EavNiinJVubO/5a73nPs51zNqf04wPjfJ8X9uV5n/d93ifr8JFjcfxHMhueuYS1dieiFTZIgoAtvihBCAVhnptErvshDAG+qGMHwzJsvh7Cj5MO9vfMGCQ/Ckb6sP/2F1pRMNCXsGPz/Vt8TzEzSiwz/qMFxrbgwEr7I0Tb7LSioDe8OYSVGhHbFOYEZ1DcVIfisuMo4r86ONxTyEsai1jpGcK6xlNj6MRaQznWKTL4p1BU5YLRqy1UAFmvumDtGEN+wlQoR7SnigKd4Qls2EiyDVs/dSGLojRmrsIyF6QAiFQ0ktIaslokspMzMT4gmQFDMEyK1ZO+MqqhL4x9JFn1EK8m+Yeohl4vu2Ok4UCsWa1LOmw3FaWkAbNfvTqaGg4jd86fXAjX34JUS0EK8YGX+FlBARZhfjpJWmfIbnlnHwoX6PiEUiy9mEVkwIV4ubKEWheksVksXSilekvI/9APwcsDTnqn2JsQ81zDikPQFTsdCXmf+2Ht9FCsoMuQE/DAdHkQBeqt2BHz9CDy3XozmZQM7dh+Pozlen3rGViUzRa22COxSWsycj8fcLfA9E69/JoM5T4exTeNWe7CBA6x1rOXKK1XXCK33gSsdBvkfg7eHdX1s5phG8ustxprPJCL3QWxW/+SJLE7Ib25h6WjghKHvCh2tsDIEqUMqxBrT5ixa+3zZDaTCUxCaPXAmtiKWI1f1M+KYXUr1hxcMSRYpvtJ70KgH7k+tdLhGhe/FYphvV1zCHv3cQLjguYlsjn4gSmGooANLv4N+TAUw2AIVF5GIbbaSO7BlqOQFEMK8cdFMRxZhIkLGRGRBhfp3XAhVimSZkbBgMYw8AQmH1ecWGVH2qzQEo3kYfVUGKvqtpA35+EPsmLIDiLn/hQsSsBgs6J3HKHHLYin+p5n47XtLMLP3MleN7DZY+me51rXevE741huLkeM4gQ5bOIp40BgM5qLJAZpEYUdpyHMUKx8FLJunIPtutpaCdZZD8vDPtXM5J/BwUbVTGaHQS9Thu0rF9kUrELEJmKDGSW2J7DTzPbNwzIyiOyPX2lVJYPh3wL8BvLZG6cpuRANAAAAAElFTkSuQmCC':8,
    'iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAMzSURBVEhLpZZPSBRhGMYfV9dpdV3UHDVXIw1KDUwJVy/VLTAVWugQRJqUpxAkFyuMIBMPWRGYiCGGC7J0KCRKL13Si9pBvKiH9NIYoavgqKvjujt9M/OuM+uustUPvpn3edl9eL/3+7Mbl3fqjIxoFDnhb76Bzcoi7No47FI6QRJxbHYKKQOdSPi8RFmdKIZ2BDt6sHazCNuUiY4E67cXSLvtJq1hojdhx57nPX4fMDOxL3OSMiihwmHzchu8njrSGmGGclc/Vit5BEibxEXw7bdgzy9BZqEyziLP5UH6Cn2AsV3ZBF+DnVTYlBuxNe/CGqcpSHPIdl6DeY60EXsdfCNtWLVp0rQyhhOORrU6vcKOamyEzNgUU4fuRTdTWHIj6fUkLCSDfCl2GrR433CvuAB+ipXqLM8iVzCMd29gFSiGDb4rWi/J0IE9fr88QFhEAoWHMwWzIFLMeplbAaV3ZFiIIPXjb4gXvBQx+Ax1MfUeGuEM1cYKZzMauhFv2Arg2X6k8CgCuRkUKaQgWGOo0CwYHLlS+LocJA7B3oKdMmOfOMi8wdDUy84nxQrrtU8h1egbNpyLkAbr9T1rQO/h5EtYJ0Q9wRVguXsYG30tCFwq1HJ2B4KtPdiY6cfyac3NrD4VJMQpk1ROij7uyJk/dmTIcgxjXT7+aUK27OsFOZN56BWqjIOrf4isWRHxlImOiLSh+0iaJqnCKmTPA4aMpREkVpcjx/UWGdOLSBZDNw0booC0iY/IuVoO6+NxoJjXbyVRK+LwCzYGAp7v+FWprbR5dhDZ1Z1RKowZB/y5+rbhhK/qO2bD/FMncb7kHClGRT07vxRDgGVgSo1iNrTZUnChrIQUm26zA5sUm4QZcJNa/G89bHDD+6SCFkRCem8Vkp9r1114hfbDToaBmlcQH4TMgMSFL0giM4Vww2Z2AqaGsd3qpIQB5We1bxTe7mqsh46ctIjU9kfq/gsRPuWuUfy8XkCCrRzbexTBz0yCpBRMzCzDdRfcgd/mIxdFYveiNsLNOGEMWc6qCDOFA4vCbu7WJmzXOrDF21SjEBz7x2Bm/xisQ90wf5inbCT/dVIiAf4ApbEnkB6qHqsAAAAASUVORK5CYII=':9,
}


#api请求数据
def get_data(page):
    url = 'https://match.yuanrenxue.com/api/match/4?page={page}'.format(page=page)
    headers = {
        'accept': 'application/json, text/javascript, */*; q=0.01',
        'accept-encoding': 'gzip, deflate, br',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cache-control': 'no-cache',
        'cookie': 'Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1633332370,1633337457,1633440312; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1633458394',
        'pragma': 'no-cache',
        'referer': 'https://match.yuanrenxue.com/match/4',
        'sec-ch-ua': '"Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'sec-fetch-dest': 'empty',
        'sec-fetch-mode': 'cors',
        'sec-fetch-site': 'same-origin',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.10 Safari/537.36',
        'x-requested-with': 'XMLHttpRequest'
    }
    if page == 4 or page == 5:
        headers['user-agent'] = 'yuanrenxue.project'
    response = requests.get(url,headers=headers,verify=False)
    data = response.json()
    return data

#INFO数据处理
def get_all_img_lists(data):
    all_img_lists = []
    img_data = re.findall(r'<td>(.*?)</td>',data['info'])
    for i in img_data:
        all_img_lists.append(i)   
    return all_img_lists

def get_md5(data):
    key = data['key']
    value = data['value']
    str_btyle = key+value
    str_btyle = str_btyle.encode('utf-8')
    j_key = str(base64.b64encode(str_btyle),encoding='utf-8').replace('=','')
    j_md5 = hashlib.md5(j_key.encode(encoding='utf-8')).hexdigest()
    print(j_md5)
    return j_md5

#获取展示图片数据
def get_show_img_lists(all_img_lists,img_number):
    update_img_lists = []
    #遍历每一组图片数据
    for img_list in all_img_lists:
        #存放展示图片的数据
        img_number_lists = []
        img_data = re.findall(r'<img(.*?)">',img_list)
        for data in img_data:
            if img_number not in data:
                img_number_lists.append(data)
        update_img_lists.append(img_number_lists)
    return update_img_lists

#图片数据排序处理 和 图片编码和数字映射
def img_data_sort(show_img_data):
    for img_data in show_img_data:
        num_list = []
        for data in img_data:
            size = float(re.findall(r'style="left:(.*?)px',data)[0])
            img_num_data = re.findall(r'data:image/png;base64,(.*?)" class=',data)[0]
            img_num = get_img_num(img_num_data)
            new_tuple = (size,img_num)
            num_list.append(new_tuple)
        print('==============================')
        print(num_list)
        # 排序
        num_list = sorted(num_list,key=lambda x:x[0])
        print(num_list)
        print('==============================')
        #数字拼接
        real_num_list = []
        for num in num_list:
            num = num[1]
            real_num_list.append(str(num))
        num = ''.join(real_num_list)
        print('拼接好的数字:',num)
        print('==============================')

        num_sum_lists.append(int(num))
    print(num_sum_lists)

#图片编码映射数字
def get_img_num(img_num_data):
    for key,value in num_dict.items():
        if  img_num_data == key.strip():
            # print('数字:',value)
            return value


if __name__ == '__main__':
    num_sum_lists = []
    for i in range(1,6):
        data = get_data(i)
        all_img_lists = get_all_img_lists(data)
        j_key = get_md5(data)
        show_img_data = get_show_img_lists(all_img_lists,j_key)
        img_data_sort(show_img_data)

    #计算所有页数的和
    num_sum = sum(num_sum_lists)
    print('所有数字的和为:',num_sum)
    print('==============================')
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_d3_36猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据

其实这个题目整体来说并不难,难的是编写脚本的时候需要注意的一些细节点

自己也是一个脚本菜鸟,一看这个脚本只有100多行的代码

但是自己在写的之前 足足在纸上写了满满的5页纸

就是为了把这个整体的思路  和 编写的流程给捋通

搞懂了流程 才可以相对比较顺畅的写下去

====================================================

还有每个人的对python语言的了解 有多有少的

可能python对于一些列表排序 或者 一些爬虫思路上面

有更佳优化 有更加简单的代码可以书写

但是我还是愿意 用最基础的方式 这个可能导致有些代码的多余

但是整体阅读起来的通顺性比较良好  

=====================================================

写这个脚本 其实 我花了比之前的题目更佳多的时间

也足够表明 自己在前端知识领域 和 python的基础知识的薄弱
猿人学第四题:雪碧图、样式干扰【Post/Js逆向笔记】_数据