手机配置清单生成器

一键获取中关村在线指定手机参数配置清单(查看完整参数页),自媒体写数码文章专用神器。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         手机配置清单生成器
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  一键获取中关村在线指定手机参数配置清单(查看完整参数页),自媒体写数码文章专用神器。
// @author       techwb.cn
// @match        https://detail.zol.com.cn/*
// @grant        none
// @license      none
// ==/UserScript==

(function() {
  'use strict';

  var className1 = 'detailed-parameters'; // 【详细参数】CSS类名
  var className2 = 'cell.cell-4'; //【同系列产品】存储版本CSS类名
  var className3 = 'cell.cell-2'; //【同系列产品】手机价格CSS类名
  var className4 = 'product-model__name'; //右侧栏对应商品卡获得手机名称CSS类

// 定义需要搜索和输出的文本内容,一一对应
    var textToSearch = ['产品型号','国内发布时间','上市日期','机身材质','长度','宽度','厚度','重量','CPU型号','CPU频率','GPU型号','RAM存储类型','ROM存储类型','操作系统','散热','振动马达','扬声器','屏幕尺寸','屏幕类型','屏幕比例','屏占比','分辨率','屏幕材质','屏幕刷新率','HDR技术','摄像头总数','像素','光圈','广角','传感器型号','传感器尺寸','对焦方式','变焦倍数','NFC','电池容量','有线充电','无线充电','无线反向充电','游戏功能'];
    var textToOutput = ['手机名','国内发布时间','上市日期','机身材质','机身长度','机身宽度','机身厚度','机身重量','处理器','CPU主频','GPU图形处理器型号','运行内存类型','机身存储类型','预装的操作系统','散热','振动马达','扬声器','屏幕尺寸','屏幕类型','屏幕比例','屏占比','屏幕分辨率','屏幕材质','屏幕刷新率','屏幕是否支持HDR技术','摄像头总数','摄像头像素','光圈','广角','传感器型号','传感器尺寸','对焦方式','摄像头变焦倍数','是否支持NFC','电池容量','有线充电','无线充电','无线反向充电','游戏功能','目前电商价格'];
// 查询所有包含“detailed-parameters”类名的div元素
  var divElements = document.querySelectorAll('.' + className1);

  // 存储查询结果的变量
  var cells = [];
  var text = '';
  var phoneName = '';
  var hasProductName = false;
  var phonePrice = '';

  // 查询所有包含存储版本和手机价格CSS类名的元素,并存储它们的文本
  var cellElements = document.querySelectorAll('.' + className2);
  var cell2Elements = document.querySelectorAll('.' + className3);
  var cell2Texts = [];
  for (var l = 0; l < cell2Elements.length; l++) {
    cell2Texts.push(cell2Elements[l].textContent.trim());
  }

// 处理价格信息
phonePrice = '【目前电商价格】\n';
for (var k = 0; k < cellElements.length; k++) {
  var cellText = cellElements[k].textContent.trim();
  var matched = cellText.match(/[()()][^()()]*[()()]/);
  if (matched) {
    phonePrice += matched[0].replace('/', '+').replace('(', '').replace(')', '').replace('\(', '').replace('\)', '')+'版,从首发价 元降到现价'+cell2Texts[k].replace('¥', '') + '元' + '\n';
  }
}
  phonePrice += '\n';

  // 处理文本内容
  function getTextContent(element) {
    var textContent = '';
    for (var i = 0; i < element.childNodes.length; i++) {
      var node = element.childNodes[i];
      if (node.nodeType == Node.TEXT_NODE) { // 如果节点是文本节点
        textContent += node.textContent;
      } else if (node.nodeType == Node.ELEMENT_NODE) { // 如果节点是元素节点
        if (node.nodeName == 'BR') {
          textContent += '\n'; // 如果是 <br> 标签,则换行
        } else {
          textContent += getTextContent(node); // 递归处理子节点
        }
      }
    }
    return textContent;
  }


// 遍历所有包含“detailed-parameters”类名的div元素
divElements.forEach(function(divElement) {

// 查询每个div元素中的表格元素
var tableElements = divElement.querySelectorAll('table');
    tableElements.forEach(function(tableElement) {
      var rows = tableElement.rows;
  for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    var leftCell = row.cells[0];
    if (leftCell) {

      // 搜索文本内容并提取对应的值
      for (var j = 0; j < textToSearch.length; j++) {
        if (leftCell.textContent.trim() == textToSearch[j]) {
          var rightCell = row.cells[1];
          if (rightCell) {
            var rightCellText = getTextContent(rightCell).trim();
            rightCellText = rightCellText.replace(' g','g').replace(/Hz.*/g, 'Hz').replace('  查看外观图', '').replace('纠错', '').replace('>,', '').replace('>', ';').replace(/更多.*/g, '').replace('¥', '').replace(/GB.*/g, 'GB');
            if (textToOutput[j] == '手机名') {
              if (rightCellText) {
                phoneName = rightCellText;
                hasProductName = true;
              }
            } else if (textToOutput[j] == '目前电商价格') {
              // 已在上面处理
            } else if (textToOutput[j] == '摄像头像素') {
              if (rightCellText) {
                rightCellText = textToOutput[j].replace('摄像头像素','【摄像头像素】\n') + rightCellText;
              }
              text += rightCellText + '\n';
            } else {
              text += '【'+textToOutput[j] + '】 ' + rightCellText + '\n';
              }
            }
          }
        }
      }
    }
  });
});

            // 如果产品型号不存在
            if (!hasProductName) {
            // 查询所有包含“product-model__name”类名的元素
            var productNameElements = document.querySelectorAll('.' + className4);
            // 获取第一个元素的文本值
            if (productNameElements.length > 0) {
            phoneName = productNameElements[0].textContent.trim();
            hasProductName = true;
            }
          }

// 移除手机名称中括号内的存储版本内容,以及将“参数”两个字替换为空值
phoneName = phoneName.replace(/\s*[\(][^\)]*[)\)]/g, '').replace('参数', '');

// 构建完整的文本
var fullText = "根据给出的配置信息写一篇关于(" + phoneName.replace('配置', '') + ")的数码文章(字数限制在800字以内,无需写小标题),请尽量围绕价格降价方面来写,突出性价比,其配置参数如下:\n" + text + phonePrice;

// 创建下载按钮
var downloadButton = document.createElement('button');
downloadButton.style.position = 'fixed';
downloadButton.style.top = '50%';
downloadButton.style.right = '20px';
downloadButton.style.background = 'red';
downloadButton.style.color = 'white';
downloadButton.style.border = 'none';
downloadButton.style.borderRadius = '5px';
downloadButton.style.padding = '10px';
downloadButton.style.fontSize = '16px';
downloadButton.style.zIndex = '9999';
downloadButton.innerText = '生成配置清单';

// 点击下载按钮时生成并下载文本文件
downloadButton.onclick = function() {
var blob = new Blob([fullText], { type: 'text/plain' });
var url = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = url;
a.download = phoneName + '详细配置清单.txt';
a.click();
setTimeout(function() { URL.revokeObjectURL(url); }, 0);
};

// 将下载按钮添加到文档中
document.body.appendChild(downloadButton);
})();