#Chrome扩展程序开发教程--03:Manifest

news2024/11/23 16:54:18

#Chrome扩展程序开发教程--03:Manifest

    • 引言
    • 1、基本介绍
    • 2、必须属性
    • 3、重要属性
      • 3.1、permissions、host_permissions、optional_permissions、optional_host_permissions
      • 3.2、background
      • 3.3、content_scripts
      • 3.4、action
      • 3.5、options_page
      • 3.6、options_ui
      • 3.7、icons
      • 3.8、commands
      • 3.9、event_rules
      • 3.10、automation
      • 3.11、declarative_net_request
      • 3.12、minimum_chrome_version
      • 3.13、requirements
      • 3.14、update_url
      • 3.15、web_accessible_resources
    • 4、安全属性
      • 4.1、input_components
      • 4.2、incognito
      • 4.3、sandbox
      • 4.4、oauth2
      • 4.5、content_security_policy
      • 4.6、cross_origin_embedder_policy
      • 4.7、cross_origin_opener_policy
      • 4.8、externally_connectable
    • 5、其它属性
      • 5.1、default_locale
      • 5.2、description
      • 5.3、author
      • 5.4、version_name
      • 5.5、short_name
      • 5.6、omnibox
      • 5.7、devtools_page
      • 5.8、homepage_url
      • 5.9、chrome_url_overrides
      • 5.10、chrome_settings_overrides
      • 5.11、tts_engine
      • 5.12、export
      • 5.13、import
      • 5.14、storage
      • 5.15、file_browser_handlers
      • 5.16、file_system_provider_capabilities

引言

        本系列博客旨在带来最新的Chrome扩展程序开发入门教程。


1、基本介绍

        所有的扩展程序必须在根目录中包含且只包含一个 manifest.json 文件。这个文件我们通常称为清单文件,里面记录了关于这个扩展程序的所有元数据:使用的文件,需要的权限,谁来处理事件,谁来处理网页等。
        本章中笔者对 manifest.json 中所有属性进行了总结,并按照重要性划分成了四部分。

2、必须属性

        这三个是必须指定的,含义就不解释了。

{
  "manifest_version": 3,
  "name": "My Extension",
  "version": "1.0.1"
}

3、重要属性

3.1、permissions、host_permissions、optional_permissions、optional_host_permissions

        这些属性与权限相关,具体请见第四章。

3.2、background

        用于指定 service worker 文件,具体请见第五章。

3.3、content_scripts

        用于指定 content scripts 文件,具体请见第六章。

3.4、action

        通过指定 action 字段来控制扩展程序在 Chrome 中如何展现工具栏,如下所示:

{
  "name": "Action Extension",
  ...
  "action": {
    "default_icon": {              // optional
      "16": "icons/16.png",   // optional
      "32": "icons/32.png",   // optional
      "48": "icons/48.png"    // optional
    },
    "default_title": "Click Me",   // optional, shown in tooltip
    "default_popup": "popup.html"  // optional
  },
  ...
}

        default_icon 属性用于指定扩展程序的工具栏图标,该属性是一个字典,键为图像尺寸,值为图像路径。Chrome会根据用户电脑的屏幕分辨率来自动选择最合适的图标进行展示。当然,也可以通过 Chrome API 来动态设置工具栏图标,如下所示:

const canvas = new OffscreenCanvas(16, 16);
const context = canvas.getContext('2d');
context.clearRect(0, 0, 16, 16);
context.fillStyle = '#00FF00';  // Green
context.fillRect(0, 0, 16, 16);
const imageData = context.getImageData(0, 0, 16, 16);
chrome.action.setIcon({imageData: imageData}, () => { /* ... */ });

        default_title 属性用于指定扩展程序的工具栏提示(Tooltip),当然也可以通过 action.setTitle() 来动态设置。
        default_popup 属性用于指定当用户点击扩展程序的工具栏后应当展现的内容。需要注意的是,popup 的内容大小必须位于 25x25 至 800x600 之间。当然也可以通过 action.setPopup() 来动态设置。

