Created
November 16, 2022 06:24
-
-
Save umuthopeyildirim/f2e970cc8ee394de3f58c7a72da0f835 to your computer and use it in GitHub Desktop.
The Google Cloud function that can take screenshots of websites.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const puppeteer = require('puppeteer'); | |
const { Storage } = require('@google-cloud/storage'); | |
const GOOGLE_CLOUD_PROJECT_ID = "portfolio-umut-yildirim"; | |
const BUCKET_NAME = "screenshot-jobs-portfolio-umut-yildirim"; | |
exports.run = async (req, res) => { | |
res.setHeader("content-type", "application/json"); | |
try { | |
const buffer = await takeScreenshot(req.body); | |
let screenshotUrl = await uploadToGoogleCloud(buffer, req.body.name+".png"); | |
res.status(200).send(JSON.stringify({ | |
'screenshotUrl': screenshotUrl | |
})); | |
} catch(error) { | |
res.status(422).send(JSON.stringify({ | |
error: error.message, | |
})); | |
} | |
}; | |
async function uploadToGoogleCloud(buffer, filename) { | |
const storage = new Storage({ | |
projectId: GOOGLE_CLOUD_PROJECT_ID, | |
}); | |
const bucket = storage.bucket(BUCKET_NAME); | |
const file = bucket.file(filename); | |
await uploadBuffer(file, buffer, filename); | |
await file.makePublic(); | |
return `https://${BUCKET_NAME}.storage.googleapis.com/${filename}`; | |
} | |
async function takeScreenshot(params) { | |
const browser = await puppeteer.launch({ | |
args: ['--no-sandbox'] | |
}); | |
const page = await browser.newPage(); | |
await page.goto(params.url, {waitUntil: 'networkidle2'}); | |
const buffer = await page.screenshot(); | |
await page.close(); | |
await browser.close(); | |
return buffer; | |
} | |
async function uploadBuffer(file, buffer, filename) { | |
return new Promise((resolve) => { | |
file.save(buffer, { destination: filename }, () => { | |
resolve(); | |
}); | |
}) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment