Tan's Blog.

Web:RapidTyping

字数统计: 889阅读时长: 3 min
2019/04/10 Share

RapidTyping

使用工具

PyCharm

解题思路

打开题目给出的网页内容,要求在2.5s内输入图中给出的字符串,显然手动输入是不可能的,除非你开启炫舞100倍速模式依然风生水起,不然的话这道题还是需要写个脚本跑一跑。
查看一下页面的源代码,发现图片是svg格式,那什么是svg呢?SVG就是可缩放矢量图形,基于可扩展标记语言,用于描述二维矢量图形的一种图形格式。与传统的图像格式不同的是,SVG采用文本来描述矢量化的图形,这使得SVG图像文件可以像HTML网页一样有着很好的可读性。当用户用图像工具输出SVG后,可以用任何文字处理工具打开SVG图像,并可看到用来描述图像的文本代码。掌握了SVG语法的人甚至可以只用一个记事本便可以读出图像中的内容来。

继续点进去,得到xml文档,是这个图形的数据,由许多text标签组成,每个标签的内容就是我们需要输入的字符。同时从text的属性可以得出,每个字符的位置信息xy坐标值,颜色信息rgb值。那就按照x坐标值的大小顺序进行排序。

接下来明确一下代码的思路,使用session机制,在服务器端保持状态。请求网页,获取img标签的src属性内容,分割出base64编码的数据信息,并解码。将解码的结果返回得到text标签内容,按照x属性值的大小排序,将结果传送,得到页面返回信息,GET。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import base64
import requests
from bs4 import BeautifulSoup

session = requests.session()
r = session.get('http://123.207.149.64:23331/captcha/')
bsoup = BeautifulSoup(r.text, 'html.parser')
image= bsoup.find('img').get('src')
imagedatabase64 = image.split(',')[-1]
imagedata = base64.b64decode(imagedatabase64)
bsoup = BeautifulSoup(imagedata, 'html.parser')
text1 = bsoup.find_all('text')
answer = ''
str = sorted(text1, key=lambda x: float(x.get('x')),reverse=False)
for i in str:
answer += i.string
r = session.post('http://123.207.149.64:23331/captcha/', params={'code': answer})
print(r.text)

总结

这道题和calculator都使用了session机制,目的是让服务器将图片和答案对应上。在用户发起会话时,存在两种机制:一个是Cookie机制,通过在客户端记录信息确定用户身份;另一种是Session机制,通过在服务器端记录信息确定用户身份。
本题中给的是一个矢量图形,它是不需要图像识别技术就可以读取数据的,在这里要说明一点,就是图形和图像的区别:图形是指由外部轮廓线条构成的矢量图。即由计算机绘制的直线、圆、矩形、曲线、图表等;而图像是由扫描仪、摄像机等输入设备捕捉实际的画面产生的数字图像,是由像素点阵构成的位图。最直接的区别方法就是放大处理,放大后图形还是图形,而图像就会变成一堆马赛克,也就是像素点,这也就是为什么分辨率越高图像越清晰了。如果题目给的图像的话,可能就需要一些图像识别技术了。
最后就是关于python的,我也是刚接触python,不好说太深入,不过这个语言确实用起来很方便,符合它的定位“优雅”、“明确”、“简单”,以后还要多加学习使用。

CATALOG
  1. 1. RapidTyping
    1. 1.1. 使用工具
    2. 1.2. 解题思路
    3. 1.3. 总结