3.5、options_page

        用于指定 options 页面文件。扩展程序可以使用 options_page 来提供更多,更详细的交互功能,例如配置扩展程序可以在哪些网站上运行。如下所示:

{
  "name": "My extension",
  ...
  "options_page": "options.html",
  ...
}

3.6、options_ui

        与 options_page 不同的是,options_ui 是弹出一个小窗口来展示 options 页面,如下所示:

{
  "name": "My extension",
  ...
  "options_ui": {
    "page": "options.html",
    "open_in_tab": false
  },
  ...
}

3.7、icons

        指定扩展程序需要用到的图标资源,推荐使用 png 格式图片。如下所示:

{
  ...
 "icons": {
    "16": "icon16.png",
    "32": "icon32.png",
    "48": "icon48.png",
    "128": "icon128.png"
  }
  ...
}

3.8、commands

        用于指定扩展程序的一些快捷键,如下所示:

{
  "name": "My extension",
  ...
  "commands": {
    "run-foo": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y"
      },
      "description": "Run \"foo\" on the current page."
    },
    "_execute_action": {
      "suggested_key": {
        "windows": "Ctrl+Shift+Y",
        "mac": "Command+Shift+Y",
        "chromeos": "Ctrl+Shift+U",
        "linux": "Ctrl+Shift+J"
      }
    }
  },
  ...
}

3.9、event_rules

        用于定义事件规则,以指定何时应该调用扩展程序的特定部分。如下所示:

{
  "name": "Sample extension",
  "event_rules": [{
    "event": "declarativeContent.onPageChanged",
    "actions": [{
      "type": "declarativeContent.ShowPageAction"
    }],
    "conditions": [{
      "type": "declarativeContent.PageStateMatcher",
      "css": ["video"]
    }]
  }],
  ...
}

3.10、automation

        通过配置该属性并指定 host_permissions 或 activeTab 后,就可以让扩展程序使用 chrome.automation API。如下所示:

{
   ...
   "automation": {
    "desktop": true,
    "interact": true,
    "matches": [
      "www.google.com" 
      ]
  }
  ...
}

        desktop 属性用于申请调用 getDesktop() 及其相关操作权限。
        interact 属性表示扩展程序是否可以使用与用户的交互操作相关的 Chrome API,如鼠标点击、键盘输入等。
        matches 属性用于指定 automation 能够访问的网页。

3.11、declarative_net_request

        用于建立一种新的网络请求方式。该属性允许扩展程序使用声明式规则来修改网络请求的行为,例如拦截、重定向、修改参数等,而无需使用传统的网络请求钩子(如 XMLHttpRequest )。
        声明式网络请求可以帮助扩展程序更高效地修改网络请求,同时减少资源消耗和延迟。此外,它还提供了更加安全的网络请求方式,因为它可以帮助避免以前可能引起跨站点脚本攻击的常见漏洞。内容较多,这里不展开介绍,有兴趣的读者可以自行查阅 chrome.declarativeNetRequest。

3.12、minimum_chrome_version

        用于指定扩展程序能安装的最小 Chrome 版本。如下所示:

{
  ...
  "minimum_chrome_version": "107"
  ...
}

3.13、requirements

        用于指定扩展程序所依赖的浏览器功能、API 和其他扩展,如:所需的最低 Chrome 版本、所需的权限(如访问网页内容、管理标签页等)、所需的 API(如 storage 、notifications 等)以及所需的其他扩展程序。通过使用 requirements 属性,开发者可以确保扩展程序在运行时能够访问必要的资源和功能,并避免不必要的错误和崩溃。如下所示:

"requirements": {
  "3D": {
    "features": ["webgl"]
  }
  "plugins": {
    "npapi": true
  }
}

3.14、update_url

        如果扩展程序不在 Chrome 商店中,则必须包含该属性,如下所示:

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

        返回的 updates.xml 格式如下所示:

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

        appid 属性表示扩展程序的 ID。
        codebase 属性指向 crx 扩展程序文件。
        version 属性表示扩展程序版本。

