re.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /**
  2. * 在无头浏览器中将一个网页截图保存为图片
  3. */
  4. const fs = require('fs')
  5. const path = require('path')
  6. const axios = require('axios')
  7. const FormData = require('form-data')
  8. const puppeteer = require('puppeteer');
  9. const saveScreenshot = async (url) => {
  10. // 启动浏览器
  11. const browser = await puppeteer.launch({
  12. headless: true
  13. });
  14. // 打开页面
  15. const page = await browser.newPage();
  16. // 设置浏览器视窗
  17. page.setViewport({
  18. width: 1920,
  19. height: 1080,
  20. })
  21. // 地址栏输入网页地址
  22. await page.goto(url, {
  23. // 等界面加载完
  24. waitUntil: 'networkidle0'
  25. });
  26. capchaAndUpload(page);
  27. // 关闭浏览器
  28. // await browser.close();
  29. };
  30. saveScreenshot('file:///Users/admin/Desktop/headless/index.html');
  31. async function capchaAndUpload(page) {
  32. await page.waitForSelector('#title');
  33. let store = await page.evaluate(() => JSON.stringify(localStorage));
  34. store = JSON.parse(store)
  35. let clip = await page.evaluate((scope) => {
  36. let {
  37. x,
  38. y,
  39. width,
  40. height
  41. } = document.getElementById('title').getBoundingClientRect();
  42. window.scope = scope;
  43. return {
  44. x,
  45. y,
  46. width,
  47. height
  48. };
  49. });
  50. const filename = `./preview/${store.questionId}.png`;
  51. const options = {
  52. path: filename,
  53. fullPage: false,
  54. clip
  55. }
  56. await page.screenshot(options);
  57. let buffers = fs.readFileSync(path.resolve(filename));//同步读取文件
  58. let base64 = Buffer.from(buffers).toString('base64');//转为base64编码字符串
  59. const formData = new FormData()
  60. formData.append('questionId', store.questionId)
  61. formData.append('imageBase64', base64)
  62. const reqUrl = 'https://front.mingxuejinbang.com/prod-api/front/questionCollection/uploadQuestionImage';
  63. axios.post(reqUrl, formData)
  64. .then((res) => {
  65. if (res.data.code === 200) {
  66. console.log(store.questionId + '上传成功!')
  67. // 获取下一个问题
  68. page.click('#next');
  69. setTimeout(() => {
  70. capchaAndUpload(page);
  71. }, 1000)
  72. } else {
  73. console.log('出错了')
  74. }
  75. });
  76. }