markdown贴图自动化处理.

  • 自动化处理剪贴板图片,上传到图床,粘贴url到剪贴板.

  • 更新

    1
    2
    3
    4
    19.04.11 初版
    19.04.13 因win下GDK装不上,更换库,支持linux/win
    19.04.13 加上错误处理,只打印,防止脚本中止
    19.04.30 修正错误
  • 思路参考:

    http://weishu.me/2015/10/16/simplify-the-img-upload-in-markdown/
    https://github.com/wuchangfeng/markdown-helper

导语

  • 写2-3-4树+红黑树时,贴图比前面几篇多了好多,一张一张上传到图床,简直要了命.
  • 自动化才是王道,只能抽出时间写了这个小脚本,舒服多了.
  • 代码在 sm-markdown
  • 在 win10 上面,尝试 GDK 实在是各种问题,只能换用
  • upimage.py linux.
  • upimage2.py win/mac
  • 如果没有别的变动,应该暂时是最终版本了.

方案

  • 需求

    • 截图到剪贴板即自行上传到图床.url直接复制到剪贴板,做到真正一步到位.
    • 不留临时文件.
    • 主要支持linux, win附带不要改动太大.
    • 兼容 linux/win,这一点非常难…到现在还没找到合适的..
  • 开始找到了markdown-helper,作者思路很好,但拖动到.py文件,还是有些麻烦.但这个可以在 linux/win 下通用.

  • 之后历经搜索简化markdown写作中的贴图流程,但 linux 下没法用…

  • 动手自己写吧.

    • py的库对linux下剪贴板支持有点差,pyperclip只支持文本,而其他的要安装额外的软件,通过py进入终端使用.
    • 虽然比较笨重,还是上了 gtk ,gtk原本就是 GUI 的开发,其剪贴板功能绝对够用了,还附带跨平台,虽然 win 下安装比较笨重,何止笨重啊,安装完各种问题,有这时间,我 GUI 都写好了.
    • 这次借用的是 PIL 的 ImageGrab 模块, PIL 年久失修,需要安装对应 python3 的版本 Pillow.
  • GTK(linux)

    • GTK 安装
    • GTK 剪贴板API
  • pillow(win/mac)

    • pip install pillow
    • 暂时用不到其他的功能,故略.
  • 其他模块借用之 .md 的代码.

程序

  • 暂时没有使用剪贴板变动通知,要同时支持linux/win通知很难找,目前是1s轮寻.

  • 图床还是SM.MS

  • 粘贴到剪贴板的还是图片的 url,除markdown外,其他场景下使用,就没有转换成 Markdown 的图片格式.

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    #!/usr/bin/python3
    import requests
    import json
    from glob import glob

    import time
    import os

    from PIL import ImageGrab
    import pyperclip

    params = {'format': 'json', 'ssl': True}
    prefix = 'https://sm.ms/api'

    image_name = "tmp.jpg"


    # 上传图片
    def api_upload(image):
    '''upload an image file'''
    files = {'smfile': open(image, 'rb')}
    resp = requests.post('{}/upload'.format(prefix),
    files=files,
    params=params)
    return resp.text


    # 上传图片
    def upload(filename):
    images = glob(filename)
    if not images:
    print('%s not image' % (filename))
    for image in images:
    # upload an image
    resp = json.loads(api_upload(image))
    # 返回上传图片的url
    if resp['code'] == 'error':
    # 打印错误信息
    print('uploda error msg:%s' % (resp['msg'].lower()))
    return None
    else:
    # print('%s upload success' % (filename))
    return resp['data']['url']


    # 剪贴板获取图片
    def get_image_Clipboard():
    image = ImageGrab.grabclipboard()
    if image:
    image.save(image_name, 'JPEG')
    return True
    else:
    return False


    # url复制到剪贴板
    def set_url_Clipboard(url):
    if isinstance(url, str):
    pyperclip.copy(url)
    else:
    print('url type error')


    # 删除临时文件
    def del_flie(fliename):
    os.remove(fliename)


    if __name__ == "__main__":
    while True:
    if is_image_exsit(image_name) or get_image_Clipboard():
    try:
    url = upload(image_name)
    set_url_Clipboard(url)
    print(url)
    del_flie(image_name)
    except BaseException as e:
    print('upimage falid')
    finally:
    pass

    time.sleep(1)