怎么用脚本获取剪贴板类型

wen 实用脚本 4

本文目录导读:

怎么用脚本获取剪贴板类型

  1. 浏览器环境
  2. Node.js 环境
  3. Python 环境
  4. 常见剪贴板类型
  5. 完整示例(浏览器版)
  6. 注意事项

浏览器环境

使用 Clipboard API(现代浏览器)

async function getClipboardType() {
  try {
    const clipItems = await navigator.clipboard.read();
    if (clipItems.length > 0) {
      const item = clipItems[0];
      const types = item.types;
      return types;
    }
    return [];
  } catch (err) {
    console.error('读取剪贴板失败:', err);
    return [];
  }
}
// 使用示例
getClipboardType().then(types => {
  if (types.includes('image/png')) {
    console.log('剪贴板包含 PNG 图片');
  } else if (types.includes('text/plain')) {
    console.log('剪贴板包含纯文本');
  } else if (types.includes('text/html')) {
    console.log('剪贴板包含 HTML');
  }
});

使用 ClipboardEvent(监听粘贴事件)

document.addEventListener('paste', (event) => {
  const clipData = event.clipboardData || window.clipboardData;
  const items = clipData.items;
  for (let item of items) {
    console.log(`MIME类型: ${item.type}, 类型: ${item.kind}`);
    // kind 可能是 'string' 或 'file'
  }
  // 获取所有支持的格式
  const types = clipData.types;
  console.log('所有格式:', types);
});

Node.js 环境

使用 clipboardy 库

const clipboardy = require('clipboardy');
// 检查是否有特殊格式(需要额外库)
async function getClipboardTypes() {
  try {
    // 只能获取文本内容
    const text = clipboardy.readSync();
    if (text) {
      return ['text/plain'];
    }
    return [];
  } catch (err) {
    return [];
  }
}

使用 clipboards 库(支持更多格式)

const clipboards = require('clipboards');
async function getClipboardTypes() {
  try {
    const clipboard = new clipboards.Clipboard();
    const data = await clipboard.read();
    const types = Object.keys(data);
    return types;
  } catch (err) {
    console.error('读取失败:', err);
    return [];
  }
}

Python 环境

使用 pyperclip

import pyperclip
def get_clipboard_type():
    try:
        # pyperclip 只能处理文本
        text = pyperclip.paste()
        if text:
            return ['text/plain']
        return []
    except Exception as e:
        print(f"读取剪贴板失败: {e}")
        return []

使用 PIL + pyperclip(检查图片)

import pyperclip
from PIL import ImageGrab
def get_clipboard_types():
    types = []
    # 检查文本
    try:
        text = pyperclip.paste()
        if text:
            types.append('text/plain')
    except:
        pass
    # 检查图片
    try:
        img = ImageGrab.grabclipboard()
        if img:
            types.append('image/png')
    except:
        pass
    return types

常见剪贴板类型

MIME类型 描述 类型标识
text/plain 纯文本 'string'
text/html HTML 'string'
image/png PNG图片 'file'
image/jpeg JPEG图片 'file'
text/uri-list URL 'string'
application/rtf RTF格式 'string'

完整示例(浏览器版)

async function checkClipboardContent() {
  // 请求权限
  try {
    await navigator.permissions.query({ name: 'clipboard-read' });
  } catch (err) {
    console.log('可能需要用户交互触发');
  }
  // 获取剪贴板内容
  const clipItems = await navigator.clipboard.read();
  if (clipItems.length === 0) {
    console.log('剪贴板为空');
    return;
  }
  const clipItem = clipItems[0];
  // 获取所有类型
  const types = clipItem.types;
  console.log('剪贴板包含以下类型:');
  for (const type of types) {
    try {
      if (type.startsWith('text/')) {
        const text = await clipItem.getType(type);
        const reader = new FileReader();
        reader.onload = () => console.log(`${type}: ${reader.result.substring(0, 100)}...`);
        reader.readAsText(text);
      } else if (type.startsWith('image/')) {
        const blob = await clipItem.getType(type);
        console.log(`${type}: 图片大小 ${blob.size} 字节`);
      }
    } catch (err) {
      console.log(`无法读取 ${type}:`, err);
    }
  }
  return types;
}

注意事项

  1. 浏览器权限:Clipboard API 需要用户交互和 HTTPS 环境
  2. 跨平台限制:不同操作系统对剪贴板格式支持不同
  3. 安全考虑:不要读取用户不期望读取的剪贴板内容
  4. 兼容性navigator.clipboard.read() 在较新浏览器才支持

选择哪种方法取决于你的运行环境和需求,浏览器环境推荐使用 Clipboard API,如果需要跨平台支持则考虑第三方库。

抱歉,评论功能暂时关闭!