// ==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);
})();