Chrome拡張が簡単に作れて驚いた（のでチュートリアルを書いた）

## 今回は実践編

詳しいチュートリアルはいくらでも良いものが上がってますので、実用性がある中では（多分）世界一簡単なチュートリアルにします。

<!--
[概念的な部分は以前書いてみました]()が、具体的な技術的なことはノータッチだったのでそれも無責任な話だなぁと思った次第です。
-->

### 開発環境
- macOS Catalina 10.15.1
- Chrome バージョン: 79.0.3945.79
- 適当なエディタなど

## お天気を表示するだけのプラグイン「OTENKI（仮）」
![otenki.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546514/a28549cb-5952-8353-3921-cf6c92c02b4c.jpeg)

- アイコンをクリックしたら今のお天気が表示される
- 表示される天気は予め決めた地点のみ

という、「実用性がないこともないが、いささか不便な拡張」を作っていきます。

## 手順を予習
- フォルダを作る
- manifest.jsonを用意
- jsを書く
- Chromeに読み込む
- 出来た！

簡単！

## 着手
### フォルダを作る
`otenki`フォルダを作るついでに必要なファイル（とりあえず空っぽ）と[適当な場所](https://jquery.com/download/)から落としてきたjQueryをおいておきましょう。

```text:ファイル構成
otenki
├── background.js
├── jquery.min.js
└── manifest.json
```
今回使うファイルはこれで全て。３つだけ。

### manifest.jsonを用意

[ドキュメント](https://developer.chrome.com/extensions/manifest)によると本当に必要なものというのは頭の３行くらいです。

```json:manifest.json
{
    "manifest_version": 2,
    "name": "OTENKI",
    "version": "0.0.1",
    "background": { "scripts": ["jquery.min.js", "background.js"] },
    "browser_action": {},
    "permissions": [
        "http://*/*"
    ]
}
```
落としてきたjQueryのファイル名が違った場合はリネームするかここの記述を調整しましょう。

<!--
付け加えた部分の解説

```json:manifest.jsonの一部
    "background": { "scripts": ["jquery.min.js", "background.js"] },
```
JSが読み込まれ実行されます。
（厳密に言うと、自動的にHTMLを生成し、その上で実行されているみたいです）

```json:manifest.jsonの一部
    "browser_action": {},
```
`browserAction`を使うために書いておきます。
空っぽなら書かなくていいのでは？→すいません。僕もよくわかってないですが、これだけで働いてくれます。（だれか解説を…）

```json:manifest.jsonの一部
    "permissions": [
        "http://*/*"
    ]
```
`$.ajax`のために必要です。CORS policy的な話です。
-->

### jsを書く

```javascript:background.js
chrome.browserAction.onClicked.addListener(updateIcon);

function updateIcon(){
    var str_req_url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010';
    $.ajax(str_req_url)
    .done(function(data) {
        chrome.browserAction.setIcon({ path:data["forecasts"][0]["image"]["url"] });
        chrome.browserAction.setBadgeText({ text: data["forecasts"][0]["telop"] });
    })
    .fail(function(data){});
}
```
シンプルにいきましょう。

一応ざっくり日本語訳的な説明。

```
アイコンをクリックされたら以下を実行

URLは「http://weather.livedoor.com/forecast/webservice/json/v1?city=130010」ですよ
そのURLにリクエスト。
完了したら…
アイコンをホニャホニャ。
バッジテキストをホニャホニャ。
```

※お仕事ではちゃんとエラーを拾いましょう。

さて突然出てきた`http://weather.livedoor.com/`ですが、何かというとLivedoorが提供している[お天気Webサービス（Livedoor Weather Web Service / LWWS）](http://weather.livedoor.com/weather_hacks/webservice)というお天気情報APIのURLになります。末尾の数字部分で地点を指定しており、このURL(`city=130010`)は「東京都 東京」の情報です。このAPIは認証の必要がないので、URLをブラウザで開くだけでjsonを取得できることが確認できます。
![json-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546514/dfe9050f-0001-998e-5d76-d86d78baf989.jpeg)

余談ですが、こういう時（？）用にChromeに[JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ja)などの拡張を入れておくと上記のようにきれいに表示してくれるのではかどります。

今回はあまり大したこともしないので端折った書き方をしていますが、まぁ必要な情報をいい感じに扱えてるのでのでよしとしましょう。コード類の準備は完了。

### Chromeに読み込む

拡張機能ページ（[chrome://extensions/](chrome://extensions/)）にアクセスしてポチポチします。
![extension.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546514/1433f5cd-6911-3694-457e-eafe1b73fc18.jpeg)

- [デベロッパーモード]をオン
- [パッケージ化されていない拡張機能を読み込む]をクリック
- 読み込みダイアログで`otenki`フォルダを選択
- 一覧にOTENKI拡張が表示される（か、エラーが表示される）

今回はデフォルトアイコンを設定していないので、メニュー部分には少し残念なアイコンが表示されているかと思います。

### 出来た！
![otenki-icon-ss.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546514/139dc5fc-1564-a457-6e52-85310ba69541.jpeg)

クリックしたらアイコンが変更され、バッジにテキストが表示されます。
提供されているおひさま画像が正方形じゃないゆえに歪んで炎みたいになっているのはご愛嬌。

## まとめ
Chrome拡張は、探してみるとどんなものでも誰かが提供してくれているものですが、本当に自分や周囲の人が求めているものをピンポイントに作ってみるのはとても大切だと思います。[車輪の再発明](https://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E)になっては面白くないですが、じゃあ現在では車輪の研究が全く行われていないかというとそういうわけでもないです。
また、ネットのサービスなどでクロスプラットフォームとかマルチプラットフォームというと、フロントエンドが違うだけといいますか、まぁChrome拡張も一つのフロントエンドと考えているサービス・企業も多いです。自社製・他社製を問わずAPIから情報を取得していい感じに表示するということに慣れておいて損はないです。フロントエンドエンジニアの方でそういう経験がない方はこういうのやっておきましょう。
それはそうと、今回はコードが20行にまとまらなかったので悔しいです。

### 満足行かないチャレンジャーへ。

* 残念なデフォルトアイコンをなんとかしたい！ -> デザイナーじゃ無い方は描くのは大変なので、（著作権やライセンスに気をつけながら）[アイコン素材サイト](https://icooon-mono.com/)などから使わせていただくのがいいかと。適当に同梱して`manifest.json`に記述するだけ〜。
* 最低気温/最高気温を表示したい！ -> 今回取得したデータの中に気温（temperature）の文字が。`null`になっている謎を解明して、バッジに表示できるようチャレンジしてみましょう。
* 明日・明後日の天気も表示したい！ -> ポップアップ画面作成にチャレンジして表示内容を増やしてみましょう。すでに情報は取得済みです。
* 場所を変更できるようにしたい！ -> 設定画面を作ってみたり、[chrome.storage](https://developer.chrome.com/extensions/storage)とか使うことになるかと。
* 自動的に表示内容がアップデートされるようにしたい -> JSで定期的な処理を行う形になりますかね。人様のAPIなので叩きすぎないように気をつけてください。
* 公開してみたい！ -> ファイト！前述の参考ページにまとめてくださってます。