您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
获取视频信息
// ==UserScript== // @name PH // @namespace http://tampermonkey.net/ // @version 2025-05-03 // @description 获取视频信息 // @author cc // @match *://*.pornhub.com/* // @icon https://www.google.com/s2/favicons // @grant none // @license MIT // ==/UserScript== ;(function () { 'use strict' const styleStr = `*{padding:0;margin:0;color:#000;}#float-nav{position:fixed;top:50%;right:2%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;z-index:9999}.nav-btn{width:50px;line-height:50px;border-radius:50%;background-color:#007bff;color:#fff;border:none;cursor:pointer;margin:5px 0}.dialog-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.1);display:flex;justify-content:center;align-items:center;z-index:10000}.dialog{position:relative;background:white;padding:3% 4%;display:flex;flex-direction:column;align-items:center;border-radius:8px;max-width:85%;min-width:60%;max-height:60%;min-height:10%;box-shadow:0 2px 10px rgba(0,0,0,0.1)}.dialog-title{font-size:16px}#textToCopy{width:97%;margin:8px 0;max-height:90%;overflow:scroll;white-space:pre}.btn-bar{display:flex;width:150px;margin:0 auto;justify-content:space-between}.dialog-btn{width:60px;line-height:30px;background-color:#007bff;color:#fff;border:none;border-radius:5px;cursor:pointer}` const data = { model: '', works: [] } // 创建样式标签并插入页面 function insertStyle() { const styleEl = document.createElement('style') styleEl.textContent = styleStr document.head.appendChild(styleEl) } function main() { // 插入样式 insertStyle() // 创建悬浮导航并插入页面 const floatNav = document.createElement('div') floatNav.id = 'float-nav' floatNav.innerHTML = ` <button class="nav-btn" id="titleBtn">标题</button> <button class="nav-btn" id="urlBtn">链接</button>` document.querySelector('body').appendChild(floatNav) // 获取操作按钮并绑定点击事件 const titleBtn = document.querySelector('#titleBtn') const urlBtn = document.querySelector('#urlBtn') titleBtn.addEventListener('click', () => getTitle(), false) urlBtn.addEventListener('click', () => getUrl(), false) } main() function init() { // 获取数据 const ul = document.querySelector('#mostRecentVideosSection') const lis = Array.from(ul.children) const currentPageEl = document.querySelector('.page_current span') const currentPage = Number(currentPageEl.textContent) const model = document.querySelector('.name h1').textContent.trim() data.model = model data.works = getVideoUrl(lis) } function getTitle() { init() let titles = '' data.works.forEach(item => (titles += `${item.title}\n`)) const dialogContent = { count: data.works.length, text: titles } createDialog(dialogContent, () => console.log('弹窗已关闭')) } function getUrl() { init() let urls = '' data.works.forEach(item => (urls += `${item.url}\n`)) const dialogContent = { count: data.works.length, text: urls } createDialog(dialogContent, () => console.log('弹窗已关闭')) } function getVideoUrl(list = []) { const result = [] list.forEach(item => { const a = item.querySelector('a') const img = a.querySelector('img') const url = a.href const title = removeEmojis(a.dataset.title).trim() const cover = img.src const date = parseDate(img.src) result.push({ url, title, cover, date }) }) console.log(data.works) return result } function removeEmojis(str) { const reg = /[\u{1F600}-\u{1F64F}\u{1F300}-\u{1F5FF}\u{1F680}-\u{1F6FF}\u{1F1E0}-\u{1F1FF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu return str.replace(reg, '').replace(/ /g, '') } function parseDate(url) { const dateStr = url.match(/\/20\d{4}\/\d{2}\//)[0] const date = dateStr.match(/\d/g).join('') return date } // 创建dialog提示框 function createDialog(dialogContent, onClose) { // 创建弹窗覆盖层 const overlay = document.createElement('div') overlay.className = 'dialog-overlay' // 创建弹窗内容 const dialog = document.createElement('div') dialog.className = 'dialog' // 创建关闭按钮 const closeBtn = document.createElement('button') closeBtn.className = 'dialog-btn' closeBtn.innerHTML = '关闭' closeBtn.onclick = function () { document.body.removeChild(overlay) if (onClose) onClose() } // 创建复制按钮 const copyBtn = document.createElement('button') copyBtn.className = 'dialog-btn' copyBtn.innerHTML = '复制' copyBtn.onclick = function () { clickCopy(dialogContent.text) } // 添加消息内容 const textEl = document.createElement('p') textEl.id = 'textToCopy' textEl.textContent = dialogContent.text // 添加布局P const btnBar = document.createElement('div') btnBar.className = 'btn-bar' // 添加标题 const h3 = document.createElement('h3') h3.textContent = `一共有【${dialogContent.count}】条数据` h3.className = 'dialog-title' // 组装弹窗 btnBar.appendChild(copyBtn) btnBar.appendChild(closeBtn) dialog.appendChild(h3) dialog.appendChild(textEl) dialog.appendChild(btnBar) overlay.appendChild(dialog) // 将弹窗添加到文档中 document.body.appendChild(overlay) } // 点击复制 async function clickCopy(text) { try { // 尝试将文本复制到剪贴板 await navigator.clipboard.writeText(text) // 复制成功,更新状态显示 alert('文本已复制到剪贴板!') } catch (err) { // 复制失败,更新状态显示 alert('无法复制文本到剪贴板') } } })