阿里云OSS智能上传图床

背景:由于现在云储存的发展,许多东西储存到云端更加方便,比如:图片;网上最多的工具就是七牛云以及上传利用工具,但是七牛云需要手持身份证实名认证,所以放弃;其次没有关注腾讯云,所以选择了阿里云,其实优惠力度还是腾讯的比较大;为了避免麻烦,就没有在做迁移了,使用过的可以与阿里云关联的极简图床,但是我们还是需要一张张的拖图片,然后复制makedown连接,这样还是太麻烦了,有一天看到大佬写了一个腾讯云的工具,所以,在学习之余写了这个工具。

程序流程图如下:

功能实现

图片截图以后,从粘贴板获取图片保存到本地Image文件夹下

  • 使用win32clipboard,win32con,PIL模块

  • 1
    2
    3
    4
    import win32con
    import win32clipboard as w
    from PIL import ImageGrab
    from PIL import Image
  • 1
    2
    3
    im = ImageGrab.grabclipboard()      #从粘贴板获取内容
    if isinstance(im,Image.Image): #判断是不是图片
    name = str(time.time()) + ".png"
  • 获取到图片以后判断是否为图片然后保存到本地

  • 这里说明一点:PIL模块是处理图像的,使用PIL处理过图像以后是使图像变小,有利于进行云储存

将图片上传以后的生成的访问地址添加到粘贴板

  • 使用win32clipboard,win32con模块

  • 1
    2
    3
    4
    5
    def setText(self,aString):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_TEXT,aString)
    w.CloseClipboard()
  • 这里存在一个坑:win32con.CF_TEXT这里在Python2中会将所有的字符串添加到粘贴板,早Python3中只会添加首个字符,解决办法:将CF_TEXT替换为CF_UNICODETEXT,如果在Python2中使用CF_UNICODETEXT会出现添加到粘贴板的字符是乱码

上传图片到OSS

  • 使用oss2、shutil 模块,oss2是官方提供的Python OSS SDK,支持Python2、3

  • 1
    2
    3
    4
    5
    6
    def upload(self,file_name,name):
    bucket = oss2.Bucket(oss2.Auth(self.acc_id,self.acc_secret),self.endpoint,self.bucket_name)
    data = bucket.put_object_from_file(key='Blog/'+ name,filename='image/'+ name, headers=None, progress_callback=None)
    str = "https://xxxxxx.xx/" + name

    shutil.rmtree('image')
  • 这里要在外部的 config文件中配置好阿里云提供的:Access Key ID、Access Key Secret、bucket_name、endpoint

  • 说明:由于阿里云的SDK默认不支持文件夹,目录的概念,所以通过添加’/‘来表示在那个文件夹下;又由于没有返回文件访问连接地址的接口,所以通过固有的形式进行组合
  • shutil模块进行清空本地存放已经上传完的的图片(这样会删除文件夹,比遍历更加快速),这一点看个人了,可有可无,也可以使用os模块进行相应的操作。

设置阿里云OSS的接口信息

  • 通过外部的config文件导入

  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    try:
    infoDict = {}
    with open("config.conf","r") as file:
    ApiInfo = file.readlines()
    for info in ApiInfo:
    try:
    if info != "\n" and info != "":
    tmp = info.split("=")
    infoDict[tmp[0].strip()] = tmp[1].strip()
    except Exception as e:
    print u"[-] 请按照要求配置config.conf"
    sys.exit()
    except Exception as e:
    print u"[-] 请在config.conf中配置阿里云 API信息"
    sys.exit()

结果示例

参考文章

更新说明

现在已经修改可以支持python3的环境,详情请看github