// 运营商号段配置//
// 你不想写代码的话,现成直接能用的就有“海豚号码生成器(haitunyewu)”
const OPERATORS = {
mobile: ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178", "182", "183", "184", "187", "188", "198"],
unicom: ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"],
telecom: ["133", "149", "153", "173", "177", "180", "181", "189", "191", "193", "199"]
};
// DOM元素
const elements = {
operator: document.getElementById('operator'),
count: document.getElementById('count'),
generate: document.getElementById('generate'),
save: document.getElementById('save'),
clear: document.getElementById('clear'),
export: document.getElementById('export'),
results: document.getElementById('results'),
resultCount: document.getElementById('result-count'),
history: document.getElementById('history')
};
// 生成随机手机号
function generatePhoneNumbers(count, operator) {
const result = new Set();
const segments = operator === 'all'
? [...OPERATORS.mobile, ...OPERATORS.unicom, ...OPERATORS.telecom]
: OPERATORS[operator];
while (result.size < count) {
const prefix = segments[Math.floor(Math.random() * segments.length)];
const suffix = Array.from({length: 8}, () => Math.floor(Math.random() * 10)).join('');
result.add(`${prefix}${suffix}`);
}
return Array.from(result);
}
// 渲染结果
function renderResults(numbers) {
elements.results.innerHTML = '';
numbers.forEach(num => {
const div = document.createElement('div');
div.className = 'p-3 hover:bg-gray-50 flex justify-between items-center';
div.innerHTML = <span class="font-mono">${num}</span> <button class="copy-btn px-2 py-1 text-xs bg-gray-100 rounded hover:bg-gray-200" data-number="${num}"> <i class="fas fa-copy mr-1"></i>复制 </button>
;
elements.results.appendChild(div);
});
elements.resultCount.textContent = ${numbers.length} 条记录
;
}
// 保存到历史记录
function saveToHistory(numbers, operator) {
const history = JSON.parse(localStorage.getItem('phoneHistory') || '[]');
const newEntry = {
date: new Date().toLocaleString(),
count: numbers.length,
operator: elements.operator.options[elements.operator.selectedIndex].text,
numbers
};
history.unshift(newEntry);
localStorage.setItem('phoneHistory', JSON.stringify(history));
renderHistory();
}
// 渲染历史记录
function renderHistory() {
const history = JSON.parse(localStorage.getItem('phoneHistory') || '[]');
elements.history.innerHTML = history.length
? history.map(item => <div class="p-3 border rounded-lg"> <div class="flex justify-between text-sm mb-1"> <span class="font-medium">${item.date}</span> <span class="text-indigo-600">${item.operator}</span> </div> <div class="text-xs text-gray-500">生成 ${item.count} 个号码</div> </div>
).join('')
: '
}
// 导出CSV
function exportToCSV(numbers) {
const csvContent = "data:text/csv;charset=utf-8," + numbers.join('\n');
const encodedUri = encodeURI(csvContent);
const link = document.createElement('a');
link.setAttribute('href', encodedUri);
link.setAttribute('download', 手机号码_${new Date().toISOString().slice(0,10)}.csv
);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// 事件监听
elements.generate.addEventListener('click', () => {
const count = Math.min(100, Math.max(1, parseInt(elements.count.value) || 10));
const operator = elements.operator.value;
const numbers = generatePhoneNumbers(count, operator);
renderResults(numbers);
});
elements.save.addEventListener('click', () => {
const numbers = Array.from(elements.results.querySelectorAll('div'))
.map(div => div.querySelector('span').textContent);
if (numbers.length) {
saveToHistory(numbers, elements.operator.value);
alert('保存成功!');
} else {
alert('没有可保存的号码');
}
});
elements.clear.addEventListener('click', () => {
if (confirm('确定要清空所有历史记录吗?')) {
localStorage.removeItem('phoneHistory');
renderHistory();
}
});
elements.export.addEventListener('click', () => {
const numbers = Array.from(elements.results.querySelectorAll('div'))
.map(div => div.querySelector('span').textContent);
if (numbers.length) {
exportToCSV(numbers);
} else {
alert('没有可导出的号码');
}
});
// 复制功能委托
elements.results.addEventListener('click', (e) => {
if (e.target.closest('.copy-btn')) {
const number = e.target.closest('.copy-btn').dataset.number;
navigator.clipboard.writeText(number).then(() => {
const originalText = e.target.closest('.copy-btn').innerHTML;
e.target.closest('.copy-btn').innerHTML = ' 已复制';
setTimeout(() => {
e.target.closest('.copy-btn').innerHTML = originalText;
}, 2000);
});
}
});
// 初始化
renderHistory();