1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

HerokuAdvent Calendar 2021

Day 20

草を生やしてこどものモチベーションを上げる【おまけ】heroku編~svg画像をpng画像に変換する~

Last updated at Posted at 2021-12-20

この記事は

シリーズ物の番外編です。
pixelaの画像を使いたかったのだけれども、gasだけでsvgからpngに変換することが難しく。
パワープレイでpngに変換したお話

課題 & 解決方法(再び)

子供(特に長男)が、「今何をやっているか?」を忘れがちで、宿題や準備が進みません。
宿題の途中で何か別のことをしたり、、、、

子供用のToDoリストを見える化してみます
ポイントで釣ってどうにかならないだろうか、、、、と思っている

  • 仕様
    • タスクを完了にするとポイントが貯まる
      スクリーンショット 2021-12-01 16.29.29.png

    • 毎日のルーティンタスクを発生させる&おわったことをアーカイブする
      スクリーンショット 2021-12-01 16.30.57.png

おまけ編、svgファイルの変換

上述の作業の中で、「Trelloのカード画像にpixela画像を差し込む」をやりたかったのですが、
pixelaは公式にはsvgを返却するAPIしかありませんでした。

というわけで、自動テストで培った技術を利用して(嘘です。puppeteerもkoaも初めて使いました。初心者です。)
公式の画面をキャプチャした画像を返却するだけのWebアプリを急造りしました。

利用技術

  • heroku
  • puppeteer
  • koa

参考にした記事

コード

index.js
const Koa = require('koa');
const Router = require('koa-router');
const bodyParser = require('koa-bodyparser');

const app = new Koa();
const router = new Router();
const mime = require('mime-types')
const fs = require('fs');

router.get('/', async (ctx, next) => {

  const pixela_user = ctx.request.query['pixela-user']
  const pixela_graph = ctx.request.query['pixela-graph']
  url = "https://pixe.la/v1/users/" + pixela_user + "/graphs/" + pixela_graph + "?mode=short&appearance=dark"
  const filename = getNowStr()+'.png'
  await crawler(filename, url); // クローラーの実行

  var mimeType = mime.lookup(filename);
  ctx.response.set("content-type", mimeType);
  const src = fs.createReadStream(filename);
  ctx.body = src;
});

app.use(router.routes());
app.use(router.allowedMethods());
app.use(bodyParser());
app.listen(process.env.PORT || 3000);

// ここからはクローラーのロジック
const puppeteer = require('puppeteer');
// Heroku環境かどうかの判断
const LAUNCH_OPTION = process.env.DYNO ? { args: ['--no-sandbox', '--disable-setuid-sandbox'] } : { headless: false };


const crawler = async (filename,url) => {

  const browser = await puppeteer.launch(LAUNCH_OPTION)
  const page = await browser.newPage()

  await page.goto(url)
  // スクリーンショットを保存
  img = await page.screenshot({path: filename})
  await browser.close()
}

function getNowStr(){
  var date = new Date();
  return date.toTimeString()
}

利用方法

http://xxxxxx.herokuapp.com/?pixela-user=who&pixela-graph=something にアクセスすると、png画像が表示されます。
Trelloに登録する場合はURLで登録できるので、上述のURLをカバー画像を更新するURLとしてAPI経由でPOSTすればOKです。

まとめ

herokuにselenium載せるのはやったことあったのですが、puppeteerも意外と簡単にできるんじゃ、、、、と思ってやってみましたがとても簡単でした。
お勉強になりました。

勢いで作ってみましたが、、、、β版があるとお知らせいただきました。

公式の方から、「アルヨ!」とTwitterでレスいただきました。
Qiitaに書いてもいいよ!と言っていただいたのでこちらに書いておきます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?