松岡修造APIを作る
モチベーション
配信で頑張れ!チャンネルポイントがほしいなぁ
どうせなら暑苦しいのがほしい
Youtubeの松岡修造動画をランダムで配信したい
Firebotに動画リストを渡せばランダム再生が可能
FirebotはJavaScriptを実行できるのでFirebot上でやってしまってもいいのだが、マイクロサービス化することで汎用性持たせたほうが色々と取り回ししやすくてよいと感じる
Hono + Cloudflare Workersで作るか
仕組み
毎回Youtube Data APIを叩くのではなく、定期的にfetchしてリストを保持しておく
リクエストに対しては保持したリストから返す
何を返すか
url, 動画id, タイトル, 概要, 再生時間, ...etc
普通にYoutubeのレスポンスをそのまま返したほうがわかりやすい
$ npm create hono@latest
cloudflare workersテンプレートで作成する
youtube data api
google cloudでプロジェクト作成 & アクセストークン生成
使うのはAPIキー
松岡修造公式チャンネルのchannelId: UCix3CP_r1-t3GMymVnyskpw
HonoのAPIの叩き方
fetchとrequestの違い
fetch
app.fetch will be entry point of your application.
request
request is a useful method for testing.
You can pass a URL or pathname to send a GET request. app will return a Response object.
code:response.json
{
"video":{
"kind":"youtube#searchResult",
"etag":"TA0WNvyCeahpiayZkj-mBPdUS9M",
"id":{
"kind":"youtube#video",
"videoId":"SjwJqJrq6dA"
},
"snippet":{
"publishedAt":"2019-03-22T03:40:49Z",
"channelId":"UCix3CP_r1-t3GMymVnyskpw",
"title":"誰も守ってくれないと思っているあなたに",
"description":"シーサー見てみろよ.",
"thumbnails":{
"default":{
"url":"https://i.ytimg.com/vi/SjwJqJrq6dA/default.jpg",
"width":120,
"height":90
},
"medium":{
"url":"https://i.ytimg.com/vi/SjwJqJrq6dA/mqdefault.jpg",
"width":320,
"height":180
},
"high":{
"url":"https://i.ytimg.com/vi/SjwJqJrq6dA/hqdefault.jpg",
"width":480,
"height":360
}
},
"channelTitle":"松岡修造公式Youtubeチャンネル",
"liveBroadcastContent":"none",
"publishTime":"2019-03-22T03:40:49Z"
}
}
}
できた
https://github.com/mtane0412/shuzo-api
https://shuzo-api.mtane0412.workers.dev/api/v1/videos/
色々ハマったところ
KVNamespaceや.dev.varsはBindingsでHonoに渡してあげる必要がある
Honoインスタンスにわたす必要があるのでutil.ts側で定義しても意味なかった。当たり前
code:index.ts
type AppContext = {
Bindings: {
VIDEOS: KVNamespace;
API_KEY: string;
}
}
const app = new Hono<AppContext>().basePath('/api');
secretの登録をローカルで反映させる方法がよくわからなかった
ローカルでも使えるみたいな書き方を見たけど.dev.varsから読み込むのが正しいのかな?
KVnamespaceのidはprivateではないのでgithubにあげてOK