关于GB688文件下载PDF的脚本讨论

关于GB688文件下载pdf的脚本讨论
把网页上在线预览的pdf下载下来

旧版脚本(已失效)

1.脚本添加到油猴插件里,然后直接使用

脚本使用效果图.gif

2.脚本内容

// ==UserScript==
// @name        gb688下载
// @namespace   https://github.com/lzghzr/TampermonkeyJS
// @version     1.0.6
// @author      lzghzr
// @description 下载gb688.cn上的国标文件
// @supportURL  https://github.com/lzghzr/TampermonkeyJS/issues
// @match       *://*.gb688.cn/bzgk/gb/newGbInfo*
// @match       *://*.samr.gov.cn/bzgk/gb/newGbInfo*
// @connect     c.gb688.cn
// @license     MIT
// @grant       GM_xmlhttpRequest
// @run-at      document-end
// ==/UserScript==
const online = document.querySelector('button.btn.ck_btn.btn-sm.btn-primary');
if (online === null || online.innerText !== '在线预览')
    throw '没有预览, 没有下载';
const download = document.querySelector('button.btn.xz_btn.btn-sm.btn-warning');
if (download !== null)
    download.remove();
const GBdownload = document.createElement('button');
GBdownload.style.cssText = 'margin-right:20px';
GBdownload.className = 'btn xz_btn btn-sm btn-warning';
GBdownload.innerText = '下载标准';
online.insertAdjacentElement('afterend', GBdownload);
const hcno = online.dataset.value;
if (hcno === null) {
    GBdownload.innerText = '未获取到hcno';
    throw '未获取到hcno';
}
GBdownload.onclick = async () => {
    const GBname = document.body.innerText.match(/标准号:(?<id>.*?)\n中文标准名称:(?<name>.*?)\s\n/);
    if (GBname === null) {
        GBdownload.innerText = '文件名获取失败';
        throw '文件名获取失败';
    }
    const { id, name } = GBname.groups;
    let pdf = '';
    GBdownload.innerText = '下载中...0%';
    for (let i = 0; i < 10; i++) {
        const view = await XHR({
            GM: true,
            method: 'POST',
            url: `http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=${hcno}${i === 0 ? '' : `.00${i}`}`,
            headers: {
                'Accept': 'text/plain, */*; q=0.01',
                'Accept-Encoding': 'gzip, deflate',
                'Accept-Language': 'zh-CN,zh-TW;q=0.9,zh;q=0.8,en-US;q=0.7,en;q=0.6',
                'Connection': 'keep-alive',
                'DNT': 1,
                'User-Agent': 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.34 (KHTML, like Gecko) Version/11.0 Mobile/15A5341f Safari/604.1',
                'X-Requested-With': 'XMLHttpRequest'
            },
            cookie: true,
            responseType: 'text'
        });
        if (view === undefined || view.response.status !== 200) {
            GBdownload.innerText = '文件获取失败';
            throw '文件获取失败';
        }
        GBdownload.innerText = `下载中...${i * 10}%`;
        pdf += view.body || '';
    }
    GBdownload.innerText = '下载标准';
    const tempLink = document.createElement('a');
    tempLink.download = `${id.replace('/', '')}(${name}).pdf`;
    const BlobURL = await fetch(`data:application/pdf;base64,${pdf}`)
        .then(res => res.blob())
        .then(blob => URL.createObjectURL(blob));
    tempLink.href = BlobURL;
    tempLink.click();
};
function XHR(XHROptions) {
    return new Promise(resolve => {
        const onerror = (error) => {
            console.error(error);
            resolve(undefined);
        };
        if (XHROptions.GM) {
            if (XHROptions.method === 'POST') {
                if (XHROptions.headers === undefined)
                    XHROptions.headers = {};
                if (XHROptions.headers['Content-Type'] === undefined)
                    XHROptions.headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
            }
            XHROptions.timeout = 30 * 1000;
            XHROptions.onload = res => resolve({ response: res, body: res.response });
            XHROptions.onerror = onerror;
            XHROptions.ontimeout = onerror;
            GM_xmlhttpRequest(XHROptions);
        }
        else {
            const xhr = new XMLHttpRequest();
            xhr.open(XHROptions.method, XHROptions.url);
            if (XHROptions.method === 'POST' && xhr.getResponseHeader('Content-Type') === null)
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
            if (XHROptions.cookie)
                xhr.withCredentials = true;
            if (XHROptions.responseType !== undefined)
                xhr.responseType = XHROptions.responseType;
            xhr.timeout = 30 * 1000;
            xhr.onload = ev => {
                const res = ev.target;
                resolve({ response: res, body: res.response });
            };
            xhr.onerror = onerror;
            xhr.ontimeout = onerror;
            xhr.send(XHROptions.data);
        }
    });
}

更新后插件无效

之前一直用这个油候插件下载GB688的相关标准
今年网站进行了改版失效了
开发者发现进行加密后没再继续开发

作者原话:加密算法已经破解了, 但不是佷敢放出来, 毕竟国家的网站, 万一吃牢饭就不好了
链接

image.png

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容