これはなに
- Twitterでほぼ毎日画像つきで呟いてた英語日記をブログにした
- すでにあるサービスでいい感じのが見つからなかったので自分で作ってみた
- どういう組合せで作ったかの覚え書き
これが (FC2ブログのtwitter連携機能を利用)
こうなった
目次
背景
どれくらい英語学習効果があるかわからないけど、とりあえず英語で毎日tweetしようと思いたち、2019年3月に始めてそろそろ2年。毎日とは言わないけど、結構続いています。
やりやすいかな、と思って写真をあげてそれに関する話をするスタイルにしてみたところ、気づけば育児日記のようになっていました。
これ、ぱっと日付で振り返ってブログみたいに見返せるようにしたいなー。インスタみたいに写真がだーっと並ぶ一覧が出せたらいいなー。さらに1年毎に冊子に印刷できたらめっちゃいいなー。…と妄想し始めたのがこちら。
英語アカウントの方のTwitterを何とかexportしてブログにしたいなーと思って色々探し中。
— kusuwada (@kusuwada) 2021年3月5日
Twilog良さげかつフォローしている人にもユーザーさん結構いるんだけど、デザインのカスタマイズしたいんだよね。インスタ風に投稿した写真が並ぶ感じ。
何かおすすめのサービス無いですか?
Twilog良さそうだったけど、デザインのカスタマイズができなさそうだった。
gooとかFC2とか大手ブログサイトにはTwitter連携で1日のツイートまとめて投稿する機能あって試してみたんだけど、私のアイコンが並んじゃった。惜しい…😂
— kusuwada (@kusuwada) 2021年3月5日
今の所、最有力候補はtwitterAPI叩いてバッチで処理させてブログに投稿するやつ自作だけど、運用したくないなぁ。作るのは楽しそうだけど。 pic.twitter.com/LJBlTimSsy
ちがう、そうじゃないんだ。私のアイコンが並んでも困るんだ。
いや待てよ。
— kusuwada (@kusuwada) 2021年3月5日
試してみたい技術があって、実現したい課題がある。
これはエンジニアの端くれとして、やっぱり作ってみるべきでは?(急にどうした)
急ぐもんでもないしやってみるか。
もちろん全部揃ってるサービスがあったら使うけど🤭
ということで、とりあえずやってみることにした。
使ってみたかったのは gtihub の actions。業務で使ってはいるものの、レビューとかちょい修正しかしてなかったので自分でガッツリ使ってみたかったのと、localでactionsを動かすactというのも気になってたのです。
更にAWSなど他のサービス使わずに完結するなら素晴らしい。
技術選定とラフ設計
図にするまでもないけどこんな感じ。
Twitter APIはv2を使ってみました。
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には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
みたいな差異があるものの、その他の点はかなり使い良かった。
完成ブログ
ということで、完成 🙌!
Twitterからブログにexportして、いい感じに表示させたいと言ってから約1週間、なんとかやりたかったことができた気がする👍✨ 試してみたかった技術も使えたし、開発規模もちょうどよかったし、何よりやりたいこと駆動の開発って楽しい!!取り急ぎ自分用なので、まだテストもなにもない。ワイルド! pic.twitter.com/gEkJQyCb13
— kusuwada (@kusuwada) 2021年3月11日
サイトはこちら
なんだかんだ、サイトのデザインを調整したりするのにそれなりに時間がかかった😄
githubのリポジトリはこちら
一応forkして使うことはできるけど、actionsを使う場合はgithubの利用規約をよく読んで正しく使ってください。actを使ってworkflowごとlocalで動かしたり、python scriptそのまま使ってlocalやクラウドサービス上で動かしたりはご自由にどうぞ!
あと、上にも書いたとおりテストないし拡張性とかあまり考えてないのでご了承ください。
サイトのデザインははてな側で調節しているので、好きなテンプレート見つけてカスタマイズ。最終形はこんな感じ。
もう少し溜まってきたら印刷してみようかな。
まとめ
localマシンでやっても十分な処理内容なんだけど、Github actions使うことで
- localマシン落としてても定期的に実行できる
- 他のクラウドサービス使わなくて良い
- workflow書きやすい
- しかも act で local からworkflowのテストも簡単にできる
と、めちゃめちゃ体験が良かったです👍
Github側の利用規約に注意しつつ、このままテストも兼ねてAction使わせていただく予定。(API変更とか)