# coding=utf-8 import flask import imgkit import json import os import oss2 import random from flask import request # 创建一个服务,把当前这个python文件当做一个服务 server = flask.Flask(__name__) # 端口配置 port = 5008 host = '127.0.0.1' debug = True # 工具配置 tool_path = r'/usr/local/bin/wkhtmltoimage' # tool_path = r'E:\wkhtmltopdf\bin\wkhtmltoimage.exe' # OSS配置 oss_end_point = 'oss-cn-shanghai.aliyuncs.com' oss_bucket = 'hzchart' oss_key_id = 'LTAIFMZYQhS2BTvW' oss_key_secret = '12kk1ptCHoGWedhBnKRVW5hRJzq9Fq' resource_host = 'https://hzstatic.hzinsights.com/' # server.config['JSON_AS_ASCII'] = False # @server.route()可以将普通函数转变为服务 登录接口的路径、请求方式 @server.route('/htm2img', methods=['post']) def htm2img(): # 获取参数 req_data = request.get_json() if req_data is None: return json.dumps({'code': 5004, 'msg': '参数有误', 'data': ''}, ensure_ascii=False) # 参数校验 contents = req_data['html_content'] if contents is None or contents == '': return json.dumps({'code': 5004, 'msg': '获取html文本内容失败', 'data': ''}, ensure_ascii=False) width = req_data['width'] if width <= 0: return json.dumps({'code': 5004, 'msg': '图片宽度有误', 'data': ''}, ensure_ascii=False) height = req_data['height'] if height <= 0: return json.dumps({'code': 5004, 'msg': '图片长度有误', 'data': ''}, ensure_ascii=False) # 生成html文件 rand_name = get_rand_string() html_path = 'html/' + rand_name + '.html' res = html2file(contents, html_path) if not res: return json.dumps({'code': 5004, 'msg': '生成html失败', 'data': ''}, ensure_ascii=False) # html转图片 img_name = rand_name + '.jpg' img_path = html_to_img(html_path, img_name, width, height) if img_path == '': return json.dumps({'code': 400, 'msg': '生成图片失败', 'data': ''}, ensure_ascii=False) # 上传OSS upload_dir = 'static/images/yb/htm2img/' save_path = upload_dir + img_name upload_res = upload_oss_file(save_path, img_path) # 清除本地生成的html及图片 clear_local_file(img_path, html_path) if upload_res.status == 200: resource_url = resource_host + save_path return json.dumps({'code': 200, 'msg': '生成图片成功', 'data': resource_url}, ensure_ascii=False) else: return json.dumps({'code': 400, 'msg': '生成图片失败', 'data': ''}, ensure_ascii=False) # html文件转为图片 def html_to_img(html_url, img_name, width=100, height=100): path_wkimg = tool_path # 工具路径 cfg = imgkit.config(wkhtmltoimage=path_wkimg) opt = {"width": width, "height": height, "quality": 100, "format": "jpg"} img_path = 'img/' + img_name imgkit.from_file(html_url, img_path, config=cfg, options=opt) try: os.path.isfile(img_path) return img_path except Exception as e: # print(e) return '' # 上传图片至OSS def upload_oss_file(save_path, file_path): auth = oss2.Auth(oss_key_id, oss_key_secret) bucket = oss2.Bucket(auth, oss_end_point, oss_bucket) return bucket.put_object_from_file(save_path, file_path) # 生成指定长度的随机字符串 def get_rand_string(size=28): random_str = '' base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789' length = len(base_str) - 1 for i in range(size): random_str += base_str[random.randint(0, length)] return random_str # 清除本地生成的文件 def clear_local_file(img_path, html_path): try: os.remove(img_path) os.remove(html_path) return True except OSError as e: # print(e) return False # html文本生成文件 def html2file(content, file_path): try: f = open(file_path, 'w', encoding='UTF-8') f.write(content) f.close() return True except Exception as e: # print(e) return False if __name__ == '__main__': server.run(debug=debug, port=port, host=host)