这是「进击的Coder」的第 361 篇技术分享

作者:写代码的明哥

来源:Python编程时光

阅读本文大概需要 12 分钟。

1. 明哥苦搬运党久矣

对于我这样经常需要写点文章的技术自媒体来说,很经常早上我才在公众号首发了原创文章,中午就有人同步到了知乎、今日头条等外部平台,并且拿到了该篇文章在这些平台的首发。

今日头条:历史文章被人拿光了首发

平台的首发很重要,以微信的公众号平台来说,一篇文章能否在公众号标原创,就是通过检测是否在公众号平台上首发,如果公众号的文章库里没有搜索到与你文章相似度较高的文章,那么你就可以标原创了。

为了解决了首发的问题,我付费使用了 OpenWrite 这个平台,每个月 20 块钱的费用,一键就可以分发各大平台,非常的省心~

首发固然重要,但有时候也没那么重要。

因为有专门的培训机构(这里就不点名,避免给他们反向营销)就是拿你的文章去给自己的帐号堆干货,吸引关注,他们才不在乎原创不原创,只要文章能发布就行了。

这种人在知乎这种没有原创检测机制的平台,可以活得很好。

之前有一无良培训机构在知乎上生产了 10 几个号,批量搬运我以及一些朋友的原创文章。那时候,我每天都可以举报好多。

知乎:每天举报不完的搬运党

渐渐地,我累了,自己写了几百篇的文章,如果一篇一篇去检查,那我这一天基本啥事都做不了,违权成本实在太高了。

考虑到我的文章都有非常多的图片,为了让这些人在白嫖我文章的同时,也能给我带来点收益(当然人家是不可能付费的,但至少能给我的公众号打打广告也是非常奈斯的)。

于是我就想啊,是不是可以自己写个工具,给自己的每张配图上都加上自己的水印,看他们还盗不盗。

2. 目前的图床管理工具

在开始讲如何利用 Python 来实现我的需求之前 ,我有必要介绍下我的图床管理工具。

我在写文章的时候,主要用到三款工具:

  • Typora :Markdown 文案的编辑

  • Snipaste:非常好用的截图工具

  • PicGo:非常人性的图床管理工具

其中今天的要参与的主角是 PicGo

它对当下主流的图床平台都提供了很好的支持

当我使用了 Snipaste 截图后,再按住快捷键(⌘ ⇧ P),就可以立即将你的图床上传至指定图床,并且将上传后的链接以 markdown 的图片格式复制到剪切板中,你可以直接粘贴使用。

3. 方案的设想

由于这一整工具,我已经使用了三年,各种操作都非常的熟悉,对他们我已经产生了极度的依赖,因此现在我想要实现自动加水印的功能,也一定是建立在这套工具的基础上完成的。

Snipaste 和 PicGo 本身都不支持自定义水印,也不提供第三方插件的开发入口。

Snipaste 和 PicGo 之所以能够在一起工作,是因为有了剪切板这个桥梁,因此想要实现自己的需求,只能从剪切板上寻找突破口。

多余的废话就不多说了,我直接说下我的方案:

  1. 在 Snipaste 将图像放入剪切板后

  2. 由我敲入自定义的热键去触发 Python 脚本去从剪切板中读取图像

  3. 然后使用 PIL 去给该图像加水印,重新放入剪切板中

  4. 接着利用 Python 脚本去自动化触发 PicGo 的快捷键

  5. PicGo 被激活后,就能将带有水印的图片上传到图床

为了让你对这个方案,有一个直观的理解,我特地画了一张流程图,其中虚线就是我自己实现的功能。

4. 代码完整解析

4.1 定义热键并监听键盘

在 Python 中有一个 pynput 库,利用它可以来监听系统的键盘。

在它的官方文档中,很快找到了一个可以自定义热键组合的方案。

from pynput import keyboarddef on_activate():print('Global hotkey activated!')def for_canonical(f):return lambda k: f(l.canonical(k))hotkey = keyboard.HotKey(keyboard.HotKey.parse('<ctrl>+<alt>+h'),on_activate)
with keyboard.Listener(on_press=for_canonical(hotkey.press),on_release=for_canonical(hotkey.release)) as l:l.join()

但是很遗憾的是,这个功能目前来看是有 BUG 的,我在 Mac 上亲测是没有效的,而在 github 的 issue 中也有人在 2020 年8月反应过问题, 没想到到现在还没有解决

虽然它本身提供的组合键监听模式无法使用,但普通的监听模式还是可以使用的,只要有这个做为基础,那我自己造轮子也不难实现组合热键的功能。

第一步:先定义好你的热键:⌘ ⌃ ⌥ P

upload_pic_set = {keyboard.Key.ctrl.value.vk,keyboard.Key.cmd.value.vk,keyboard.Key.alt.value.vk,keyboard.KeyCode(35).vk
}

第二步:监听所有的键盘动作

with keyboard.Listener(on_press=on_press,on_release=on_release) as listener:listener.join()

只要有一个键处于 press 的状态,就往列表中存放这个键