3.15、web_accessible_resources

        用来指定可从扩展程序中访问的资源,包括 HTML、图片、CSS、JavaScript 等文件。这些资源可以在页面中使用 chrome.extension.getURL() 方法进行访问。这种方式可以帮助开发者提高扩展程序的安全性,因为通过 web_accessible_resources 指定的资源只有在指定的 URL 下才能被访问,而不会被其他网站访问。同时也可以让开发者更方便地调用和管理扩展程序中的资源。如下所示:

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }, {
      "resources": [ "test3.png", "test4.png" ],
      "matches": [ "https://web-accessible-resources-2.glitch.me/*" ],
      "use_dynamic_url": true
    }
  ],
  ...
}

4、安全属性

4.1、input_components

        用于自定义输入组件的 API,它可以让开发者自定义输入控件的样式和功能,使用户在填写表单时有更好的体验。该属性可以被用于 text、number、email 等类型的输入框,可以自定义输入框的外观、自动完成列表、输入验证和键盘快捷键等。此外, input_components 还能够帮助开发者提高扩展程序的安全性,因为它可以防止用户在输入敏感信息时被键盘记录器或恶意软件截取和窃取。

4.2、incognito

        用于指定扩展程序在 Chrome 的隐身模式下的行为,取值有:
        spanning:表示扩展程序将会在隐身模式和正常模式下共享相同的状态和数据。
        split:表示扩展程序将在隐身模式下使用单独的状态和数据,与正常模式下的状态和数据分离。
        not_allowed:表示扩展程序将完全被禁止在隐身模式下运行。

4.3、sandbox

        该属性是一个安全机制,用于隔离扩展程序的 JavaScript 代码与浏览器环境之间的交互,以确保扩展不会在运行时访问到敏感的浏览器资源。当 sandbox 属性设置为 true 时,扩展程序将会在单独的沙箱中运行,这意味着其 JavaScript 代码只能在该沙箱内部访问受控资源,而不能跨越沙箱之外的浏览器环境访问其他资源,例如浏览器的 cookies、本地存储等。这样,即使扩展被恶意攻击,也不会对浏览器和用户造成安全问题。

4.4、oauth2

        用于进行 OAuth2 授权流程的配置参数,用于从第三方服务或 API 中获取授权访问权限。这些属性包括客户端 ID、客户端密钥、回调 URL 等,扩展程序可以根据这些属性从外部服务中获取访问令牌,然后使用访问令牌进行 API 调用。OAuth2 授权与认证流程非常安全,因为它不需要用户提供其用户名和密码,而是使用一次性令牌来完成授权和访问。

4.5、content_security_policy

        用于规定扩展程序中加载的资源允许的来源和类型。它可以限制扩展程序中包含的 HTML、JavaScript、CSS 等代码通过 HTTP、HTTPS、插件等方式访问外部资源,可以防止恶意脚本在扩展程序中执行不受信任代码,从而增强扩展程序的安全性。如下所示:

{
  ...
  "content_security_policy": {
    "extension_pages": "script-src 'self'; object-src 'self';",
    "sandbox": "sandbox allow-scripts allow-forms allow-popups allow-modals; script-src 'self' 'unsafe-inline' 'unsafe-eval'; child-src 'self';"
  }
  ...
}

4.6、cross_origin_embedder_policy

        用于设置跨域嵌入策略。它可以在 Chrome 中实现更强的安全性,并帮助防止网站被攻击。该属性允许插件将策略设置为 strict-origin-when-cross-origin 。这个策略允许插件通过 iframe 向另一个源请求资源,但当请求源和 iframe 源不同时,只允许出现相同源的请求。这大大减少了跨站点攻击的风险,并防止不安全的资源访问。如下所示:

{
    ...
    "cross_origin_embedder_policy": {
      "value": "require-corp"
    },
    ...
}

