LinksListBatchOpen

To quickly understand a field, press Alt+1 ...2,3,4...Alt+5 on the search page of Google or Bing to open the search results of the first 2 nth power items and copy the opened ones link. Currently supports: Google, Bing, Zhihu.

当前为 2021-03-24 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name            LinksListBatchOpen
// @name:zh         Alt + 123... 一键批量打开谷歌必应搜索的前2的n次方项搜索结果
// @namespace       [email protected]
// @version         1.0.0
// @description  To quickly understand a field, press Alt+1 ...2,3,4...Alt+5 on the search page of Google or Bing to open the search results of the first 2 nth power items and copy the opened ones link. Currently supports: Google, Bing, Zhihu.
// @description:zh  快速了解一个领域用,在谷歌或必应的搜索页面 按 Alt+1 ...2,3,4... Alt+5  将会打开前2的n次方项的搜索结果,并复制打开的链接。目前支持:谷歌、必应、知乎。
// @author          snomiao
// @match           *
// @grant           none
// ==/UserScript==

const 最长共列输出 = (矩阵, a, b, x, y) =>
    !x || !y
        ? ''
        : a[x - 1] === b[y - 1]
            ? 最长共列输出(矩阵, a, b, x - 1, y - 1) + a[x - 1]
            : 矩阵[y][x - 1] > 矩阵[y - 1][x]
                ? 最长共列输出(矩阵, a, b, x - 1, y)
                : 最长共列输出(矩阵, a, b, x, y - 1)
const 最长共列 = (a, b) => {
    const w = a.length, h = b.length
    const m = Array(1 + h).fill(0).map(() => Array(1 + w).fill(0))
    for (let y = 0; y < h; y++)
        for (let x = 0; x < w; x++)
            m[1 + y][1 + x] =
                a[x] === b[y]
                    ? m[y][x] + 1
                    : Math.max(m[y][1 + x], m[1 + y][x])
    false && console.table(m)
    return 最长共列输出(m, a, b, w, h)
}
const 元素特征列取 = (e) => [...e.querySelectorAll('*')]
    .map(e => e?.tagName + e?.className)
const 元素列表强度 = e => e.textContent.length * (e.children.length - 1)
    * [...e.children]
        .filter(e => !'style script'.toUpperCase().split(' ').includes(e.tagName))
        .map(元素特征列取)
        .map((_, i, a) => 最长共列(a[i], a[i + 1] || []))
        .reduce((前, 后) => 前 + 后.length, 0)
const 列元素列提取 = () => [...document.querySelectorAll('div,dl,ul,ol,tbody,table,td')]
    .filter(e => e.children.length > 1)
    .map(e => [元素列表强度(e), e, [...e.children]
        .filter(e => !'style script span'.split(' ').includes(e.tagName))
        .map(元素特征列取)])
    .sort((a, b) => a[0] - b[0])
    .reverse()
const 标链元素提取 = e =>
    (e
        ?.querySelector('dd,dt,h1,h2,h3,h4,h5,h6')
        ?.querySelector('a'))
    || ([...e?.querySelectorAll('a')]
        ?.filter(e => e.querySelector('dd,dt,h1,h2,h3,h4,h5,h6'))
        ?.[0])
    || e?.querySelector('a')
const 标链提取 = (e) => e && [
    e?.textContent?.replace(/\s+/g, ' ').trim(),
    e?.href]
const 页主标链列提取 = () => 列元素列提取()
    .filter((x, i, a) => a[i][0] > a[0][0] * 0.1)
    .sort((a, b) => a[1].offsetTop - b[1].offsetTop)
    .map(([r, e]) => e)
    .flatMap(e => [
        ...e?.children]
        ?.map?.(标链元素提取)
        ?.map?.(标链提取) || [])
    .filter(e => e)
const 文本复制 = (内容) => {
    const input = document.createElement('textarea');
    input.setAttribute('readonly', 'readonly');
    input.setAttribute('value', 内容);
    input.innerHTML = (内容);
    input.setAttribute('style', 'position: fixed; top:0; left:0;z-index: 9999');
    document.body.appendChild(input);
    input.select();
    input.setSelectionRange(0, input.value.length);
    if (document.execCommand('copy')) {
        document.execCommand('copy');
        console.log(`长度为${内容.length}的内容已复制`);
    } else {
        // alert(`长度为${内容.length}的内容复制失败,请检查浏览器配置,或在页面上先按一下键盘任意键解除剪贴板保护`);
    }
    document.body.removeChild(input);
};
const 已打开过的链接 = {}
const 链接打开 = (链接) => { if (!已打开过的链接[链接]) { window.open(链接) }; 已打开过的链接[链接] = 1 };
const 链接列获取 = 数量 => 页主标链列提取()
    .map(([标题, 链接]) => ({ 标题, 链接 }))
    .slice(0, 数量)
    .reverse() //在 chrome 下需要反过来。。
const 打开一定数量链接 = (数量) => {
    const 链接列 = 链接列获取(数量)
    文本复制(链接列.map(({ 标题, 链接 }) => "#" + 标题 + '\n' + 链接).join('\n\n'))
    链接列.map(({ 链接 }) => 链接).map(链接打开)
}
window.addEventListener("keydown", (e) => {
    if (!e.ctrlKey && !e.shiftKey && e.altKey && e.key.match(/[1-9]/)) {
        const 打开数量 = 2 ** parseInt(e.key)
        打开一定数量链接(打开数量)
    }
})
console.log("[loaded]: 谷歌一键打开前N项搜索结果, Copy")