好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

Twitterからはてなブログに、日次でtweetをまとめて投稿

これはなに

  • Twitterでほぼ毎日画像つきで呟いてた英語日記をブログにした
  • すでにあるサービスでいい感じのが見つからなかったので自分で作ってみた
  • どういう組合せで作ったかの覚え書き

これが (FC2ブログのtwitter連携機能を利用)

f:id:kusuwada:20210313174047p:plain:w300

こうなった

f:id:kusuwada:20210313172314p:plain:w300

目次

背景

どれくらい英語学習効果があるかわからないけど、とりあえず英語で毎日tweetしようと思いたち、2019年3月に始めてそろそろ2年。毎日とは言わないけど、結構続いています。
やりやすいかな、と思って写真をあげてそれに関する話をするスタイルにしてみたところ、気づけば育児日記のようになっていました。
これ、ぱっと日付で振り返ってブログみたいに見返せるようにしたいなー。インスタみたいに写真がだーっと並ぶ一覧が出せたらいいなー。さらに1年毎に冊子に印刷できたらめっちゃいいなー。…と妄想し始めたのがこちら。

Twilog良さそうだったけど、デザインのカスタマイズができなさそうだった。

ちがう、そうじゃないんだ。私のアイコンが並んでも困るんだ。

ということで、とりあえずやってみることにした。
使ってみたかったのは gtihub の actions。業務で使ってはいるものの、レビューとかちょい修正しかしてなかったので自分でガッツリ使ってみたかったのと、localでactionsを動かすactというのも気になってたのです。
更にAWSなど他のサービス使わずに完結するなら素晴らしい。

技術選定とラフ設計

f:id:kusuwada:20210313070414p:plain

図にするまでもないけどこんな感じ。

Twitter

Twitter APIはv2を使ってみました。

developer.twitter.com

OAuthでログインして日付でtweet検索、取ってくる。今回は画像だけ取得してブログ側にアップするようにしました。

はてなブログ

ブログ、自分で立てたりするのも良かったのだけど、自分、はてブ有料会員なので (`・ω・´)
デザインもある程度テンプレートが使えそうだし、馴染みのあるサービスだし。何より

MyBooks.jpではてなブログを本にする - はてなブログ ヘルプ

ブログの製本サービスがある!
ブログの構築や運用がしたいんじゃなくて、早くブログを作りたいんじゃ!ということではてなブログを使うことにしました。

もともとメールから投稿できることは知っていたので、システム化はできそうだと踏んでいたのですが

はてなブログAtomPub - Hatena Developer Center

はてなブログAtomPub というAPIサービスがあることがわかったので、今回はこれを使うことに。
画像のupload・urlやidの取得はこちらの はてなフォトライフAtomPub から。

はてなフォトライフAtomAPI - Hatena Developer Center

先に画像をuploadしておいてurl or id を入手し、ブログのエントリに貼り付ける方式。

Github actions

Actions使ってみたいなー、という思いで始めたわけですが、ここで気になるのが利用規約。

気になって調べたところこちらの記事を発見。
GitHub Actions の使用制限 - Qiita

現在の利用規約を確認。
GitHub Additional Product Terms - GitHub Docs

ここで言及されている serverless computing 目的に相当しそう。
2020/8/14時点では明示的にNG項目に挙がっていたのが、8/23時点で削除された模様。

現在の利用規約(2021/3/12時点)では、

for example, don't use Actions as a content delivery network or as part of a serverless application, but a low benefit Action could be ok if it’s also low burden

ということで、ちょっと曖昧だけど個人利用・負荷の少ない利用であればOKとのこと。
違反と認められれば、リポジトリの無効化にも繋がる可能性があるとのことです。利用規約は今後もアップデートされる&Actionsの利用料金も変わる可能性があるので要チェックです。

今回は、一旦開発テストの目的も込めて一度Actionsでやってみて、dailyのActionsの負荷が小さいようならActions上で実行し続けることにしました。結果、一日分のexport処理は1分未満で終わることが多かったので、現状このまま動かしてみいています。ここは利用規約が変わればlocalでの実行・AWSやGCP/Azureへの以降もありそうです。

利用規約の項目が長くなりましたが、上記Twitterからtweetを取ってきてはてなブログに投稿するformatに整形、はてなにuploadする、というコードを書きGithubで管理。
更にActions用のworkflowを作成し、日次で動作するように設定したものと、batch処理するflowを作成しました。

twitterやはてなのCredentialはGithubの Secrets に設定し、workflowから参照するように。

nektos/act

github.com

開発中に困るのが、適当なコードでも走らせて試してみたい (== githubにはpushせずに動作を確認したい) ケース。特にworkflowの書き方の検証をしたいときに、いちいちgithubにpushしないといけないのはちょっと困る。

なんかいい方法無いかなーって探したら、localでactionsを走らせるツールがあった!嬉しい!

上記のコードはpythonで書いたのだけど、そもそも act のデフォルトで使うimageにはpyhton入らないので、下記のように使用するimage(Actions本体側と同じものに合わせ得た)を落としてきて使う、などの工夫が必要だった。

$ act -P ubuntu-latest=nektos/act-environments-ubuntu:18.04

のように、-P optionをつけると使用するimageが指定できる。このimage、18Gあるので、初回の実行時はこれをlocalに落としてくる時間がかかる。気長に待つこと。

他、Github Secrets に設定したい値は、実行時に -s {key}={value} の形で設定できるし、Actions実行時の引数は --eventpath {filepath.json} のようにしてjson形式で書いたファイルを用意しておけばこれを読み込んで実行してくれる。

actでは対応していないactionsの記法もいくつかあるので、actで動かしたものがそのままactionsで使えるとは限らないが、debugをある程度localで行えるのは嬉しい👍

actで使えない機能例としては、最近workflowで環境変数を設定する時の関数

echo ::set-env name=COLOR::yellow

に脆弱性が見つかったということで

echo "COLOR=yellow" >> $GITHUB_ENV

この記法を使うようにupdateされたのだけど、actはまだ対応していなかった。(2021/3/12)

Support for $GITHUB_ENV · Issue #384 · nektos/act · GitHub

みたいな差異があるものの、その他の点はかなり使い良かった。

完成ブログ

ということで、完成 🙌!

サイトはこちら

diary.kusuwada.com

なんだかんだ、サイトのデザインを調整したりするのにそれなりに時間がかかった😄

githubのリポジトリはこちら

github.com

一応forkして使うことはできるけど、actionsを使う場合はgithubの利用規約をよく読んで正しく使ってください。actを使ってworkflowごとlocalで動かしたり、python scriptそのまま使ってlocalやクラウドサービス上で動かしたりはご自由にどうぞ!
あと、上にも書いたとおりテストないし拡張性とかあまり考えてないのでご了承ください。

サイトのデザインははてな側で調節しているので、好きなテンプレート見つけてカスタマイズ。最終形はこんな感じ。

f:id:kusuwada:20210313172314p:plain

もう少し溜まってきたら印刷してみようかな。

まとめ

localマシンでやっても十分な処理内容なんだけど、Github actions使うことで

  • localマシン落としてても定期的に実行できる
  • 他のクラウドサービス使わなくて良い
  • workflow書きやすい
  • しかも act で local からworkflowのテストも簡単にできる

と、めちゃめちゃ体験が良かったです👍
Github側の利用規約に注意しつつ、このままテストも兼ねてAction使わせていただく予定。(API変更とか)