7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Chrome拡張は作るもの

Last updated at Posted at 2019-09-13

Chromeおすすめ拡張〇〇選!で摩耗しているみなさんこんにちは。
そしてようこそ、Chrome拡張作成空間へ。

Chrome拡張にひつようなもの

  • 作るもの
    • manifest.json(設定ファイル)
    • jsファイル
    • htmlファイル(ポップアップ画面出す場合必要)
    • imgファイル(アイコン用、任意)
    • cssファイル(見た目用、任意)
  • どこかから持ってくるもの
    • GoogleChrome

作っていく

manifest.jsonについて

リファレンスをみた方がいいです。

とりあえず以下は必須です。

{
  "manifest_version": 2,
  "name": "(なまえ)",
  "version": "(0.1、、、など)",
}

その他は必要に応じて記載します。

今回は

  • permissions
    • 拡張機能に干渉を許可するオブジェクトのリスト
  • content_scripts
    • dom操作まわりの指定
  • browser_action
    • ブラウザに対する動作まわりの指定

を使用しました

実装する機能としては

・自動書き込みを行いたいサイトへ行く
・ツールバーの拡張機能アイコンをクリック -> ポップアップ画面が表示される
・画面上からファイル選択ボタンをクリック -> ファイル選択ダイアログが表示される
・形式通りに書かれたテキストファイルを選択
・フォームに書き込まれる
というものを実現します。

ユーザ登録とか、毎回面倒なのでこれをブラッシュアップして楽にしたい

テキストファイルの形式はこんな感じです
改行と'='で分けます

name=testboy
email=aaa@example.com
tel=0123456789
password=QWERasdf123!

ポップアップ画面を作ります

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>pop</title>
</head>
<body>
<input type='file' id="reader" />
<script src="js/main.js"></script> 
</body>
</html>

ポップアップ画面の処理を書きます

// domが読み込まれたら発火する用のリスナ
document.addEventListener('DOMContentLoaded', function() {
// #readerの変更で発火する用のリスナ
  document.getElementById('reader').addEventListener('change', function(e) { 

    // ファイルの内容を読み込む宣言
    var file = e.target.files
    var reader = new FileReader()
    reader.readAsText(file[0])

    // 読み込まれたら起動
    reader.onload = function(ev) {
        // 読み込んだファイルの中身を処理するjsへsend
        chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
            chrome.tabs.sendMessage(tabs[0].id, reader.result)
      })
    }
  })
})

開いているページに行う処理を書きます

// messageがsendされてきたら発火する用のリスナ
chrome.runtime.onMessage.addListener(function(msg) {
    // msgは読み込んだファイルの生データ

    // 改行で分割し、さらに'='で分割
    // '='の前がkey, 後がvalueとなる、'='が複数あった場合は考慮しない
    const insertObj = {}
    msg.split('\n').forEach(v => (insertObj[v.split('=')[0]] = v.split('=')[1]))

    Object.keys(insertObj).forEach(v => {
        // keyの名前と同じ'name'属性を持つフォームを探し、ある場合は書き込む
        const element = document.getElementsByName(v)
        element.length && (element[0].value = insertObj[v])
    })
    return true // いらないかも
})

manifest.jsonに使うファイルなどの情報を記載します

{
  "name": "Insert",
  "manifest_version": 2,
  "version": "0.0.1",
  "permissions": [
    "tabs"               //tabへの干渉を許可している
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],  // 全てのURLで動作
      "js": ["content.js"]
    }
  ],
  "browser_action": {
    "default_popup": "foreground/popup.html" // ポップアップ用ファイルの指定
  }
}

ディレクトリ構成はこんな感じ


/
├ manifest.json
├ content.js          -- 開いているページを操作するjs
└ foreground/
  ├ popup.html
  └ js/
     └ main.js        -- popupを操作するjs

 

んで、できあがったらchrome://extensions/を開いて、右上のDeveloper modeをONに、左隅のLoad unpackedからディレクトリを指定して読み込めば拡張機能がインストールされます!簡単!!

うごいているところ

gif12s.gif

やってみて

結構ハードルは低めでした
foreground以下は開いたときに読み込まれるので、コードを変えても開き直せば再インストール不要で結構トライ&エラーしやすかったです。
manifestとbackground周りは再インストールが必要っぽいです。
スーパーリロードでもダメでした

以上

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?