Qiitaの「いいね」を可視化する拡張機能を作った話

# はじめに

Qiitaには星の数ほど記事が投稿されていますが、ある同じ分野を担当しているときに有益な情報となるものは、それほど多くないはずです。

たとえば尊敬するプログラマが居たとして、その人が参考になった記事へ自力で辿り着けたのならば、それは光栄なことでしょう。
あるいは、後輩から「こんな昔に先輩はこの記事を見ていたのか。流石だなぁー」と思われたら嬉しいかもしれません。


そんなアホなことをコロナで寝込んでいるときに考え、一日で書き上げたクソ拡張がこちらです。

# 成果物

https://chromewebstore.google.com/detail/qiita-いいねチェッカー/fianncpmpjcheepilimdcpnnkfdmlejk?hl=ja

https://github.com/GOUKUN5160/qiita-following-likers

![screenshot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/64ecc91e-c8f8-1dd6-a2b6-ecfe79d81f39.png)

表示する場所は、記事の初めと終わりの2カ所指定できます。
日時をクリックすることで、簡易表示と詳細表示を切り替えられます。

詳しくはウェブストアのスクリーンショット、またはご自身でインストールして確かめてみてください。

# ファイル構成

![ファイル構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/ce71daff-2bd0-debb-e669-0adcf2cb5c68.png)

1000行にも満たないちっちゃなプログラムです。HTML、CSS、JSは1つずつしかないのでrootに直置きしました。
コードの全容は、ウェブストアから落として見てください。

# Qiita APIについて

アクセストークンを指定しないと、すぐに利用制限がかかり、同じ回線を利用する他のQiitaAPIユーザーにも迷惑をかけてしまいそうです。

>認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。
> <cite>[公式ドキュメントより](https://qiita.com/api/v2/docs)</cite>

アクセストークンは[ここ](https://qiita.com/settings/tokens/new)から発行できます。
この拡張機能で利用するには `read_qiita` にチェックが入っていればOKです（デフォルトのまま）。


# センスがないなら借りてくる
この拡張機能において、いちばんユーザーが目にする場所は、「いいね」した人を表示する箇所です。そこがダサくて見づらければ目も当てられません。

変に凝ろうとするのではなく、既存のデザインを流用すれば良いのだと気付きました。
新たなCSSを探してくるのも面倒くさいので、**Qiitaのアコーディオンとノートを組み合わせて使うことにします。**
Markdownで雛形を作り、Developer toolでそれっぽい箇所を取ってきました。

![qiita記事.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/7b549425-e064-f88a-d4d9-1e52e81f6ae9.png)

ユーザー名の表示部分は、筆者の表示を流用します。

![スクリーンショット 2024-10-21 133338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/e0780912-5426-4a3e-2e31-5b381e285584.png)

これらのHTMLの要らない部分を削り、少し付け足しをすれば完成です。

![スクリーンショット 2024-10-21 134252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/dad0bc01-3884-7357-b2dd-301da359e6b8.png)

HTMLにstyleを直書きするのは避けたかったのですが、構造を単純化するためにやむなしです。

## 設定画面

流石に設定画面にまでQiitaのデザインを流用することはできません。が、自分でデザインを考えるのは極力避けたいところです。
背景、ボタン、テキストボックス、ラジオボタン、当たり前のように全てがコピペ品です。

### 背景
暗い青の背景に白の囲い線、というデザインは私が普段から愛用しているDark Readerという拡張機能から着想を得ました。

![スクリーンショット 2024-10-21 135113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/33700648-293c-997f-f285-9d3512ad38b4.png)

### ボタン

https://ics.media/entry/230629/#矩形の塗りつぶされたボタン

### テキストボックス

https://pote-chil.com/css-stock/ja/textbox#4

### ラジオボタン

https://csshtml.work/side-radio/#block-9345b34a-d651-49e6-afe5-938a6c81dc14


# Chrome拡張のi18nは複数形をサポートしていないらしい
せっかく公開するのなら多言語化しよう！、ということで日本語に加えて英語をサポート。しかし英語には複数形という概念が存在します。`1 week` が `2 weeks` になったりする悪魔のルールです。
しばらく調べましたが、これを実現する方法は無さそうでした。

![messages.json.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/257970e6-2c04-1ac0-a1ab-394916f12ebe.png)

英語圏の利用者は少ないと思うので、諦めて `week(s)` と表記することにしました。どなたか、良い表記を知っている方教えてください。


# アイコンの作成

このくらいなら、Windows標準のペイントが便利です。
まずカラーピッカーでQiitaの緑を取ってきて、正方形に整えたキャンバスを塗りつぶし。次に円を2回書いて隙間を白で塗りつぶし。虫眼鏡の持ち手をひし形ツールで描いて、ハートを置く。仕上げにレンズのテカテカを極太ブラシで手書きすれば完成です。

![スクリーンショット 2024-10-21 132423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/3379a04e-2b54-9249-b9f7-1017e1545791.png)

オンラインの画像リサイズツールを使って16x16、48x48、128x128に変換しました。


# ウェブストアに申請

初めての公開なので[Chromeウェブストアのデベロッパー登録](https://chrome.google.com/webstore/devconsole/register)を行います。初回のみ5ドルが必要ですが700円程度なので抵抗はありません。 ~~Apple Developer Programに比べれば断然マシ~~


一番面倒だったのはスクリーンショットの撮影。1280x800の画像を日本語と英語で最低1枚ずつ用意する必要があります。少しでもサイズが違うとはじかれるので正しい比率で切り抜きましょう。

![スクリーンショット 2024-10-21 145538.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/ece880d4-b1a8-6f0f-104d-2b89667f5a59.png)


拡張機能の用途や権限を利用する理由などを記入する必要がありますが、適当に埋めても大丈夫そうです。

![スクリーンショット 2024-10-21 145219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/583a7c58-d0b6-09d0-2bc1-851359df5802.png)


朝の2時くらいに申請して14時くらいに承認されました。たったの12時間で済むとは、思ったよりスピーディーですね。
![スクリーンショット 2024-10-21 145006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644120/c19a372e-c398-0e33-6ff3-ae5f6152656e.png)


# 課題点
「いいね」を取得するAPIは一度に最大100件までしか取得できないため、「いいね」が何千何万もある記事では、表示するまでに数秒かかってしまうことが挙げられます。
DOMの読み込み前からfetchし始めるか、すべての「いいね」取得を待たずに段階的にレンダリングしていくか。回避策は色々ありそうですが、誰も使わない拡張機能にこれ以上時間をかけても無駄な気がするのでこれで良しとします。


# おわりに

良い記事を見つけたら積極的に「いいね」しましょう:thumbsup: