记一次浏览器插件的编写

Published on
33

概述

最近需要统计公司所有主播的直播记录,和每场卖的商品信息,本来打算使用爬虫进行爬取,但是某手会对频繁请求的IP进行拉黑处理。使用代理IP的话也不算稳定,最终选择浏览器插件,每次直播结束后由运营来上传数据。

阅读谷歌插件文档

最开始 是根据谷歌插件的官方文档去创建的项目:https://developer.chrome.com/docs/extensions?hl=zh-cn

以下是文件结构。

构思是这样的:用户点击插件,弹出popup,在popup中展示登录二维码,运营扫码登录,然后获取到了cookie,去请求主播 直播列表,并且获取每场直播的GMV、直播退款率、直播卖品列表等信息。

时间紧迫、选择了熟悉的vue进行开发。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <!-- <link rel="stylesheet" href="style.css"> -->
    <link href="./static/full.min.css" rel="stylesheet" type="text/css" />
    <script src="./static/3.4.14"></script>
</head>

<body>
    <div id="app"></div>
    <script src="./static/vue.global.js"></script>
    <script src="main.js" type="module"></script>
</body>

</html>
const { createApp } = Vue;
import app from './src/app.js';

createApp({
    setup() {
        return () => {
            const { h } = Vue;
            return h(app);
        }
    }
}).mount('#app');
const { defineComponent, h } = Vue;

export default defineComponent({
    setup() { },

    render() {
        return h('div', {
            style: {
                padding: '10px',
                backgroundColor: '#f5f5f5',
                width: '600px',
            }
        }, [
            h('button', {
                class: 'btn',
                onClick: async () => {
                    const [tab] = await chrome.tabs.query({ active: true });
                    const response = await chrome.tabs.sendMessage(tab.id, { type: 'GET_LIVE_LIST' });
                    console.log(response);
                }
            }, '获取数据'),
        ]);
    }
});

使用h渲染函数进行书写页面。

但是。这种写法写的插件,由于没有进行打包,分发给各位运营有泄露源码的风险。

使用WXT工程化框架进行开发

所以去GitHub上找了一个工程化框架。链接:https://github.com/wxt-dev/wxt 文档:https://wxt.dev/

这个框架集成了vue、使用vite进行打包。

这是项目结构

这是项目结构,跟普通的vue项目大差不差,可以根据平常开发流程进行开发了。

踩过的坑

我们需要在插件中请求某手的接口,但是只携带Cookie接口会返回网络异常。还需要携带一个Referer参数才可以正常请求。

那么 Referer 是什么呢

在HTTP/HTTPS协议中,Referer(也写作Referrer,在HTTP头字段中拼写为Referer)是一个请求头字段,用来表示当前请求从哪个页面发起的。这个字段可以包含请求资源的来源URL地址,通常在用户点击链接或触发其他跨页面行为时由浏览器自动添加。

由此可知,是浏览器自动添加的,我在插件请求头中手动指定Referer 的话会被浏览器覆盖掉,这该怎么解决呢!

chrome.webRequest

Chrome Extensions 文档:https://developer.chrome.com/docs/extensions/reference/api/webRequest?hl=zh-cn

这个API可以修改传输中的请求,但是Manifest V3不推荐使用了。

chrome.declarativeNetRequest

这个可以用!调用这个api,修改相应的请求信息。

chrome.declarativeNetRequest.updateDynamicRules({
    removeRuleIds: [1],
    addRules: [
      {
        id: 1,
        priority: 1,
        action: {
          type: chrome.declarativeNetRequest.RuleActionType.MODIFY_HEADERS,
          requestHeaders: [
            {
              header: "Referer",
              operation: chrome.declarativeNetRequest.HeaderOperation.SET,
              value: "需要设置的Referer",
            },
            {
              header: "Origin",
              operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE,
            },
          ],
        },
        condition: {
          urlFilter:
            "哪个请求连接需要修改Referer",
          resourceTypes: [
            chrome.declarativeNetRequest.ResourceType.XMLHTTPREQUEST,
          ],
        },
      }
     
    ],
  });

这样请求指定的链接就可以加上相应的Referer了,接口可以请求成功了!

完结!撒花~


Prev Post [unibest] 最好用的 uniapp 开发框架
Next Post C端增长业务中的动效探索