在Mac上使用 Automator 和 Python 定制服务
前言
由于我经常会制作一些资源压缩包,在这个资源压缩包里会有一个引流用的二维码
之前手工的时候,一次就要花费5-10 分钟,特别不划算。
因此我就打算借助 Automator + Python 在右键菜单里添加一个按钮,可以一键复制这些重复性的操作。
实际使用效果如下:
打开 automator
使用 ⌘ + Space,搜索 automator
进入 自动操作
。
双击选择 快速操作
编排工作流
要实现我这个功能,首先要有个触发的入口,由于我是右击文件,因此要在资源库里选择 文件和文件夹
,由于我在脚本中要获取目标文件的文件名,因此 我还要选择 获取所选的访达项目
。
所有的逻辑实现,你可以通过 Shell 脚本编写,也可以使用 Python 脚本。
但无论是哪一种语言,都需要在工作流中引入 运行 Shell 脚本
这个模块。
由于我这边使用的是 Python ,所以在 Shell
选项中,选择 /usr/bin/pyhton
(写代码时要注意这是 Python2 噢)
此时你应该已经注意到,运行 Shell 脚本
右边有一个选项问你:参数要如何传入脚本内呢?
默认选项是:传递到 stdin,也就是标准输入中。
因此我要想在 python 脚本中获取 目标文件的文件名,需要从 sys.stdin 中去获取。
整个脚本的内容如下,若有需要,可以参考
# coding: utf-8
import os
import sys
import shutil
import commands
def encrypt_file():
# 创建新目录,并移动文件到新目录中
new_dir_name, ext = os.path.splitext(file_name)
os.mkdir(new_dir_name)
shutil.copy(src=file_name, dst=new_dir_name)
os.chdir(new_dir_name)
# 加密压缩
zip_cmd = '/usr/bin/zip -P "iswbm.com" "{}.zip" "{}"'.format(new_dir_name, file_name)
commands.getstatusoutput(zip_cmd)
os.remove(file_name)
# 下载提示图片
wget_cmd = '/opt/homebrew/bin/wget -q http://image.iswbm.com/get_zip_pass_04.png -O 解压密码,看这里.png'
commands.getstatusoutput(wget_cmd)
# 无密压缩
os.chdir("..")
zip_cmd_no_pass = '/usr/bin/zip -r "{}-res.zip" "{}"'.format(new_dir_name, new_dir_name)
commands.getstatusoutput(zip_cmd_no_pass)
shutil.rmtree(new_dir_name)
print("Success!")
def encrypt_file_folder():
os.mkdir("tmp")
shutil.copytree(src=dir_name, dst="tmp/{}".format(dir_name))
os.chdir("tmp")
# 加密压缩
zip_cmd = '/usr/bin/zip -r -P "iswbm.com" "{}.zip" "{}"'.format(dir_name, dir_name)
commands.getstatusoutput(zip_cmd)
shutil.rmtree(dir_name)
# 下载提示图片
wget_cmd = '/opt/homebrew/bin/wget -q http://image.iswbm.com/get_zip_pass_04.png -O 解压密码,看这里.png'
commands.getstatusoutput(wget_cmd)
# 无密压缩
zip_cmd_no_pass = '/usr/bin/zip -r "{}-res.zip" ./'.format(dir_name, dir_name)
commands.getstatusoutput(zip_cmd_no_pass)
os.remove("解压密码,看这里.png")
# 移动压缩包到外面
shutil.copyfile("{}-res.zip".format(dir_name), "../{}-res.zip".format(dir_name))
os.chdir("..")
shutil.rmtree("tmp")
print("Success!")
for target_path in sys.stdin:
dir_path, file_or_dir_name = os.path.split(target_path.strip())
os.chdir(dir_path)
if os.path.isfile(target_path.strip()):
file_name = file_or_dir_name
encrypt_file()
else:
dir_name = file_or_dir_name
encrypt_file_folder()
为了让脚本在运行完成后,能有个通知,你可以和我一样在最后再添加两个模块
设定变量的值
:把标准输出的内容赋值给output
变量显示通知
:把output
变量的内容,在通知里打印出来
一切完成后,使用快捷键 ⌘ + S 进行保存(保存路径如下)
代码初步编写完成后,并不是一帆风顺的,需要调试来不断改正,
在调试的时候遇到几个问题,在这里记录一下:
- sys.stdin 传入是文件的绝对路径,而不是文件名,因此要注意处理
- 由于使用的是 python2,若脚本中有中文,记得在开头要注明
# coding: utf-8
- 通过使用右键来调试,错误信息显示不全,建议使用 automator 的步进来调试,或者在终端中手动执行脚本来调试。
由于参数传递是使用标准输入的,因此可以直接在终端上借助管道符进行调试。