在Mac上使用 Automator 和 Python 定制服务

作者: 王炳明 分类: 软件大杂烩 发布时间: 2021-02-28 15:30 热度:1,916

前言

由于我经常会制作一些资源压缩包,在这个资源压缩包里会有一个引流用的二维码

之前手工的时候,一次就要花费5-10 分钟,特别不划算。

因此我就打算借助 Automator + Python 在右键菜单里添加一个按钮,可以一键复制这些重复性的操作。

实际使用效果如下:
在Mac上使用 Automator 和 Python 定制服务

打开 automator

使用 ⌘ + Space,搜索 automator进入 自动操作

在Mac上使用 Automator 和 Python 定制服务

双击选择 快速操作

在Mac上使用 Automator 和 Python 定制服务

编排工作流

要实现我这个功能,首先要有个触发的入口,由于我是右击文件,因此要在资源库里选择 文件和文件夹,由于我在脚本中要获取目标文件的文件名,因此 我还要选择 获取所选的访达项目

所有的逻辑实现,你可以通过 Shell 脚本编写,也可以使用 Python 脚本。

但无论是哪一种语言,都需要在工作流中引入 运行 Shell 脚本 这个模块。

由于我这边使用的是 Python ,所以在 Shell 选项中,选择 /usr/bin/pyhton (写代码时要注意这是 Python2 噢)

在Mac上使用 Automator 和 Python 定制服务

此时你应该已经注意到,运行 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()

为了让脚本在运行完成后,能有个通知,你可以和我一样在最后再添加两个模块

  1. 设定变量的值 :把标准输出的内容赋值给 output 变量
  2. 显示通知:把 output 变量的内容,在通知里打印出来

在Mac上使用 Automator 和 Python 定制服务

一切完成后,使用快捷键 ⌘ + S 进行保存(保存路径如下)
在Mac上使用 Automator 和 Python 定制服务

代码初步编写完成后,并不是一帆风顺的,需要调试来不断改正,

在调试的时候遇到几个问题,在这里记录一下:

  • sys.stdin 传入是文件的绝对路径,而不是文件名,因此要注意处理
  • 由于使用的是 python2,若脚本中有中文,记得在开头要注明 # coding: utf-8
  • 通过使用右键来调试,错误信息显示不全,建议使用 automator 的步进来调试,或者在终端中手动执行脚本来调试。

由于参数传递是使用标准输入的,因此可以直接在终端上借助管道符进行调试。

在Mac上使用 Automator 和 Python 定制服务

文章有帮助,请作者喝杯咖啡?

发表评论