// ==UserScript==
// @name 千川创意标题自动填写(智能输入+保存)
// @namespace http://tampermonkey.net/
// @version 4.0
// @description 自动点击“添加标题”按钮、智能模拟输入、支持localStorage保存输入内容(最多30个)
// @match https://qianchuan.jinritemai.com/creation/uni-prom-product*
// @license MIT
// @grant none
// @downloadURL none
// ==/UserScript==
(function () {
'use strict';
const WAIT_MS = 1500;
setTimeout(() => {
// 创建悬浮面板
const panel = document.createElement('div');
panel.innerHTML = `
`;
document.body.appendChild(panel);
const textarea = document.getElementById('fillTextArea');
const startBtn = document.getElementById('startFillBtn');
// 🌟 恢复上次输入内容
textarea.value = localStorage.getItem('qianchuan_titles') || '';
// 🌟 自动保存输入内容
textarea.addEventListener('input', () => {
localStorage.setItem('qianchuan_titles', textarea.value);
});
// 点击开始按钮逻辑
startBtn.addEventListener('click', async () => {
let rawText = textarea.value.trim();
if (!rawText) {
alert("请输入标题内容(每行一个)!");
return;
}
let titles = rawText.split(/\r?\n/).map(t => t.trim()).filter(t => t.length > 0);
if (titles.length === 0) {
alert("请输入有效标题!");
return;
}
if (titles.length > 30) {
alert("标题过多,只会使用前30个。");
titles = titles.slice(0, 30);
}
// ✅ 查找“添加标题”按钮(精准匹配)
const allButtons = Array.from(document.querySelectorAll('button.ovui-button[data-e2e="button"]'));
const addButton = allButtons.find(btn => btn.innerText.trim() === '添加标题');
if (!addButton) {
alert("未找到‘添加标题’按钮,请确认页面是否加载完成。");
console.warn("脚本:未找到‘添加标题’按钮。");
return;
}
// 自动点击“添加标题”
for (let i = 0; i < titles.length - 1; i++) {
addButton.click();
console.log(`➕ 已点击添加标题 (${i + 1}/${titles.length - 1})`);
await new Promise(r => setTimeout(r, 100)); // 速度可调节
}
// 等待输入框生成
await new Promise(r => setTimeout(r, 800));
// 查找输入框
const inputSelector = 'div[data-e2e*="uni-prom-product__creativeTitle__ocInput"] input.ovui-input';
const inputs = document.querySelectorAll(inputSelector);
if (inputs.length === 0) {
alert("未找到创意标题输入框!");
return;
}
const fillCount = Math.min(inputs.length, titles.length);
// ✅ 使用原生 setter 模拟真实输入,绕过检测
const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set;
for (let i = 0; i < fillCount; i++) {
const input = inputs[i];
const text = titles[i];
input.focus();
nativeSetter.call(input, text);
input.dispatchEvent(new Event('input', { bubbles: true }));
input.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true }));
input.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true }));
input.dispatchEvent(new Event('change', { bubbles: true }));
input.blur();
console.log(`✅ 第 ${i + 1} 个标题已填写: ${text}`);
await new Promise(r => setTimeout(r, 80));
}
alert(`已成功添加并填写 ${fillCount} 个标题!`);
});
}, WAIT_MS);
})();