本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Serverless Devs
Serverless Devs是一个开源开放的Serverless开发者平台,您无需关心底层资源。通过Serverless Devs,您不仅可以可插拔式地使用Serverless的服务和框架,也可以参与组件和插件的开发,提高运维效率。同时,您也可以更简单、快速地开发、创建、测试和部署项目,实现项目全生命周期的管理。
# 安装
npm install @serverless-devs/s -g
# 验证是否安装成功
s -v
# 初始化项目(YAML模式)
s init node.js12-http -d fc-hello-world-demo
# 初始化项目(非YAML模式)
s init node.js12-http -d fc-hello-world-demo
# 构建、本地调试(HTTP/事件)、远程调试、部署
s build
s local start/s local invoke
s invoke
s deploy
# 删除应用
s remove service
# 初始化puppeteer-nodejs项目
s init puppeteer-nodejs
示例
1. 在线IDEA,发送HTTP请求(serverless)
index.js
var getRawBody = require('raw-body');
var getFormBody = require('body/form');
var body = require('body');
const http = require('http');
exports.handler = (req, resp, context) => {
console.log('hello world');
getRawBody(req, function(err, body) {
(async () => {
const httpGet = (from,to,date) => {
return new Promise((resolve, reject) => {
var options = {
hostname: 'api.ipify.org',
port: 80,
path: '/',
method: 'GET'
};
http.request(options, res => {
res.setEncoding('utf8');
let body = '';
res.on('data', chunk => body += chunk);
res.on('end', () => {
resolve(body)
});
}).on('error', reject).end();
});
};
resp.send(await httpGet());
})()
});
};
2. 基于 puppeteer 的截图(ServerlessDevs)
index.js
const fs = require('fs');
const puppeteer = require('puppeteer');
module.exports.handler = function (request, response, context) {
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
]
});
let url = request.queries['url'];
if (!url) {
url = 'https://www.baidu.com';
}
if (!url.startsWith('https://') && !url.startsWith('http://')) {
url = 'http://' + url;
}
const page = await browser.newPage();
await page.emulateTimezone('Asia/Shanghai');
await page.goto(url, {
'waitUntil': 'networkidle2'
});
let path = '/tmp/example';
let contentType;
if (request.queries['pdf']) {
contentType = 'application/pdf';
await page.pdf({
path: path,
displayHeaderFooter: false
});
} else {
contentType = 'image/png';
await page.screenshot({ path: path, fullPage: true, type: 'png' });
}
await browser.close();
response.setStatusCode(200);
response.setHeader('content-type', contentType);
response.send(fs.readFileSync(path))
})().catch(err => {
response.setStatusCode(500);
response.setHeader('content-type', 'text/plain');
response.send(err.message);
});
};
3. 基于 puppeteer 的截图(代理)
html2png.js
const puppeteer = require('puppeteer')
try {
(async () => {
const proxyUrl = 'http://host:12323'
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
`--proxy-server=${proxyUrl}`
]
})
const url = 'https://whatismyipaddress.com'
const page = await browser.newPage()
await page.authenticate({
username: 'username',
password: 'password'
})
await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36')
await page.emulateTimezone('Asia/Shanghai')
await page.goto(url, {
waitUntil: 'networkidle2', timeout: 120000
})
await page.screenshot({ path: 'html2png.png', fullPage: true, type: 'png' })
await browser.close()
})()
} catch (err) {
console.error(err)
}
参考
serverless-devs www.serverless-devs.com
Serverless Devs github.com/Serverless-…
Serverless Devs Registry github.com/devsapp
Serverless入门与实战 ucc-private-download.oss-cn-beijing.aliyuncs.com/193e4522c18…
Puppeteer项目在阿里云函数计算的实践 github.com/devsapp/sta…
Puppeteer examples github.com/checkly/pup…