((7回目の出直し🌼))

好きなことを自分のペースで、のんびり更新

Google Apps Scriptで記事ごとのはてなスターをカウントしてみよう

まぁ、タイトルで言い切りました。 先日、初めて書いたGASのスクリプトを応用すれば、記事事のはてなスターを全部集計するスクリプトができるのではと思い、作ってみました。

前回のおさらい

先日、記事内に埋まってるはてなのアフィリエイトリンク(が壊れいているもの)を探すGASを書きました。

kanaxx.hatenablog.jp

このときやったことは、

  1. スプレッドシートの1セルにサイトマップインデックスのURLを書く
  2. サイトマップインデックスからサイトマップを探す
  3. サイトマップから記事URLを探す
  4. 記事URLからHTMLをとる
  5. 記事HTMLの中から壊れたリンクを探す

1~3までの作業は、応用がききそうですね。
たった1つのサイトマップインデックスファイルを指定するだけで、すべての記事URLがシート内に展開できます。

ここを共通部分として、 記事URLを作り出したあとに、HTMLを取りにいくのではなく、はてなスターを取りに行くように改造します。

作戦会議

さて、プログラムを作るときには、まずは作戦会議です

はてなスターってとれるんだっけ?

はてなスターはAPIが用意されていて、URLを指定するだけで記事についているはてなスターの数をとることができます。 developer.hatena.ne.jp

記事のURLを指定すると、スターの状態がJSONで返ってくるAPIですね。複数のURLを指定すると1回のAPIコールでまとめて取ることができるみたいですが、今回は1個ずつ愚直に投げるスタイルにします。
ブログには、カテゴリページへのスターやコメントへのスターがありますが、今回は取得対象外としました。(サイトマップか近しいものから一覧が取れれば取得するのは難しくないですが、全量が把握できないためです)

ちなみに、はてなスター自体は公開情報なので、このスクリプトを使うとよそ様のブログのスターも集計することができます。 競合のスターの数を数えてしまうこともできますね。

GASの6分の壁への対策

GASのスクリプトは開始から終了まで6分を超えると強制終了されてしまいます。記事が多いブログだと、APIで調べるURLの数も自然と多くなります。いつも1つ目からAPIで調べていると何度やっても6分で時間切れになりゴールにたどり着かないことが考えられます。

なので、前回の記事から少し改良をします。中断したところから再開できるような仕掛けを用意します。

作戦としては、

  • 各記事URLの隣にスターを確認した日付を入れるようにして、取得したら日付を入れる。
  • 自分で停止するか強制終了すると日付が入っていないセルができる
  • 次回以降は、日付が入っていないところを探して、続きをやるだけです。

上から順番に処理をして結果をシートに残していき、空白があればそこから再開可能とする。そんなに複雑な仕組みではないですね。

シートの設定も用意

新規作成したブックの状態でも簡単に動かせるように、シートや表のタイトルを入れるスクリプトを組み込みました。いろいろ準備することなくスクリプトを貼り付けて、実行するだけで大丈夫なはず。

スクリプトを貼り付けて実行した初回で、2つのシートがつくられます

  • サイトマップ
  • データ

サイトマップシートは、サイトマップインデックスの場所を指定する枠とサイトマップの一覧が記録されるシート。
データシートは、記事URLと記事ごとのスター数が記録されます。

サイトマップシートのA2にサイトマップインデックスのURLを入れて実行すれば、あとは自動で実行します。

動かし方

さて、動かし方。GASはめんどい。良い方法を知りたい。

いつもの断り書きです

お断り この記事を参考にスクリプトを動かすのも改造するのも自由ですが、すべては実行者の自己責任の上で行ってください。何か悪いことが起こっても筆者は責任を負いません。 また、スクリプト内部ではスクレイピングという行為を行っています。他者のシステムを高負荷にする可能性があるものですので、その影響も理解した上で行ってください。

コード

今回はちょっと長いのでgithubに置きました。記事内のコードのコピペはしないので、こっちから拾ってください。
https://github.com/kanaxx/hatenablog-omocha/blob/1934496baf36ed131d7a919b6a9b0c5706b48bb1/hatenastar/check-star-count.gs

上から下まで丁寧に、選択してコピーします。

新規ブックを開いてスクリプトをセット

前回の記事と同様に、

  • 空白のブックを作り、適当な名前を付け
  • スクリプトエディタを開き、スクリプトをコピーして貼り付けます

この状態です。
f:id:kanaxx43:20210603221144p:plain

bootstrapメソッドが指定された状態で実行を押します。
f:id:kanaxx43:20210603230134p:plain

前回同様に、スクリプト初回実行時み承認のダイアログがでるので承認する。(手順は省略、前回の記事参照)

初回実行の場合は、サイトマップインデックスファイルの指定をするように指示して終了します。 f:id:kanaxx43:20210603222302p:plain

「サイトマップ」シートのA2に、サイトマップインデックスのURLを入れます
f:id:kanaxx43:20210603222844p:plain

シートエディタに戻ってもう一度実行すると、

  • サイトマップシートのセルA5以降にサイトマップのURLが出てきて
  • データシートには、はてなスターの数がでてきます。

実行の様子は動画にしておきます

6分過ぎて強制終了したあと、もしくは自分で停止したあとにもう一度実行するとこのダイアログが出ます
f:id:kanaxx43:20210603231618p:plain

  • 「はい」を選ぶと途中で中断したところを探して続きを実行
  • 「いいえ」を選ぶとデータシートを全てクリアして、最初から実行します
  • 「キャンセル」を選ぶと、実行を中断します

これで、6分以上かかっても大丈夫です。

次回実行するときには、データシートの内容を消してしまうので、データシート自体を別名でコピーしておくと過去の履歴が残せます。 それを1日1回自動実行するように仕掛けれると、勝手にデータ集計する仕組みが作れます。

まとめ

はてなスターを全部集計するスクリプトを書いてみました。適当に書いたスクリプトですが誰かの役に立つと幸いです。

サイトマップから記事URLをとれるようになっておくと、いろいろ応用がききそうです。 GASをもっと簡単に配る方法はないのだろうか。。