一、代码实现
# !/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import time
import oss2
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from pydantic import BaseModel
from fastapi import FastAPI
app = FastAPI()
class Item(BaseModel):
url = 'default'
pic_name = 'default_url'
def get_image(url, pic_name):
print("python版本号:"+sys.version)
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#添加沙盒模式
chrome_options.add_argument("--no-sandbox")
# 创建浏览器对象
# windows
driver = webdriver.Chrome(executable_path = 'E:/projects/onegolf/onegolf-parent/onegolf-server/onegolf-api/onegolf-python/windows/chromedriver', options=chrome_options)
# linux
# driver = webdriver.Chrome('./chromedriver', options=chrome_options)
# 打开网页
driver.get(url)
# driver.maximize_window()
# 加延时 防止未加载完就截图
time.sleep(1)
# 用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法
width = driver.execute_script("return document.documentElement.scrollWidth")
height = driver.execute_script("return document.documentElement.scrollHeight")
# 将浏览器的宽高设置成刚刚获取的宽高
driver.set_window_size(width, height)
time.sleep(1)
# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
auth = oss2.Auth('ossAccessKeyId', 'ossAccessKeySecret')
# Endpoint以北京为例,其它Region请按实际情况填写。
bucket = oss2.Bucket(auth, 'http://oss-cn-beijing.aliyuncs.com', 'ossBucketName')
bucket.put_object('oss/image/match/'+pic_name, driver.get_screenshot_as_png())
driver.quit()
return_url = 'https://ip/oss/image/match/'+pic_name
print("图片地址:" + return_url)
return return_url
@app.post('/poster')
def calculate(request_data: Item):
print("请求地址:"+request_data.url)
return get_image(request_data.url, request_data.pic_name)
if __name__ == '__main__':
import uvicorn
uvicorn.run(app=app,
host="0.0.0.0",
port=29997,
workers=1)
二、代码讲解
i:__main__方法使用了uvicorn,指定web应用ip和端口。
ii:calculate方法使用fastapi提供了请求路径,在这个接口中接收了两个参数,网页地址(需要截图的网页地址),图片名称(给图片命名),最后直接传递给核心实现方法get_image()方法。
iii:在get_image()一共做了4件事,①驱动谷歌浏览器,②访问网页并截图,③将截图上传至OSS,④组装图片完整路径并返回给调用者