openstd.samr.gov.cn(原gb688)PDF文件载入流程 探讨
本帖最后由 soarcool 于 2021-3-29 10:29 编辑0. 免责声明
没啥卵用, 但依然要说明一下, 本文未包含版权内容, 且未对所诉网站之程序进行破坏, 文章内容均为学习交流之用
1. 前言2021年前, gb688手机版使用的明文pdf, 可直接下载, 不需要额外处理
2021年开始, 新站openstd, 开始全面启用 pdf.js, 至此, 手机版也使用与pc同样加密技术
2. 文件预览openstd文件以两种方式开放给用户, 一种为直接下载, 另一种为在线预览
直接下载的文件有DRM保护, 需使用网站提供的工具打开
在线预览的文件使用 pdf.js, 浏览器解密后在线呈现给用户
因为浏览器管理较为困难, 且容易改造, 对于要求不高的用户, 可以使用打印功能将文件打印为纸质文件或PDF文件
亦可使用无头浏览器 (headless), 对网站文件进行批量获取
3. 文件载入既然可以使用 pdf.js 进行预览, 说明必定有PDF文件进行载入
通过浏览器工具可知, 载入的文件并非明文, 而是加密后的Base64字符串, 并且使用了懒加载 (lazyload), 分段进行载入
下面通过GB 39732-2020 (汽车事件数据记录系统) 为例, 来分析其载入过程
3.1点击 "在线预览" 按钮后, 浏览器跳转至 预览页面
在此页面中包含变量 var HCNO="e+fr0OSr1Px3S3phy72jth0Hq3HBZZ+ZDXKIbZQEWVeWUhQ7hYT4ELgJTdrFvtx9lSgoZL0ew6+0DcVriDfUeMIK59fQUGvHqO8h3Ps31m4=", 记录了加密PDF文件所使用的密钥 (key) 和初始向量 (iv)
其自身为密文, 通过网站编译的 pdf-work.wasm 中的固定参数进行解密, 之后在浏览器中初始化Module.onRuntimeInitialized = function () {
var ptr = allocateUTF8(HCNO);
var retPtr = Module._init(ptr);
HCNO = UTF8ToString(retPtr);
DEFAULT_URL += HCNO;
console.log(DEFAULT_URL);
if (document.readyState === "interactive" || document.readyState === "complete") {
webViewerLoad();
} else {
document.addEventListener("DOMContentLoaded", webViewerLoad, true);
}
}解密后得到 ****************:################:CC68F6BFD3E104560914271598AFE8C8, 其中
**************** 为密钥
################ 为初始向量
CC68F6BFD3E104560914271598AFE8C8 为hcno
3.2拿到密钥和初始向量后, 开始请求加密文件GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1
Host: c.gb688.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 ********************************
Accept: */*
Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8
Accept-Encoding: gzip, deflate
Accept-Language: ********************************
Cookie: JSESSIONID=********************************服务器返回HTTP/1.1 200 OK
Server: nginx/1.17.9
Date: ***, ** *** **** **:**:** GMT
Content-Type: Content-Type: application/octet-stream
Content-Length: 2967097
Connection: keep-alive
Accept-Ranges: bytes
Content-Range: bytes 0-2967096/2967097此过程中没有发生文件传输, 而是从返回头中获得了文件大小, 即 Content-Range: bytes 0-2967096/2967097
紧接着正式开始请求文件GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1
Host: c.gb688.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 ********************************
Accept: */*
Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8
Accept-Encoding: identity
Accept-Language: ********************************
Cookie: JSESSIONID=********************************
Range: bytes=0-327679其中 Range: bytes=0-327679 即为请求的文件块
服务器返回HTTP/1.1 206 Partial Content
Server: nginx/1.17.9
Date: ***, ** *** **** **:**:** GMT
Content-Type: Content-Type: application/octet-stream
Content-Length: 436928
Connection: keep-alive
Accept-Ranges: bytes
Content-Range: bytes 0-327679/2967097
oYXL8/L6bpf0dcXYt862fxd+BOqPP2UYS1W/wxsGmxT7sSsU+cJkj33GTDmJxCq37p5tqIFmaYQVWNL88XredoArMcIpzsuaSTeL1Nj/t9CQCiQA8yFQmZOIQTp3vyXo
得到数据后进行解密, 载入到 pdf.js 中
用户下拉时再继续请求, 直到最后一块GET http://c.gb688.cn/bzgk/gb/viewGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8 HTTP/1.1
Host: c.gb688.cn
Connection: keep-alive
User-Agent: Mozilla/5.0 ********************************
Accept: */*
Referer: http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=CC68F6BFD3E104560914271598AFE8C8
Accept-Encoding: identity
Accept-Language: ********************************
Cookie: JSESSIONID=********************************
Range: bytes=2949120-2967096HTTP/1.1 206 Partial Content
Server: nginx/1.17.9
Date: ***, ** *** **** **:**:** GMT
Content-Type: Content-Type: application/octet-stream
Content-Length: 23980
Connection: keep-alive
Accept-Ranges: bytes
Content-Range: bytes 2949120-2967096/2967097
7x/AI3CelgQLKM3uZOKMbuApo9I1NYbaEpZ9diKXfGuljC3S2p/t80GdRHLu6ybPSwED9bx4nkJXtEijAM9ben6g4CdO1UC85aTGxpWKpoh4umqfibsh3jTYkSnAoZtd
至此, 文件载入结束
原文地址:https://gist.github.com/lzghzr/858067598cf590af4c1b7d8faa211d21
哪位大神可以写个教程 到底怎样才可以下载标准 非专业人员感觉以上大神已经写的很明确了 就是不会弄
支持一下,可惜20年的时候还不知道手机端可以直接下PDF 现在下载不了,以前油猴脚本可以,现在我用的浏览器右键打印也可以下载 王雪峰 发表于 2021-3-29 11:32
现在下载不了,以前油猴脚本可以,现在我用的浏览器右键打印也可以下载
这个就是之前那个油猴脚本的作者写的
我右键打印打的有的页根本没有内容 王雪峰 发表于 2021-3-29 11:32
现在下载不了,以前油猴脚本可以,现在我用的浏览器右键打印也可以下载
右键打印可以下载么?请问怎么操作呢?{:1_893:} laonanhai945 发表于 2021-3-29 12:04
右键打印可以下载么?请问怎么操作呢?
右键 打印选择另存为pdf soarcool 发表于 2021-3-29 12:58
右键 打印选择另存为pdf
最多只能打印10页是什么原因啊 用打印功能,清晰度很差,是什么原因,请大神解答
页:
[1]