PH

获取视频信息

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==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('无法复制文本到剪贴板')
    }
  }
})