4.7、cross_origin_opener_policy

        用于设置跨源 iframe 与打开它的窗口之间的安全策略。该属性控制在一个源下打开的文档是否允许访问打开它的窗口。其值可以为 “same-origin”、“same-origin-allow-popups”、“unsafe-none” 和 null 。默认情况下,该属性值为 null ,表示没有限制。
        当该属性值为 “same-origin” 时,文档只能访问与其同源的窗口。当值为 “same-origin-allow-popups” 时,文档可以访问与其同源的窗口,但允许来自外部源而被允许通过 window.opener 访问到当前源的窗口。当该值为 “unsafe-none” 时,所有窗口间均可以直接互相访问,这将降低安全性。
        通过设置 cross_origin_opener_policy 属性,开发者可以有效地控制在扩展程序的不同文档间进行安全的跨源通信。如下所示:

{
    ...
    "cross_origin_opener_policy": {
      "value": "same-origin"
    },
    ...
}

4.8、externally_connectable

        用于列出哪些网站或扩展程序可以通过 Chrome 的 runtime.connect()、runtime.sendMessage()、tabs.sendMessage() 或者其他类似的 API 与当前扩展程序通信。这个属性用于确保只有指定的网站或者扩展程序可以与扩展程序交互通信,从而增加了通信的安全性。

5、其它属性

5.1、default_locale

        本地化属性,指定扩展程序的语言。

5.2、description

        指定扩展程序的功能简介。

5.3、author

        指定扩展程序的作者信息。

5.4、version_name

        版本名称

5.5、short_name

        扩展程序的简称。

5.6、omnibox

        用于自定义浏览器地址栏的行为。通过 omnibox 属性,开发者可以向浏览器地址栏添加自定义的关键字、快捷键以及处理用户在地址栏输入的指令,从而实现一些快速搜索、跳转到指定页面等功能。如下所示:

{
  "name": "Aaron's omnibox extension",
  "version": "1.0",
  "omnibox": { "keyword" : "aaron" },
  "icons": {
    "16": "16-full-color.png"
  },
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  }
}

5.7、devtools_page

        用于自定义 DevTools 界面,也就是我们按 F12 出现的那个界面,内容较多,这里不展开介绍,有兴趣的读者可以自行查阅 Extending DevTools。

5.8、homepage_url

        用于设置扩展程序的主页,如下所示:

{
 ...
 "homepage_url": "https://example.com,",
 ...
}

5.9、chrome_url_overrides

        用于覆盖 Chrome 中的内置页面,如:chrome://bookmarks、chrome://history 和 chrome://newtab,但需要注意的是,一个扩展程序只能覆盖其中的一个页面,如下所示:

{
  "name": "My extension",
  ...

  "chrome_url_overrides" : {
    "PAGE_TO_OVERRIDE": "myPage.html"
  },
  ...
}

5.10、chrome_settings_overrides

        用于覆盖 Chrome 本身的一些配置属性,如下所示:

{
  "name": "My extension",
  ...
  "chrome_settings_overrides": {
    "homepage": "https://www.homepage.com",
    "search_provider": {
        "name": "name.__MSG_url_domain__",
        "keyword": "keyword.__MSG_url_domain__",
        "search_url": "https://www.foo.__MSG_url_domain__/s?q={searchTerms}",
        "favicon_url": "https://www.foo.__MSG_url_domain__/favicon.ico",
        "suggest_url": "https://www.foo.__MSG_url_domain__/suggest?q={searchTerms}",
        "instant_url": "https://www.foo.__MSG_url_domain__/instant?q={searchTerms}",
        "image_url": "https://www.foo.__MSG_url_domain__/image?q={searchTerms}",
        "search_url_post_params": "search_lang=__MSG_url_domain__",
        "suggest_url_post_params": "suggest_lang=__MSG_url_domain__",
        "instant_url_post_params": "instant_lang=__MSG_url_domain__",
        "image_url_post_params": "image_lang=__MSG_url_domain__",
        "alternate_urls": [
          "https://www.moo.__MSG_url_domain__/s?q={searchTerms}",
          "https://www.noo.__MSG_url_domain__/s?q={searchTerms}"
        ],
        "encoding": "UTF-8",
        "is_default": true
    },
    "startup_pages": ["https://www.startup.com"]
   },
   "default_locale": "de",
   ...
}

