使用puppeteer擷取網頁畫面

前陣子因為想把特定的youtube
的對話訊息轉發到twitter
上,但是只把文字轉出去又覺得哪裡感覺不對,所以就打算把訊息做成一張圖後再上傳,而且這樣也可以附上發言人的頭像。
這邊就先寫擷取網頁畫面的部分,流程大概是這樣:
- 讀取聊天室訊息
- 取得到需要轉發的訊息
- 呼叫
HTTP API
,傳入網址
、視窗寬度
、視窗高度
、等待時間
- 收到請求
- 啟動瀏覽器
- 開啟網頁
- 等待網頁讀取完成
- 截圖
- 產生
base64
字串並回傳
這次是用nodejs
開發:
這邊定義了POST
方法/shot
,會讀取下列參數:
- link = 網址
- w = 視窗寬度
- h = 視窗高度
- f = 是否全頁截圖
- ms = 需要等待的毫秒數
puppeteer
還可以檢查頁面的變數相關的值或操作,不過這邊還不需要所以沒仔細去試。
接下來弄個Dockerfile
:
FROM node:17-alpine
RUN apk add --no-cache \
chromium \
nss \
freetype \
harfbuzz \
ca-certificates \
ttf-freefont \
nodejs \
yarn \
font-noto-cjk \
font-noto-emoji
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
RUN yarn add puppeteer@10.0.0
RUN yarn add express
RUN addgroup -S pptruser && adduser -S -g pptruser pptruser \
&& mkdir -p /home/pptruser/Downloads /app \
&& chown -R pptruser:pptruser /home/pptruser \
&& chown -R pptruser:pptruser /app
USER pptruser
WORKDIR /app
COPY ./server.js /app/server.js
RUN yarn
EXPOSE 8080
當時忘記產生package.json
了,而是直接在dockerfile
直個yarn add
。
接下來就是建置:
然後啟動容器:
-v
參數是用來測試用的。
最後就可以使用curl
來測試:
順利的話就會回傳個帶有b64
屬性的json
字串。
當然測試的時候也可以改成直接存成圖檔:
以後只好寫好html
後就可以靠這API
產生出圖檔了。
Read other posts