1. 程式人生 > >寫個簡單的chrome外掛-京東商品歷史價格查詢

寫個簡單的chrome外掛-京東商品歷史價格查詢

chrome 外掛是什麼,能做什麼

增強瀏覽器功能,HTML、CSS、JS、圖片等資源組成的一個.crx字尾的壓縮包。 從介面到網路請求,到本地資源的互動,都是統統可以的。 比如:

  • ColorZilla: 取色工具
  • Octotree: github 專案的右邊導航
  • FeHelper: Web 前端助手, json, 二維碼,加密等等
  • React Develop tools: React 除錯工具
  • Tampermonkey: 油猴指令碼

核心五部分

  • Manifest 宣告檔案
  • Background Script 執行在後臺的指令碼, 當然不僅僅是指令碼, 也有html
  • UI Elements browser action 和page action, omnibox, popup等等
  • Content Script 執行在當前內容頁面的指令碼
  • Options Page 配置頁面

官方資料 (需要FQ)

你有上面這四個連結, 你基本無所不知,無所不能了。

一個簡單的京東商品歷史價格查詢

本人喜歡在京東買東西,各種活動很累, 很煩。 因為沒有比較,就沒有傷害。 以後喜歡藉助慢慢買檢視,但是要來回切換, 麻煩。

其實已經有很多比較成熟的比價外掛了。比如

  • 惠惠購物助手
  • 懶人比價購物助手
  • 購物黨
  • 淘幫手
  • 等等

但是,個人保持學習態度, 寫一個極其簡單的,點選一下, 一條曲線。

正題

manifest

{
    //必須為2
    "manifest_version": 2, 
    "name": "JD Price History",
    "version": "1.0.0",
    "description": "京東商品歷史價格查詢",
    // 右上角圖示
    "browser_action": {  
        "default_icon": {
            "128": "icons/icon128.png",
            "16": "icons/icon16.png",
            "48": "icons/icon48.png"
        },
        "default_title": "檢查商品的歷史價格"
    },
    // 指令碼
    "content_scripts": [
        {
            "matches": [
                "http://*/*",
                "https://*/*"
            ],
            "js": [
                "content/echarts.common.min.js",
                "content/md5.js",
                "content/encrypt.js",
                "content/index.js"
            ],
            // 執行實際
            "run_at": "document_end"
        }
    ],
    // 擴充套件程式網站
    "homepage_url": "https://github.com/xiangwenhu",
    "icons": {
        "128": "icons/icon128.png",
        "16": "icons/icon16.png",
        "48": "icons/icon48.png"
    },
    // 許可權,其實這裡不需要那麼多
    "permissions": [
        "contextMenus",
        "tabs",
        "notifications",
        "webRequest",
        "webRequestBlocking",
        "storage",
        "https://*/",
        "http://*/",
        "https://*.manmanbuy.com/",
        "http://*.manmanbuy.com/"
    ]
  
}

比較有用的是

  • browser_action 右上角的標
  • permissions 許可權,不然你傳送請求是不會成功
  • content_scripts 內容指令碼

content script

我們呼叫慢慢買的一個介面, 需要傳入類似這樣的地址http://item.jd.com/4813300.html,請求這個地址就能獲得歷史資料, 但是需要引入慢慢買的兩個加密檔案。

function getRequestUrl(requestUrl) {
    requestUrl = requestUrl.split('?')[0].split('#')[0];
    var url = escape(requestUrl);
    var token = d.encrypt(requestUrl, 2, true);

    var urlArr = [];
    urlArr.push('https://tool.manmanbuy.com/history.aspx?DA=1&action=gethistory&url=');
    urlArr.push(url);
    urlArr.push('&bjid=&spbh=&cxid=&zkid=&w=951&token=');
    urlArr.push(token);

    return urlArr.join('');

}

封裝簡單的http_get請求,這裡你應該是可以引入jQuery,網上有人說要攔截請求,我這裡正常的傳送是沒有問題的。

function http_get(options) {
    var timeout = options.onTimeout
    var url = options.url;
    var success = options.success;
    var error = options.error;

    var xhr = new XMLHttpRequest();
    xhr.timeout = 10000;
    xhr.ontimeout = function (event) {
        console.log('request url' + url + ', timeout');
        timeout && timeout()
    }
    xhr.open('GET', url, true);
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            success && success(xhr.responseText);
        }
    }
    xhr.onerror = function () {
        error && error(xhr.statusText)
    }
    xhr.send();
}

基本傳送http請求, 解析資料就好了。

最後發一張圖 外掛效果圖

開發外掛本身內容還是很複雜的, 需要慢慢品讀。