5.11、tts_engine

        用于指定扩展程序使用的语音引擎。它指定了将要使用的语音引擎的名称或 ID,并允许开发人员将不同的语音引擎与其扩展程序结合使用。通过设置 tts_engine 属性,开发人员可以根据自己的需求选择最适合他们扩展程序的语音引擎。

5.12、export

        用于导出模块的,它可以将一个模块或者一个变量、函数等暴露给其他模块或应用程序使用。

5.13、import

        用于指定扩展程序中的 JavaScript 模块或其他资源的来源,使扩展程序能够在其不同的组件之间共享代码和资源。

5.14、storage

        用于在浏览器中存储和读取数据。它类似于浏览器中的 localStorage 和 sessionStorage,但它允许扩展程序通过特定的键和值来访问和修改存储的数据。使用storage属性,扩展程序可以存储用户偏好、设置和其他数据,以便在不同的会话之间保持状态和同步数据。此外,storage属性还允许扩展程序共享数据和设置,以便在使用多个浏览器时保持一致性。如下所示:

{
  "name": "My enterprise extension",
  "storage": {
    "managed_schema": "schema.json"
  },
  ...
}

5.15、file_browser_handlers

        用于指定可用于打开某些文件类型的程序或应用程序。 通过该属性,开发人员可以向 Chrome 浏览器添加自定义文件处理程序。当用户尝试打开某个文件类型时,可以在文件打开对话框中选择安装了该处理程序的应用程序。

5.16、file_system_provider_capabilities

        用于指定 Chrome 扩展程序提供的文件系统的功能和支持的文件操作类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ Linux Web Server 面试基础篇-操作系统(四、线程通信)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

TiDB实战篇-Data Migration (DM) 同步数据

目录 简介 原理 任务管理 ​编辑同步拓扑示例 使用场景 限制 硬件配置 安装&升级 部署 生成配置文件 生成配置文件模板 更具自身的机器修改 部署 启动集群&查看集群 实战 上游数据库前提 配置mysql的相关配置 编写DM的MySQL相关配置 把MySQL和DM …

【JavaEE】Bean的作用域和生命周期

目录 Bean的作用域 作用域分类 设置作用域 通过注解设置 通过配置文件设置 Bean的生命周期 Bean的作用域 Bean的作用域是指&#xff1a;在整个Spring容器中Bean的行为模式。这个模式有六种。 作用域分类 singleton&#xff1a;单例作用域。 在这个模式下&#xff0c;容器…

网络地址转换应用

如图所示,企业使用一台AR 路由器作为出口设备,路由器配置NAT Outbound为私网用户提供访问Internet服务,同时配置NAT Server将私网WEB服务器发布到公网上,对外网用户提供服务。运营商仅为该单位分配了一个公网IP,此地址既作为AR出接口的IP地址,也作为NAT Outbound和NAT Se…

【Atlas500】华为Atals MindStudio配置指南

目录 安装推理用ubuntu版docker配置docker内的ssh服务安装ubuntu系统中的依赖项&#xff1a;检查root用户的umask安装依赖项安装CANN连接到CANN Setting 安装推理用ubuntu版docker 华为的atlas500自带的欧拉系统是一个裁剪系统&#xff0c;一般通过在其上运行官方的ubuntu dock…

【消息队列】Kafka高水位和Leader Epoch原理

什么是高水位 首先高水位也就是HW&#xff0c;而对应的有LEO&#xff0c;其实这都是Kafka副本中针对位移的概念&#xff0c;其目的就是为了保证多副本间数据的一致性。 LEO &#xff08;Log End Offet&#xff09;&#xff1a;每个副本的最后一个offset&#xff0c;LEO其实就是…

