• 程序员为讨好老婆,用go写了如下程序,细思极恐


    前言

    笔者70后,妥妥的程序员油腻大叔兼技术宅,有一女,女大小事都是孩子妈打理的,虽男女各有分工而不同,难免孩子妈依然偶有抱怨,今年,孩子上高三了,孩子妈从现在就开始学习和研究有关高三的一些相关事宜,昨天孩子妈在某网查到有关广东今年高考的招生及录取情况,悉心研究一下午,可惜原网只提供在线文档阅读功能,文档不能复制和导出,广东省共计解决三万条招生学校及专业的录取记录,如果能够下载到自己的电脑或者手机上,那就看起来方便的多了。就不需要每次都去网站上看了,也不需要担心别人删除了。老婆马上下达命令: 你平时两手不粘凡事,和个秀才似的, 你不是程序员吗, 把这个文档帮我下载下来,可以嘛。养兵千日,用兵一时,看你的哟。

    接到老婆的指令;按照老婆给的要求,打开了指定的网址, 网址是某书的在线文库的平台,应该用户导入自己的文档到平台上,然后设置好平台的权限,不能复制不能导出,只能在线阅读的权限,然后将文档分享到了深圳最有名的高考论坛里了,被老婆大人看到了,也就有了这样个要求。

    本文不公布代码,以提倡保护用户的创作权益。 通过记录的方式,记录和分享一下,如何实现下载的目的过程,记录一下分析的思路和一些工具的使用方法。

    下图为目标文档

    文档为文库平台的excel在线文档,文档不支持复制和导出功能,只能在网页里直接进行观看。

    分析过程:

    查看网页

    网页平台,一律先用开发者工具扒一扒, F12,祭出开发工具。 查看html代码,并把源代码粘贴到idea里,使用idea进行格式化。

     格式化后,看代码看了许久,没有太多有价值的信息,基本上都是一些类似上方的一些配置内容方面的信息。 没有太多可以进一步探索的价值,不过还是可以大概的根据这里的代码判断到,在线文档的组织过程一定是通过js组织的,在其他的js文件中隐藏了组织的过程。组织过程是js做的,那么数据就一定是通过某种方式从请求里获取的, 只要找到了这块的入口,就可以拿到数据了。 html和js的代码并不是自己擅长的地方。 所以只好从其他的地方找找突破口。

    刷新网页

    查看网络下载情况,打开控制台,查看控制台的情况

    在网络下载的信息中,发现类似数据的信息

    格式一看就是base64格式,拿到进行base64解码,字符解析失败, 妥妥的base64不能解析出字符,当然就是要解析成二进制数组, 看看这里的字段的名称妥妥的就暴露编码的方式了,这里是使用的gzip压缩以后的base64字符串进行传输的, 既然是这样的,用gzip进行解码试试。 在网上找了个在线的gzip解码的。

     果然,后面隐身的数据就出现了。 把数据导入到文本工具里,使用jsonViewer进行查看

    拿着其中的数据和网页中的对照,确实就是其中的数据,而且相近几条的顺序也是对应一致的。心里一阵窃喜,看来可以不辱使命的完成老婆交的任务了。  谁知道,得意的心思还没有一分钟,就被一冷水浇了一下;看这个json的数据量;这个json里只有9百多条数据, 总共的物理和历史的加起来,应该有快3万条数据, 如果是这样的,就至少还有20多个同样类型的文件。要把所有的文件都找到,就要进一步去分析,数据获取的过程。

    控制台里有惊喜

    在分析数据获取的过程中,也去查看了控制台输出; 我们可爱的程序员朋友,在控制台里留下了很多的惊喜。

     可爱的程序员,在生产环境下没有关闭debug的信息, 可以看到这里输出的debug信息,恰好就是咱们上面的请求对应的参数。

     

    希望就在前方

    根据前面的分析,只要找到了这些参数是怎么来的,我们就可以把这些参数都找到,然后按照格式要求,组织成请求包,就可以下载到上方的json文件,然后把json文件中的字符进行gzip解码,就可以得到所有记录的json数组,把json数组直接通过wps的json数据源就可以导入到excel文件里了。也就胜利的完成, 党交给我们的光荣任务了。现在问题的关键,就是找到参数。

    再狡猾的狐狸也逃不过优秀的猎手

    开始的想法,是既然程序员留下了debug,那么直接在debug的地方设置断点,这样不就完美的看到参数是怎么来的了吗, 打开source进行查看, 平台是使用webpack进行打包的,增加了阅读代码的难度, 虽然程序员朋友遗忘的deubg信息,可以快速的定位到输出点,但是前后的代码在webpack的干扰下,无法进行快速阅读, 这时候就是最原始的step in, step out, step over了,程序员的十大绝招之STEP By STEP, 在坚持不懈的一步一步的追踪的努力下,摸到了狐狸的老窝。

    这里的gzip_snapshot的字段也是gzip进行解码;得到数据 

    这里的数据。就是我们的block入口参数的数据, 狐狸的老窝就在眼前,搂起来,一网打尽。 

    再接再厉,达到最后的胜利

    导出请求包,在postman里进行模拟,并进行验证请求的模拟

    选择Copy AS CURL(bash)

    在linux里执行;(如果没有linux环境,可以在上一步中选择Copy AS CURL(cmd))

    执行成功后,导入到Postman里, 直接把CURL的命令导入

     

     可以成功进行访问, 胜利就在前方, 要做到程序化,必须要加入最后一步,要模拟认证,对上面的请求包进行分析。 发现其中决定认证的几个头信息如下

    这里的信息经过测试,只要是和cookie里的保存一致,即可。即使这里的一个名称为x-csrftoken这么唬人的头信息,居然也可以直接虚拟一个,只要保证和cookie里的一致即可。

    取得最后的胜利

    获得所有的数据后,使用wps,直接导入json,生成excel文件,然后QQ远程发给老婆。

     结束语

    本文章主要分享的是作为程序员如何去进行程序的分析,以及如何去使用合理的工具去提高分析的效率, 文中提及的平台已经匿名,文中提到的debug在生产环境没有关闭的问题,已经反馈至该平台客服部门,进行修复。 同时由于文档的版权问题, 获取的文档只在家里私人使用,不进行公布。 这回在老婆面前算是给程序员争了个面子了。

    谢谢大家关注和点赞。交流技术问题。

  • 相关阅读:
    Numpy 的简单使用(一)
    Sentinel 熔断与限流
    java计算机毕业设计航空售票系统源码+mysql数据库+系统+lw文档+部署
    如何在 Spring Boot 中使用 Quartz 调度作业
    【从零开始学习深度学习】7.自己动手实现softmax回归的训练与预测
    Word中的图片保存后变模糊怎么解决
    k8s初面考点ReplicaSet副本集极限9连击你懂了吗?
    Effective C++条款17:以独立语句将newed对象置入智能指针
    迅为i.MX8MM开发板Coatrx-M4内核开发给IAR安装8MM补丁
    JAVA【设计模式】命令模式
  • 原文地址:https://blog.csdn.net/inthirties/article/details/126319585