关于python:再见了搬运党们

51次阅读

共计 4861 个字符,预计需要花费 13 分钟才能阅读完成。

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 keyboard

def 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  ImageGrab
  
  img_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/d…

4.5 模仿触发 PicGo

失常状况下,咱们是通过快捷键来触发 PicGo 去从剪切板中上传图像的,因而想要在程序中激活 PicGo,也只须要在 Python 脚本中模仿键盘动作即可。

具体的代码如下:

from pykeyboard import PyKeyboard

def upload_image_via_picgo():
    k = PyKeyboard()
    k.press_keys(['Command', 'shift', 'p'])

4.6 告诉 Mac 告诉台

下面整个过程都是脚本在后盾默默运行的,如果没有任何告诉,作为用户,很难晓得咱们的图片是否解决好,是否上传胜利,因而倡议加一个告诉的函数。

import os

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

不过其实 PicGo 上传完图片后,自身就会告诉,所以这个告诉并不是必要的,看集体需要啦~

5. 其余设置工作

5.1 设置程序权限

如果你在应用如上脚本时,发现有的键无奈捕获,那肯定是零碎没有给予权限,须要你手动开启。

5.2 设置开机自启

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

这个脚本的内容如下,留神最初那个 & 肯定不能省略。

6. 运行成果

代码全副解析完了,是不是很想看这个程序运行后,能够实现怎么的成果呢?

我录制了个 GIF 动态图,你能够瞧一瞧,真的太不便了。

7. 写在最初

对于有和我一样写博客习惯的敌人来说,我置信这篇文章的思路肯定会有帮忙,脚本我曾经脚本上传好了 (链接:https://wws.lanzous.com/iIDt1…,间接下载即可。

另外,即便你没有防搬运的需要,代码的实现仍然值得学习,比方

  • 如何监听键盘并定义程序的热键?
  • 如何从剪切板中读取图像?
  • 如何给图像增加水印?
  • 如何将图像再放入到剪切板?
  • 如何模仿键盘来激活程序?

在编码的时候,也遇到了不少的坑,有的第三方库并不适用于 Mac,有的有 BUG 至今也还没修复,有的甚至要浏览源码能力晓得如何应用,通过多轮的调试和搜寻,最终才实现这个脚本。


文章最初给大家介绍三个我本人写的在线文档:

第一个文档 :PyCharm 中文指南 1.0 文档

花了两个多月的工夫,整顿了 100 个 PyCharm 的应用技巧,为了让老手可能间接上手,我花了很多的工夫录制了上百张 GIF 动图,有趣味的返回在线文档浏览。

第二个文档 :PyCharm 黑魔法指南 1.0 文档

零碎收录各种 Python 冷门常识,Python Shell 的多样玩法,令人疯狂的 Python 炫技操作,Python 的超具体进阶常识解读,十分实用的 Python 开发技巧等。

第三个文档 :Python 中文指南 1.0 文档

花了三个月工夫写的一本 适宜零根底入门 Python 的全中文教程,搭配大量的代码案例,让初学者对 代码的运作成果有一个直观感触,教程既有深度又有广度,每篇文章都会标内容的难度,是根底还是进阶的,可供读者进行抉择,是一本难得的 Python 中文电子教程。

正文完
 0