你猜我猜不猜 (猜数字游戏) 快来小玩一把叭

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将C语言知识一网打尽&#xff0c;希望可…

解决Vue热更新失效问题

解决Vue热更新失效 一、问题描述二、出现原因三、解决方案四、总结 &#x1f680; 欢迎访问我的个人博客&#xff1a;https://wk-blog.vip 一、问题描述 之前在本地测试Vue项目时&#xff0c;是可以热更新的&#xff0c;但是最近一段时间发现Vue的热更新失效了。然后通过vs co…

【大厂直通车】美团_测开面经

哈喽,大家好,我是小浪;那么最近暑假实习,日常实习是卷的飞起,无论是开发岗,测试岗,算法岗,都一片死寂;不过还是有很多大佬,成功绞杀很多大厂,offer也是拿到手软; 团子暑期实习offer: 📱本专栏致力于持续更新最新各大厂面经,实习消息,招聘要求; 那么目前价格…

ISCSI个人理解与简要说明

ISCSI个人理解与简要说明 一、如何理解ISCSI二、iscsi 命令iscsiadm&#xff08;管理客户端&#xff09;tgtadm&#xff08;管理服务端&#xff09; 三、ISCSI中的概念四、从DAS&#xff0c;NAS&#xff0c;SAN的角度扩展理解ISCSI 一、如何理解ISCSI 理解一个东西&#xff0c…

Niginx的rewrite

常用的Nginx正则表达式 ^匹配输入字符串的起始位置 $匹配输入字符串的结束位置 *匹配前面的字符零次或多次。如“ol*" 能匹配"o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol" 能匹配“ol"及“ol1”、“olll"&#xff0c; 但不能匹配“o” ?…

服务器版本的表白墙

目录 1.步骤 2.提供两个接口: 3.流程 4.代码 1.前端代码 2.sql创建表 3.后端代码 MessageServlet.java DBUtil.java 1.步骤 1.约定前后端交互的接口 2.开发服务器代码 a.编写servlet处理前端发来的请求 b.编写数据库代码,存储获取关键的数据 3.开发客户端代码 a.基于…

java学习中遇到的问题及解答

你好&#xff0c;我想问一下&#xff0c;为什么在idea编译环境下&#xff0c;有异常的地方它会报错&#xff0c;让你主动添加抛出错误代码呢&#xff1f; 在Java中&#xff0c;有两种类型的异常&#xff0c;一种是受检异常&#xff08;checked exception&#xff09;&#xff0…

一级结构规范 合集

极限状态设计原则4.1限态4.11 极限状态可分为承载能力极限状态、正常使用极限状态和耐久性极限状态。极限状态应符合下列规定:1当结构或结构构件出现下列状态之一时&#xff0c;应认定为超过了承载能力极限状态;1) 结构构件或连接因超过材料强度而破坏&#xff0c;或因过度变形…

安捷伦E4433B信号发生器

E4433B Agilent E4433B ESG-D系列 4G信号发生器安捷伦250kHz-4GHz 品  牌&#xff1a; Agilent 简单介绍 频率范围&#xff1a; E4430B 250K-1GHz E4431B 250K-2GHz E4432B 250K-3GHz E4433B 250K-4GHz 18320918653 供单信道和多信道CDMA用的测量卡用于I和Q的20 MH…

第六章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色&#xff1a; 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类&#xff08;抽象建…

Node内置模块 【Event事件模块】

文章目录 &#x1f31f;前言&#x1f31f;Event事件模块&#x1f31f;EventEmitter类&#x1f31f;加载events模块&#x1f31f;实例化eventEmitter对象 &#x1f31f;事件方法列表&#x1f31f;使用事件&#x1f31f;异步与同步 &#x1f31f;写在最后 &#x1f31f;前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…

CE作业(3)

1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息&…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》&#xff0c;已经对证书这些概念有基本的了解&#xff…