key_list = []def on_press(key):if isinstance(key, keyboard.KeyCode):key_list.append(key.vk)elif isinstance(key, keyboard.Key):key_list.append(key.value.vk)if set(key_list) == upload_pic_set:image = get_image_from_clipboard()new_image = make_watermark(image)put_image_to_clip(new_image)upload_image_via_picgo()notify_to_mac("成功添加水印并上传到图床")

但是一旦有键释放了,就要清空这个列表

def on_release(key):key_list.clear()

每一次按下键都会检查,key_list 是否等于 定义好的快捷键,如果刚好是相等,就可以开始图片的处理逻辑了。

if set(key_list) == upload_pic_set:pass

4.2 从内存中读取图像

PIL 有一个 ImageGrab 模块,在这个模块中有一个 grabclipboard 函数,它实现了从剪切板中读取图像的功能,不过读取的 rgb 格式,由于我们后面加水印时,必须使用 rgba 格式才可以,因此再用 convert 转一下。

  from PIL import  ImageGrabimg_rgb = ImageGrab.grabclipboard()image = img_rgb.convert("RGBA")

4.3  添加水印生成新图像

以下是添加水印的代码,其实可能要注意的一点就是如果你的文字里包含中文,那么选择字体时一定要是中文字体,否则会出现方块字

