要查看当前剪切板的数据,我们可以使用Free Clipboard Viewer
:https://freeclipboardviewer.com/cn/
例如我们将微信输入框中的字符串复制到剪切板,可以看到原始数据是下面这样:
下面我们看看如何使用Python读取任意剪切板的内容:
import win32clipboard
def get_predefined_formats():
import win32con
predefined_formats = {}
for name in dir(win32con):
if not name.startswith('CF_'):
continue
value = getattr(win32con, name)
if isinstance(value, int) and value not in predefined_formats:
predefined_formats[value] = name
return predefined_formats
PREDEFINED_FORMATS = get_predefined_formats()
def get_clipboard_data() -> dict:
data = {}
win32clipboard.OpenClipboard()
try:
clipboard_format = 0
while True:
clipboard_format = win32clipboard.EnumClipboardFormats(clipboard_format)
if clipboard_format == 0:
break
format_name = PREDEFINED_FORMATS.get(clipboard_format)
if format_name is None:
format_name = win32clipboard.GetClipboardFormatName(clipboard_format)
data[format_name] = win32clipboard.GetClipboardData(clipboard_format)
finally:
win32clipboard.CloseClipboard()
return data
调用get_clipboard_data函数,即可每种格式对应的内容:
if __name__ == '__main__':
clipboard_data = get_clipboard_data()
print("clipboard_data", clipboard_data)
结果如下:
clipboard_data {'WeChat_RichEdit_Format': b'<WeChatRichEditFormat><EditElement type="2" shortcut="[\xe5\x8f\xaf\xe6\x80\x9c]" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="[\xe5\x91\xb2\xe7\x89\x99]" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></WeChatRichEditFormat>\x00', 'RTX_RichEdit_Format': b'<RTXRichEditFormat><EditElement type="2" shortcut="[\xe5\x8f\xaf\xe6\x80\x9c]" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="[\xe5\x91\xb2\xe7\x89\x99]" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></RTXRichEditFormat>\x00', 'QQ_Unicode_RichEdit_Format': b'<QQRichEditFormat><EditElement type="2" shortcut="/:8*" filepath="" /><EditElement type="0"><![CDATA[\xe4\xbd\xa0\xe5\xa5\xbd]]></EditElement><EditElement type="2" shortcut="/::D" filepath="" /><EditElement type="0"><![CDATA[\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88]]></EditElement></QQRichEditFormat>\x00', 'CF_UNICODETEXT': '你好哈哈哈', 'CF_ENABLETEMPLATE': b'\x04\x08\x00\x00', 'CF_SCREENFONTS': b'\xc4\xe3\xba\xc3\xb9\xfe\xb9\xfe\xb9\xfe', 'CF_OEMTEXT': b'\xc4\xe3\xba\xc3\xb9\xfe\xb9\xfe\xb9\xfe'}
要解析微信的这种格式的数据,我们下面给个示例:
def parse_weixin_clipboard_data(data):
wechat_rich_edit_data = data.get("WeChat_RichEdit_Format")
if wechat_rich_edit_data is None:
return data.get("CF_UNICODETEXT")
xml_str = wechat_rich_edit_data.decode("u8").strip('\x00')
root = ET.fromstring(xml_str)
result = ""
for element in root.findall('EditElement'):
element_type = element.get('type')
if element_type == '2':
result += element.get('shortcut')
elif element_type == '0':
result += element.text
elif element_type == '9':
result += element.get('filepath')
elif element_type == '1':
result += f"![image]({element.get('filepath')})"
return result
可以解析几种常见的情况,图片路径解析到Markdown格式。
如果我们在微信中复制了一张单独的图片,可以使用下面的函数,解析图片路径或图片内容:
def parse_image_data(image_data):
image_data = image_data.get("CF_DIB")
if image_data is None:
return
image = BmpImagePlugin.DibImageFile(io.BytesIO(image_data))
return image
def parse_weixin_image_path(data):
return data.get("CF_HDROP")
使用示例:
if __name__ == '__main__':
clipboard_data = get_clipboard_data()
clipboard_data = get_clipboard_data()
print("parse_weixin_image_path", parse_weixin_image_path(clipboard_data))
print("parse_image_data", parse_image_data(clipboard_data))
结果示例:
parse_weixin_image_path ('D:\\weixinData\\WeChat Files\\wowangzhouming\\FileStorage\\Temp\\1724386471543.jpg',)
parse_image_data <PIL.BmpImagePlugin.DibImageFile image mode=RGB size=315x174 at 0x266EB4E17F0>