您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在智能硬件经销商管理系统中为每个手机号码旁增加一个ADB拨号按钮并隐藏特定电话图标,需要配合ADB Call软件才能拨打号码
当前为
// ==UserScript== // @name 松鼠ADB拨号 // @namespace http://tampermonkey.net/ // @version 1.1 // @description 在智能硬件经销商管理系统中为每个手机号码旁增加一个ADB拨号按钮并隐藏特定电话图标,需要配合ADB Call软件才能拨打号码 // @author 付正则 // @match https://agent.songshuai.com/* // @grant none // @license // ==/UserScript== (function() { 'use strict'; // 使用MutationObserver监控DOM变化,确保动态加载的内容也能被处理 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList' || mutation.type === 'subtree') { handleDOMChanges(); } }); }); // 配置MutationObserver const config = { attributes: true, childList: true, subtree: true, characterData: true }; // 开始观察整个文档 observer.observe(document.body, config); // 初始处理 handleDOMChanges(); // 处理DOM变化,为手机号码旁添加按钮并隐藏特定电话图标 function handleDOMChanges() { // 查找所有包含手机号码的元素 const phoneElements = document.querySelectorAll('span[data-v-7007dcae=""]'); const userDivs = document.querySelectorAll('div.user'); const backupSpans = document.querySelectorAll('span.backup-phone'); const phoneIcons = document.querySelectorAll('a.icon-phone'); // 处理span标签 phoneElements.forEach((phoneElement) => { addCallButton(phoneElement); }); // 处理div.user标签 userDivs.forEach((userDiv) => { const phoneText = userDiv.textContent.trim(); if (isValidPhoneNumber(phoneText)) { addCallButton(userDiv); } }); // 处理span.backup-phone标签 backupSpans.forEach((backupSpan) => { // 获取span中的文本,过滤掉图片等其他元素 const phoneText = backupSpan.textContent.trim().replace('学生-', ''); if (isValidPhoneNumber(phoneText)) { addCallButton(backupSpan); } }); // 隐藏特定的电话图标 phoneIcons.forEach((phoneIcon) => { phoneIcon.style.display = 'none'; }); } // 添加拨号按钮 function addCallButton(element) { // 检查是否已经添加了按钮,避免重复添加 if (!element.nextElementSibling || !element.nextElementSibling.classList.contains('adb-call-button')) { const phoneNumber = element.textContent.trim().replace('学生-', ''); if (isValidPhoneNumber(phoneNumber)) { // 创建ADB拨号按钮 const adbButton = document.createElement('button'); adbButton.textContent = '📲'; adbButton.className = 'adb-call-button'; adbButton.style.marginLeft = '2px'; adbButton.style.padding = '2px 2px'; adbButton.style.color = 'white'; adbButton.style.border = '1px solid white'; adbButton.style.borderRadius = '2px'; adbButton.style.cursor = 'pointer'; // 设置透明背景 adbButton.style.backgroundColor = 'transparent'; // 添加鼠标悬停效果 adbButton.style.transition = 'background-color 0.3s'; adbButton.onmouseover = function() { this.style.backgroundColor = '#4CAF50'; }; adbButton.onmouseout = function() { this.style.backgroundColor = 'transparent'; }; // 添加点击事件 adbButton.onclick = function() { callPhoneNumber(phoneNumber); copyToClipboard(phoneNumber); }; // 将按钮插入到手机号码元素旁边 element.parentNode.insertBefore(adbButton, element.nextSibling); } } } // 验证手机号码格式 function isValidPhoneNumber(phoneNumber) { const phoneRegex = /^1[3-9]\d{9}$/; return phoneRegex.test(phoneNumber); } // 修改后的callPhoneNumber函数 function callPhoneNumber(phoneNumber) { console.log(`正在使用ADB拨打: ${phoneNumber}`); // 发送HTTP请求到本地Python服务器 fetch('http://localhost:5000/call', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ phone: phoneNumber }), }) .then(response => response.json()) .then(data => { console.log('响应:', data); }) .catch(error => { console.error('请求失败:', error); alert('请求失败:', error); }); } // 复制到剪切板 function copyToClipboard(phoneNumber) { navigator.clipboard.writeText(phoneNumber) .then(() => { console.log(`已复制到剪切板: ${phoneNumber}`); // 可选:显示复制成功的提示 //alert(`已复制到剪切板: ${phoneNumber}`); }) .catch(err => { console.error('复制失败:', err); }); } })();