def make_watermark(image):txt = Image.new('RGBA', image.size, (0, 0, 0, 0))fnt = ImageFont.truetype("/System/Library/Fonts/STHeiti Medium.ttc", 20)draw = ImageDraw.Draw(txt)draw.text(((txt.size[0]-300)//2, txt.size[1]-40), "微信公众号: Python编程时光", font=fnt, fill=(240, 49, 48, 255))draw.text(((txt.size[0]-300)//2, txt.size[1]-70), "未经授权请勿转载", font=fnt, fill=(240, 49, 48,  255))out = Image.alpha_composite(image, txt)return out

4.4 将新图像重新放入剪切板

内置的 io 模块支持在内存中读写 bytes,只要PIL 的 image 对象在 save 的时候保存保存在 BytesIO 对象中,然后通过 pasteboard 模块从 BytesIO 对象中载入数据,就可以实现往剪切板中放入图像的功能。

def put_image_to_clip(image):img_byte_arr = io.BytesIO() pb = pasteboard.Pasteboard()image.save(img_byte_arr, format='PNG')img_byte_arr = img_byte_arr.getvalue()pb.set_contents(img_byte_arr, pasteboard.PNG)

pasteboard 载入的图像只支持 PNG 格式,因此在保存时,一定要指定 PNG。

此外 pasteboard 还支持更多格式的数据,比如 PDF,音频数据,HTML、颜色数据等等

更多格式可查看:https://developer.apple.com/documentation/appkit/nspasteboardtypestring

4.5 模拟触发 PicGo

正常情况下,我们是通过快捷键来触发 PicGo 去从剪切板中上传图像的,因此想要在程序中激活 PicGo,也只需要在 Python 脚本中模拟键盘动作即可。

具体的代码如下:

from pykeyboard import PyKeyboarddef upload_image_via_picgo():k = PyKeyboard()k.press_keys(['Command', 'shift', 'p'])

4.6 通知 Mac 通知台

上面整个过程都是脚本在后台默默运行的,如果没有任何通知,作为用户,很难知道我们的图片是否处理好,是否上传成功,因此建议加一个通知的函数。

import osdef notify_to_mac(message):os.system("osascript -e 'display notification \"{}\"\'".format(message))

不过其实 PicGo 上传完图片后,本身就会通知,所以这个通知并不是必要的,看个人需求啦~

5. 其他设置工作

5.1 设置程序权限

如果你在使用如上脚本时,发现有的键无法捕捉,那一定是系统没有给予权限,需要你手动开启。

5.2 设置开机自启

在这里添加一个开机启动项,而这个 init.sh 是一个 Shell 脚本。

这个脚本的内容如下,注意最后那个 & 一定不能省略。

6. 运行效果

代码全部解析完了,是不是很想看这个程序运行后,可以实现怎样的效果呢?

我录制了个视频,发布在自己的视频号,你可以瞧一瞧,真的不要太方便。

PPPPS别忘了点个关注啊

7. 写在最后

对于有和我一样写博客习惯的朋友来说,我相信这篇文章的思路一定会有帮助。

另外,即使你没有防搬运的需求,代码的实现依然值得学习,比如

  • 如何监听键盘并定义程序的热键?

  • 如何从剪切板中读取图像?

  • 如何给图像添加水印?

  • 如何将图像再放入到剪切板?

  • 如何模拟键盘来激活程序?

在编码的时候,也遇到了不少的坑,有的第三方库并不适用于 Mac,有的有 BUG 至今也还没修复,有的甚至要阅读源码才能知道如何使用,经过多轮的调试和搜索,最终才完成这个脚本。

End

「进击的Coder」专属学习群已正式成立,搜索「CQCcqc4」添加崔庆才的个人微信或者扫描下方二维码拉您入群交流学习。

看完记得关注@进击的Coder

及时收看更多好文

↓↓↓

自己动手丰衣足食

有了这个,我再也不怕文章被别人搬运抄袭了相关推荐

  1. 让文章吸引别人,更吸引自己!

    引文一 为什么自己写不出好的文章?写出的文章不吸引人,更不吸引自己,为什么这样还无动于衷? 引文二 闭门造车还是站在巨人的肩膀上?我们成功的捷径应该如何选择?如何给自己在芸芸众生中找到成长的阶梯. 引 ...

  2. 微信公众平人数多服务器会崩溃吗,微信公众号平台推新功能 再也不怕文章崩溃...

    昨日微信公众平台进行了相关更新,现在平台上的所有帐号都可以在图文编辑查看图文历史版本.这一改动为公众号运营者带来了极大的便利,在多人同时操作.多个电脑同时浏览时,再也不用担心素材内容一刷新就没了.不过 ...

  3. 一行代码制作自己的QQ/微信二维码,还可以制作动态的哟~(小白再也不用去求别人了)

    今天,我们要用Python制作一个炫酷的二维码,还可以是动得哟 废话少说,我们开始制作吧~ 文章目录 安装MyQR CMD生成图片二维码 用Python来生成(生成失败的朋友看过来) 做一个动图二维码 ...

  4. 如何将Markdown文章轻松地搬运到微信公众号并完美地呈现代码内容

    相信有很多童鞋跟我一样,热衷于用Markdown来编写文章.由于其简单的语法和清晰的渲染效果,受到广大码农朋友们的推崇.但是,当我们想维护起自己的公众号时,公众号编辑器往往让我们费劲了脑汁.本人尝试了 ...

  5. Kofi's back

    不知从什么时候开始,自己变得越来越懒,博客好久没更新,从5月份回学校论文答辩以来,这几个月,也发生了很多事情,7至9月份三个月几乎没有碰代码,更别说更新博客. 我想说,人在追求一些新的事物的时候,却无 ...

  6. 为什么我不在微信公众号上写文章

    作者: 陈浩 原文: https://coolshell.cn/articles/17391.html 很多朋友问我为什么不在微信公众号上写文章.我都没有直接回答,老实说,我也是扭扭捏捏的,才去开了个 ...

  7. 如何防止博客文章被窃取

    写文章的优点: 1.整理自己的学习过程,思想心得. 2.看到自己的文章被别人转载了,心理愉悦,说明作者写的文章有价值,可以帮助他人. 缺点: 1.花费时间和精力. 2.说是抄袭别人.明明自己是原创,别 ...

  8. 一篇我觉得不错的文章

    完全用Linux工作,摈弃Windows 作者:懒人 文章来源:网络 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个人都想用的. ...

  9. 计算机 文笔不好的论文,文笔差怎么写出好文章

    图片来源于花瓣网 随着移动互联网的深度普及,很多行业都在发生巨大的变化,新媒体与传统媒体形成对比补充,知识网红与娱乐明星形成类同差异. 众多内容创作者如雨后春笋般争相露出,最出众的就是那些坚持思考,坚 ...

最新文章

  1. Linux上部署、安装nodejs
  2. Webservice入门教程_用CXF编写基于Spring的WebService
  3. 我年薪百万,孩子教育花掉一半
  4. 显示隐藏dataGrid控件的标题栏,改变标题栏高度.
  5. vc ctabctrl页面切换事件_10191025一周PE/VC事件回顾|猿辅导获得10亿美元G2轮融资
  6. 统计学怎么求加权指数_统计学——指数
  7. 算法设计与分析(第2版)屈婉玲 刘田 张立昂 王捍贫编著 第四章课后习题答案
  8. Oracle11g64位安装步骤
  9. jena4.1.0安装及使用
  10. 微信java转盘抽奖代码_jquery手机端抽奖代码_微信jquery实现大转盘抽奖代码特效...
  11. 旧电脑更新win10日记
  12. 实训日记(二)——分镜
  13. 悉尼大学理学院计算机科学,澳洲悉尼大学理学院中国留学生
  14. 动态规划 最长不下降子序列
  15. 【知识图谱系列】动态知识图谱表示学习综述 | 十篇优秀论文导读
  16. VS Code 知乎 Live,参与人数突破 1000 人!
  17. 记第十六次CCF CSP考试的经历
  18. Hybrd A*(混合A*)算法
  19. 文件服务器ipc,看图理解进程间通信IPC
  20. Android系统字体规范

热门文章

  1. linux cpu运行模式,Linux上的32位,64位CPU操作模式
  2. 贵金属现货白银如何呢?
  3. 5000元的家用计算机,家用笔记本电脑5000左右怎么选
  4. django admin 登录用户名密码错误提示
  5. android 铃声管理器,android RingtoneManager 铃声管理器
  6. 微擎按照UID获取用户绑定手机号
  7. 前端解决粘贴过来的东西不触发键盘事件@令狐张豪
  8. python-爬虫:取qq号中各分组成员信息存入数据库,并将qq头像下载保存到文件夹,图片命名为qq号(实例3)...
  9. 在java中实现access数据库的远程访问
  10. (转) ios苹果开发者账号申请