#!/usr/bin/env python3 import re import json import requests import requests.exceptions from base64 import b64encode from .helpers import get_logger logger = get_logger(__name__) class BasePhotoStore(object): def upload_image(self, filename, **kwargs): raise Exception("Not Implemented") class Imgur(BasePhotoStore): url = "https://api.imgur.com/3/image?_format=json" def __init__(self, client_id, **kwargs): self.client_id = client_id def upload_image(self, filename=None, filedata=None, **kwargs): if filedata is None: with open(filename, 'rb') as f: b64img = b64encode(f.read()) else: b64img = b64encode(filedata) headers = {"Authorization": "Client-ID %s" % self.client_id} try: r = requests.post( self.url, headers=headers, data={ 'image': b64img, 'type': 'base64', }, timeout=5, ) except requests.exceptions.Timeout: logger.error("Timeout uploading to Imgur") return None except: logger.exception("Unknown errror uploading to Imgur") return None try: ret = json.loads(r.text) except: return None if ret.get('status', None) != 200 or ret.get('success', False) != True: logger.error( "Error: Imgur returned error, {}".format(ret.get('data', '')) ) return None link = ret.get('data', {}).get('link', None) return link if link is None else re.sub(r'^http:', 'https:', link) class VimCN(BasePhotoStore): url = "https://img.vim-cn.com/" def __init__(self, **kwargs): pass def upload_image(self, filename=None, filedata=None, **kwargs) -> str: if filedata is None: files = {"image": open(filename, 'rb')} else: files = {"image": filedata} try: r = requests.post(self.url, files=files, timeout=5) except requests.exceptions.Timeout: logger.error("Timeout uploading to VimCN") return None except: logger.exception("Unknown errror uploading to VimCN") return None if not r.ok: return None return r.text.strip() if __name__ == "__main__": import sys imgur = Imgur(sys.argv[1]) print(imgur.upload_image(sys.argv[2])) # vim: ts=4 sw=4 sts=4 expandtab