uview-plus 文档 广告过滤

952 阅读2分钟

uview-plus的文档有异常烦人的广告
而且就算你看了,每12个小时都要重新观看一次(写死在广告检测代码中)
看来是默认员工最长工作时间是996,每天上班前看一次广告?
算上拿手机扫码的功夫, 每天至少浪费1分钟在看广告

image.png

吐槽完了,广告过滤过程如下

方法一: 通过adblock拦截js

  1. curl uview-plus.jiangruyi.com

  2. 重点关注 as script的文件

image.png

  1. 这个功能目前是单独打包的,可以通过adblock,adguard的Url拦截功能实现

  2. 目前可以拦截https://uview-plus.jiangruyi.com/assets/js/3.fcbecc72.js这个地址达到去广告的目的

  3. 介绍下禁止用户调试网页的一些办法

    1. 禁止f12 ctrl+alt+i等快捷键
    2. 检测页面宽度变化,禁止chrome devtools在页面同排窗口打开
    3. 无限debugger断点
    4. 检测js代码执行时间是否延迟(推测是uview-plus的做法)

真恶心, 微信小程序的开发真的是依托答辩,恶心开发者.

方法二: 设置locolstorage的时间,广告检测代码如下,设置localStorage.adExpire2

image.png

搜索广告的代码

const process = require('node:process')
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const cheerio = require('cheerio');

async function extractLinksAndScripts(url) {
    try {
        // 1. 获取 HTML 内容
        const response = await axios.get(url);
        const html = response.data;

        // 2. 解析 HTML
        const $ = cheerio.load(html);
        const baseUrl = new URL(url);
        const baseHref = baseUrl.origin + baseUrl.pathname.substring(0, baseUrl.pathname.lastIndexOf('/') + 1);

        // 3. 提取 link[href] 和 script[src]
        const results = [];

        $('link[href]').each((i, el) => {
            const href = $(el).attr('href');
            results.push({
                tag: 'link',
                original: href,
                absolute: new URL(href, baseHref).href
            });
        });

        $('script[src]').each((i, el) => {
            const src = $(el).attr('src');
            results.push({
                tag: 'script',
                original: src,
                absolute: new URL(src, baseHref).href
            });
        });

        return results;
    } catch (error) {
        console.error("Error fetching or parsing:", error);
        return [];
    }
}


// 使用示例
const targetUrl = "https://uiadmin.net/uview-plus/components/intro.html";
const SEARCH_TEXT = 'watchAd()'


// 检查单个 JS 文件
async function checkJsFile(file, config) {
    try {
        let content;

        // 处理本地文件
        if (file.startsWith('file://')) {
            const filePath = file.replace('file://', '');
            content = fs.readFileSync(filePath, 'utf-8');
        }
        // 处理远程 URL
        else {
            const response = await axios.get(file, {
                timeout: config.timeout,
                responseType: 'text'
            });
            content = response.data;
        }

        // 检查是否包含 console.clear()
        if (content.includes(SEARCH_TEXT)) {
            return {url: file, hasClear: true};
        }
        return {url: file, hasClear: false};
    } catch (error) {
        console.error(`Error checking ${file}:`, error.message);
        return {url: file, hasClear: false, error: error.message};
    }
}

async function searchJs(config) {


    console.log('开始检查 JS 文件...');

    const results = [];
    const batches = [];

// 分批处理
    for (let i = 0; i < config.jsFiles.length; i += config.concurrency) {
        const batch = config.jsFiles.slice(i, i + config.concurrency);
        batches.push(batch);
    }

// 处理每个批次
    for (const batch of batches) {
        const batchResults = await Promise.all(batch.map(file => checkJsFile(file, config)));
        results.push(...batchResults);

        // 打印进度
        console.log(`已处理 ${results.length}/${config.jsFiles.length} 个文件`);
    }

// 过滤出包含 console.clear() 的文件
    const filesWithClear = results.filter(r => r.hasClear);

// 打印结果
    console.log(`\n包含 ${SEARCH_TEXT} 的文件:`);
    filesWithClear.forEach(file => {
        console.log(file.url);
    });

// 写入结果文件
    if (config.outputFile) {
        const outputPath = path.resolve(process.cwd(), config.outputFile);
        const outputContent = filesWithClear.map(f => f.url).join('\n');
        fs.writeFileSync(outputPath, outputContent);
        console.log(`\n结果已保存到 ${outputPath}`);
    }

}


extractLinksAndScripts(targetUrl).then(parseURLs => {

    console.log("提取结果:", parseURLs);


// 配置参数
    const config = {
        // JS 文件列表(可以是本地文件路径或 URL)
        jsFiles: parseURLs.map(item => item.absolute),
        // 结果输出文件(可选)
        outputFile: 'results.txt',
        // 请求超时时间(毫秒)
        timeout: 5000,
        // 并发请求数
        concurrency: 30
    };
    searchJs(config).then(() => {
        console.log('\n检查完成');
    })
})