ブログ更新をtweetする
📅 October 18, 2020
•⏱️4 min read
こんちは、まっさんです。 昨日意気揚々とブログを新しくしたので、せっかくなので、ブログ更新通知機能を作って見ようと思います。
gatsbyとかのプラグインでそういった機構あるのかな?調べてないのでわからないですが、今回はお勉強がてら泥臭くwebhookとlambda使って通知します。(この記事書いてるときは、まだ完成してませんw)
使うのは、
- twitter api
- lambda
- api gateway
- contentful webhook
です。
Twitter APIの準備
これがマジで、めちゃくちゃ面倒でした。。。
2020年度版 Twitter API利用申請の例文からAPIキーの取得まで詳しく解説 | 新宿のホームページ制作会社 ITTI(イッティ)
このサイトが詳しく方法が載ってるのですが、今は若干UIが変わっていたりしています。何がめんどいって、なんと言っても必須の項目が多い。しかも英語。。。
Lambdaの準備
次は、実際にtweetしてくれるlambdaを準備していきます。 私は、js大好き民(jsしか書けない)のでnodejs12系を選んでいきます。
node moduleのtwitter - npmを使って行くので、layerとやらを使います。
layerにnode moduleぶっこんで使っていく方法はこちらを↓。zipに固めてuploadするだけなので、楽ちんですね。 node_modulesをLambdaレイヤーにアップロードしてライブラリを使用する - Qiita
Lambdaでツイートするコードを書く
const Twitter = require('twitter');
const client = new Twitter({
consumer_key: '',
consumer_secret: '',
access_token_key: '',
access_token_secret: ''
});
function tweetPost(content = 'テストtweet') {
return client.post('statuses/update', {status: content})
}
exports.handler = async (event) => {
await tweetPost(event.tweet)
const response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
return response;
};
ここらへんも、「lambda tweet」とかで、ぐぐるといっぱい参考になる記事が出てきますが、ちょっと詰まったのが、ググって上がってくる記事が古いからかして、実際にツイートするapiを叩くのが非同期処理なのを考慮してない記事が多い。
awaitつけずに、実行するとtweetするより早く、lambdaが終了?してしまって、tweetしてくれないのでawaitが必要かと思われます。
(postのbodyで{"tweet": "ツイートする内容"}を受け取る想定)
api gatewayを準備する
AWS Lambda + API Gateway
このあたりを参考に、api gatewayを設定していきました。発火させるlambdaのarnに$LATESTを使うと、{"message": "Internal server error"}%
が返って来て使えないので、lambda側でもちゃんとバージョンを発行してあげましょう。
contentfulでwebhookの設定をする
api gatewayで作成したURLをcontentfulのwebhookに登録します。 netlifyでもいいかと思ったのですが、将来的に、更新したブログのurl・titleを取得したいので、netlifyではなく、contentfulのwebhookを使用します。
この設定は致命的な欠陥があり、contentfulが記事の更新をトリガーにnetlifyとlambdaを叩くので、netlifyのビルドより先に、「記事更新したぜ」ツイートが投稿されてしまいますwww
そのあたりは、lambda側でなんとかすれば良さそうなのですが、ちょっと面倒そうなので、一旦この残念な仕様でいきます。
結局ちゃんと自動ツイートできた?
この記事を書いてるときは、まだ、実際にcontentfulから通しでチェックしていないので、あしからず。 色々と残念な部分が多いので、また、追記修正していきます!!!!
【追記】 ちゃんと、更新ツイートできてました!!! やっぱり、JAMstack構成だと、webhook使って簡単にブログの方をいじらずに、追加機能を作れちゃうのがいいですね。
それではまたー。