zl程序教程

您现在的位置是:首页 >  Javascript

当前栏目

js逆向-猿人学(7-8)动态字体-图文点选

2023-03-15 22:04:27 时间

猿人学爬虫比赛第七题:《动态字体,随风漂移》

地址: http://match.yuanrenxue.com/match/7


召唤师名字是在html 的 script 标签中,字体是从接口中返回。

先请求match/7,然后请求 api/match/7

api/match/7返回的json数据,里面data数组有10个字体(胜点) 和 woff文件的地址。

这种动态字体现在已经有固定的处理方式了,用 python处理字体的库 fontTools。

先保存一份woff字体,查看一下内容。

# -*- coding: utf-8 -*-
# @Author  : lx

import base64
import requests
headers = {
    'User-Agent': 'yuanrenxue.project',
}

data =requests.get(f'http://match.yuanrenxue.com/api/match/7',headers=headers).json()

woff = data['woff']
with open('7.woff','wb') as f:
   f.write(base64.b64decode(woff))

转成xml查看

from fontTools.ttLib import TTFont
font = TTFont('7.woff')
font.saveXML('7x.xml')

xml文件中 有对应关系, extraNames是按照0-9的顺序排序的。

接下来,把xml中的name提取出来构建一个map, { ‘unif689’: 0, ‘unia924’: 1, ‘unif637’: 2, ‘unib526’: 3, ‘unic831’: 4, ‘unib348’: 5, ‘unie283’: 6, ‘unib827’: 7, ‘unif145’: 8, ‘unib793’: 9 }

和 json中的进行替换就能获取到需要的数据了。

猿人学爬虫比赛第八题:《图文点选》

地址: http://match.yuanrenxue.com/match/8

这种题和js没什么关系,不过多描述了。

处理点选验证码的逻辑: 1、获取资源文件(需要识别的字、验证码图片) 2、图片处理(二值、去边去线、降噪等) 3、自己训练识别模型或者使用第三方OCR 4、向api发送点击后的请求(一般获取点击位置即可)

抓包可以发现,资源文件都在api中:http://match.yuanrenxue.com/api/match/8_verify

下面查看验证码图片区域:

我按照可点击的像素格进行点击,查看返回结果。

可以看到,提交的 answer就是点击的位置,并且小方格下标为点击的位置。

那么可以自定义一个位置字典,{“字1”:“155”,“字2”:“166”,“字3”:“175”,…}

然后把验证码识别之后的结果和需要点击的字对比,确定好位置,发送验证请求即可。