browser.declarativeNetRequest

说明

chrome.declarativeNetRequest API 用于通过指定声明性规则来屏蔽或修改网络请求。这样一来,扩展程序就可以在不拦截网络请求和查看其内容的情况下修改网络请求,从而提供更高的隐私保护。

权限

declarativeNetRequest
declarativeNetRequestWithHostAccess

“declarativeNetRequest”和“declarativeNetRequestWithHostAccess”权限提供相同的功能。它们之间的区别在于何时请求或授予权限。

"declarativeNetRequest"
在安装时触发权限警告,但提供对 allow、allowAllRequests 和 block 规则的隐式访问权限。请尽可能使用此权限,以免需要向主持人请求完全访问权限。
"declarativeNetRequestFeedback"
为未封装的扩展程序启用调试功能,具体而言是 getMatchedRules() 和 onRuleMatchedDebug。
"declarativeNetRequestWithHostAccess"
安装时不会显示权限警告,但您必须先请求主机权限,然后才能对主机执行任何操作。如果您想在已具有主机权限的扩展程序中使用声明性网络请求规则,而不生成额外的警告,则此设置非常适合。

可用性

Chrome 84 及更高版本

清单

除了前面所述的权限之外,某些类型的规则集(尤其是静态规则集)还需要声明 "declarative_net_request" 清单键,该键应是一个包含单个键(名为 "rule_resources")的字典。此键是一个包含 Ruleset 类型字典的数组,如下所示。(请注意,由于“Ruleset”只是一个数组,因此不会显示在清单的 JSON 中。)本文档后面部分介绍了静态规则集。

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

  "declarative_net_request" : {
    "rule_resources" : [{
      "id": "ruleset_1",
      "enabled": true,
      "path": "rules_1.json"
    }, {
      "id": "ruleset_2",
      "enabled": false,
      "path": "rules_2.json"
    }]
  },
  "permissions": [
    "declarativeNetRequest",
    "declarativeNetRequestFeedback"
  ],
  "host_permissions": [
    "http://www.blogger.com/*",
    "http://*.google.com/*"
  ],
  ...
}

规则和规则集

如需使用此 API,请指定一个或多个规则集。规则集包含一个规则数组。单个规则可执行以下操作之一:

  • 屏蔽网络请求。
  • 升级架构(从 http 到 https)。
  • 通过否定任何匹配的已屏蔽规则,防止请求被屏蔽。
  • 重定向网络请求。
  • 修改请求或响应标头。

规则集有三种类型,管理方式略有不同。

动态
可在浏览器会话和扩展程序升级期间保持不变,并且在扩展程序使用期间通过 JavaScript 进行管理。
会话
在浏览器关闭时以及安装新版本的扩展程序时清除。在使用扩展程序时,会话规则通过 JavaScript 进行管理。
静态
在安装或升级扩展程序时进行打包、安装和更新。静态规则存储在 JSON 格式的规则文件中,并在清单文件中列出。

动态规则集和会话级范围的规则集

在使用扩展程序时,动态规则集和会话规则集通过 JavaScript 进行管理。

  • 动态规则在浏览器会话和扩展程序升级期间保持不变。
  • 浏览器关闭时以及安装新版本的扩展程序时,会清除会话规则。

每种规则集类型只有一个。扩展程序可以通过调用 updateDynamicRules() 和 updateSessionRules() 动态添加或移除规则,前提是未超出规则限制。如需了解规则限制,请参阅规则限制。您可以在代码示例下查看相关示例。

静态规则集

与动态规则和会话规则不同,静态规则在安装或升级扩展程序时进行打包、安装和更新。它们以 JSON 格式存储在规则文件中,并使用 "declarative_net_request" 和 "rule_resources" 键(如上所述)以及一个或多个 Ruleset 字典指示给扩展程序。Ruleset 字典包含规则文件的路径、文件中包含的规则集的 ID,以及规则集是启用还是停用。当您以编程方式启用或停用规则集时,后两个属性非常重要。

{
  ...
  "declarative_net_request" : {
    "rule_resources" : [{
      "id": "ruleset_1",
      "enabled": true,
      "path": "rules_1.json"
    },
    ...
    ]
  }
  ...
}

如需测试规则文件,请以未打包的形式加载扩展程序。有关无效静态规则的错误和警告仅针对未打包的扩展程序显示。系统会忽略打包扩展程序中的无效静态规则。

加急审核

对静态规则集的更改可能符合快速审核条件。请参阅符合条件的更改的加急审核。

启用和停用静态规则和规则集

在运行时,您可以启用或停用单个静态规则和完整的静态规则集。

已启用的静态规则和规则集的集合会在浏览器会话之间保持不变。这两者都不会在扩展程序更新后保留,这意味着只有您选择保留在规则文件中的规则会在更新后可用。

出于性能方面的原因,一次可启用的规则和规则集数量也有限制。调用 getAvailableStaticRuleCount() 以检查可启用的额外规则数量。如需了解规则限制,请参阅规则限制。

如需启用或停用静态规则,请调用 updateStaticRules()。此方法接受一个 UpdateStaticRulesOptions 对象,其中包含要启用或停用的规则 ID 数组。ID 使用 Ruleset 字典的 "id" 键进行定义。停用的静态规则数量上限为 5,000 条。

如需启用或停用静态规则集,请调用 updateEnabledRulesets()。此方法接受一个 UpdateRulesetOptions 对象,其中包含要启用或停用的规则集 ID 数组。ID 使用 Ruleset 字典的 "id" 键进行定义。

构建规则

无论规则类型如何,规则都以四个字段开头,如下所示。虽然 "id" 和 "priority" 键采用的是数字,但 "action" 和 "condition" 键可以提供多个屏蔽和重定向条件。以下规则会屏蔽从 "foo.com" 发送到任何包含 "abc" 作为子字符串的网址的所有脚本请求。

{
  "id" : 1,
  "priority": 1,
  "action" : { "type" : "block" },
  "condition" : {
    "urlFilter" : "abc",
    "initiatorDomains" : ["foo.com"],
    "resourceTypes" : ["script"]
  }
}

网址匹配

Declarative Net Request 能够使用模式匹配语法或正则表达式来匹配网址。

网址过滤条件语法

规则的 "condition" 键允许使用 "urlFilter" 键来处理指定网域下的网址。您可以使用模式匹配令牌创建模式。以下是一些示例。

urlFilter 组合 不匹配
"abc" https://abcd.com
https://example.com/abcd
https://ab.com
"abc*d" https://abcd.com
https://example.com/abcxyzd
https://abc.com
"||a.example.com" https://a.example.com/
https://b.a.example.com/xyz
https://a.example.company
https://example.com/
"|https*" https://example.com http://example.com/
http://https.com
"example*^123|" https://example.com/123
http://abc.com/example?123
https://example.com/1234
https://abc.com/example0123

正则表达式

条件也可以使用正则表达式。请参阅 "regexFilter" 键。如需了解适用于这些条件的限制,请参阅使用正则表达式的规则。

撰写优质的网址条件

编写规则时,请务必确保规则始终与整个网域匹配。否则,您的规则可能会在意外情况下匹配。例如,使用模式匹配语法时:

  • google.com错误地与https://example.com/?param=google.com匹配
  • ||google.com错误地与https://google.company匹配
  • https://www.google.com错误地与https://example.com/?param=https://www.google.com匹配

建议使用:

  • ||google.com/,用于匹配所有路径和所有子网域。
  • |https://www.google.com/,用于匹配所有路径,但不匹配任何子网域。

同样,您可以使用 ^ 和 / 字符来锚定正则表达式。例如,^https:\/\/www\.google\.com\/ 与 https://www.google.com 上的任何路径匹配。

规则评估

浏览器会在网络请求生命周期的各个阶段应用 DNR 规则。

在请求之前

在发出请求之前,扩展程序可以使用匹配的规则来阻止或重定向(包括将方案从 HTTP 升级到 HTTPS)该请求。

对于每个扩展程序,浏览器都会确定一个匹配规则列表。此处未包含具有 modifyHeaders 操作的规则,因为这些规则将在稍后处理。此外,具有 responseHeaders 条件的规则将在稍后(当响应标头可用时)考虑,因此不包含在内。

然后,对于每个扩展程序,Chrome 会为每个请求选择最多一个候选广告。Chrome 会按优先级对所有匹配的规则进行排序,然后找到匹配的规则。优先级相同的规则按操作排序(allow 或 allowAllRequests > block > upgradeScheme > redirect)。

如果候选规则是 allow 或 allowAllRequests 规则,或者发出请求的框架之前已匹配到此扩展程序中优先级更高或相同的 allowAllRequests 规则,则该请求会被“允许”,并且扩展程序不会对该请求产生任何影响。

如果有多个扩展程序想要阻止或重定向此请求,系统会选择要采取的单个操作。Chrome 会按 block > redirect 或 upgradeScheme > allow 或 allowAllRequests 的顺序对规则进行排序。如果两个规则属于同一类型,Chrome 会选择来自最近安装的扩展程序的规则。

在发送请求标头之前

在 Chrome 将请求标头发送到服务器之前,系统会根据匹配的 modifyHeaders 规则更新标头。

在单个扩展程序中,Chrome 会通过查找所有匹配的 modifyHeaders 规则来构建要执行的修改列表。与之前类似,只有优先级高于任何匹配的 allow 或 allowAllRequests 规则的规则才会包含在内。

Chrome 会按一定顺序应用这些规则,以便始终先评估最近安装的扩展程序的规则,然后再评估较旧的扩展程序的规则。此外,一个扩展程序中优先级较高的规则始终会先于同一扩展程序中优先级较低的规则应用。值得注意的是,即使在扩展程序之间:

  • 如果某条规则附加到某个标头,则优先级较低的规则只能附加到该标头。不允许执行设置和移除操作。
  • 如果某条规则设置了标头,则只有来自同一扩展程序的优先级较低的规则才能附加到该标头。不允许进行其他修改。
  • 如果某条规则移除了某个标头,则优先级较低的规则无法进一步修改该标头。

收到回答后

收到响应标头后,Chrome 会评估具有 responseHeaders 条件的规则。

在按 action 和 priority 对这些规则进行排序并排除因匹配的 allow 或 allowAllRequests 规则而变得冗余的任何规则(此过程与“请求之前”中的步骤完全相同)后,Chrome 可能会代表扩展程序阻止或重定向请求。

请注意,如果请求到达此阶段,则表示该请求已发送到服务器,并且服务器已收到请求正文等数据。具有响应标头条件的屏蔽或重定向规则仍会运行,但实际上无法屏蔽或重定向请求。

对于屏蔽规则,发出请求的网页会收到屏蔽响应,并且 Chrome 会提前终止请求,从而处理这种情况。对于重定向规则,Chrome 会向重定向的网址发出新请求。请务必考虑这些行为是否符合您扩展程序的隐私权预期。

如果请求未被阻止或重定向,Chrome 会应用所有 modifyHeaders 规则。对响应标头应用修改的方式与“在发送请求标头之前”中所述的方式相同。由于请求已发出,因此对请求标头应用修改不会产生任何影响。

安全规则

安全规则是指操作为 block、allow、allowAllRequests 或 upgradeScheme 的规则。这些规则受动态规则配额增加的限制。

规则限制

在浏览器中加载和评估规则会产生性能开销,因此使用该 API 时会受到一些限制。限制取决于您使用的规则类型。

静态规则

静态规则是指在清单文件中声明的规则文件中指定的规则。扩展程序最多可以在 "rule_resources" 清单键中指定 100 个静态规则集,但一次只能启用其中的 50 个规则集。后者称为 MAX_NUMBER_OF_ENABLED_STATIC_RULESETS。这些规则集总共至少包含 30,000 条规则。这称为 GUARANTEED_MINIMUM_STATIC_RULES。

之后可用的规则数量取决于用户浏览器上安装的所有扩展程序启用的规则数量。您可以在运行时通过调用 getAvailableStaticRuleCount() 找到此数字。您可以在代码示例下查看相关示例。

会话规则

一个扩展程序最多可以有 5,000 条会话规则。这以 MAX_NUMBER_OF_SESSION_RULES 的形式公开。

在 Chrome 120 之前,动态规则和会话规则的总数上限为 5, 000。

动态规则

扩展程序可以至少有 5,000 条动态规则。这以 MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES 的形式公开。

从 Chrome 121 开始,安全动态规则(以 MAX_NUMBER_OF_DYNAMIC_RULES 形式公开)的上限增加到 30,000 条。在 5,000 条规则的限制范围内添加的任何不安全规则也会计入此限制。

在 Chrome 120 之前,动态规则和会话规则的总数上限为 5, 000。

使用正则表达式的规则

所有类型的规则都可以使用正则表达式;不过,每种类型的正则表达式规则总数不得超过 1000 条。这称为 MAX_NUMBER_OF_REGEX_RULES。

此外,每条规则在编译后的大小必须小于 2KB。这与规则的复杂程度大致相关。如果您尝试加载超出此限制的规则,系统会显示类似如下的警告,并忽略该规则。

rules_1.json: Rule with id 1 specified a more complex regex than allowed
as part of the "regexFilter" key.

与 Service Worker 的互动

declarativeNetRequest 仅适用于到达网络堆栈的请求。这包括来自 HTTP 缓存的响应,但不包括通过 Service Worker 的 onfetch 处理程序的响应。declarativeNetRequest 不会影响由 Service Worker 生成的响应或从 CacheStorage 检索的响应,但会影响在 Service Worker 中对 fetch() 的调用。

可通过网络访问的资源

declarativeNetRequest 规则无法将公开资源请求重定向到无法通过网络访问的资源。这样做会触发错误。即使指定的 Web 可访问资源归重定向扩展程序所有,也是如此。如需为 declarativeNetRequest 声明资源,请使用清单的 "web_accessible_resources" 数组。

标头修改

仅支持对以下请求标头执行附加操作:accept、accept-encoding、accept-language、access-control-request-headers、cache-control、connection、content-language、cookie、forwarded、if-match、if-none-match、keep-alive、range、te、trailer、transfer-encoding、upgrade、user-agent、via、want-digest、x-forwarded-for。此许可名单区分大小写(bug 449152902)。

在附加到请求或响应标头时,浏览器会尽可能使用适当的分隔符。

示例

代码示例

更新动态规则

以下示例展示了如何调用 updateDynamicRules()。updateSessionRules() 的流程相同。

// Get arrays containing new and old rules
const newRules = await getNewRules();
const oldRules = await browser.declarativeNetRequest.getDynamicRules();
const oldRuleIds = oldRules.map(rule => rule.id);

// Use the arrays to update the dynamic rules
await browser.declarativeNetRequest.updateDynamicRules({
  removeRuleIds: oldRuleIds,
  addRules: newRules
});

更新静态规则集

以下示例展示了如何在考虑可用静态规则集数量和已启用静态规则集数量上限的情况下启用和停用规则集。当您需要的静态规则数量超出允许的数量时,可以这样做。为此,您应安装部分规则集,并停用部分规则集(在清单文件中将 "Enabled" 设置为 false)。

async function updateStaticRules(enableRulesetIds, disableCandidateIds) {
  // Create the options structure for the call to updateEnabledRulesets()
  let options = { enableRulesetIds: enableRulesetIds }
  // Get the number of enabled static rules
  const enabledStaticCount = await browser.declarativeNetRequest.getEnabledRulesets();
  // Compare rule counts to determine if anything needs to be disabled so that
  // new rules can be enabled
  const proposedCount = enableRulesetIds.length;
  if (enabledStaticCount + proposedCount > browser.declarativeNetRequest.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS) {
    options.disableRulesetIds = disableCandidateIds
  }
  // Update the enabled static rules
  await browser.declarativeNetRequest.updateEnabledRulesets(options);
}

规则示例

以下示例说明了 Chrome 如何确定扩展程序中规则的优先级。在查看这些规则时,您可能需要在单独的窗口中打开优先级规则。

“priority”键

这些示例需要 host 权限才能访问 *://*.example.com/*。

如需确定特定网址的优先级,请查看(开发者定义的)"priority" 键、"action" 键和 "urlFilter" 键。以下示例引用了下方显示的示例规则文件。

导航到 https://google.com
有两条规则涵盖此网址:ID 为 1 和 4 的规则。ID 为 1 的规则会生效,因为 "block" 操作的优先级高于 "redirect" 操作。其余规则不适用,因为它们适用于更长的网址。
导航到 https://google.com/1234
由于网址变长,ID 为 2 的规则现在也匹配了,而不仅仅是 ID 为 1 和 4 的规则。ID 为 2 的规则适用,因为 "allow" 的优先级高于 "block" 和 "redirect"。
导航到 https://google.com/12345
所有这四条规则都与此网址匹配。ID 为 3 的规则适用,因为其开发者定义的优先级是该组中最高的。
[
  {
    "id": 1,
    "priority": 1,
    "action": { "type": "block" },
    "condition": {"urlFilter": "||google.com/", "resourceTypes": ["main_frame"] }
  },
  {
    "id": 2,
    "priority": 1,
    "action": { "type": "allow" },
    "condition": { "urlFilter": "||google.com/123", "resourceTypes": ["main_frame"] }
  },
  {
    "id": 3,
    "priority": 2,
    "action": { "type": "block" },
    "condition": { "urlFilter": "||google.com/12345", "resourceTypes": ["main_frame"] }
  },
  {
    "id": 4,
    "priority": 1,
    "action": { "type": "redirect", "redirect": { "url": "https://example.com" } },
    "condition": { "urlFilter": "||google.com/", "resourceTypes": ["main_frame"] }
  },
]

重定向

以下示例需要对 *://*.example.com/* 具有主机权限。

以下示例展示了如何将来自 example.com 的请求重定向到扩展程序本身中的网页。扩展程序路径 /a.jpg 解析为 chrome-extension://EXTENSION_ID/a.jpg,其中 EXTENSION_ID 是扩展程序的 ID。为此,清单应将 /a.jpg 声明为可供 Web 访问的资源。

{
  "id": 1,
  "priority": 1,
  "action": { "type": "redirect", "redirect": { "extensionPath": "/a.jpg" } },
  "condition": {
    "urlFilter": "||https://www.example.com/",
    "resourceTypes": ["main_frame"]
  }
}

以下示例使用 "transform" 键重定向到 example.com 的子网域。它使用域名锚点 (“||”) 拦截来自 example.com 的任何方案的请求。"transform" 中的 "scheme" 键指定重定向到子网域时将始终使用“https”。

{
  "id": 1,
  "priority": 1,
  "action": {
    "type": "redirect",
    "redirect": {
      "transform": { "scheme": "https", "host": "new.example.com" }
    }
  },
  "condition": {
    "urlFilter": "||example.com/",
    "resourceTypes": ["main_frame"]
  }
}

以下示例使用正则表达式将用户从 https://www.abc.xyz.com/path 重定向到 https://abc.xyz.com/path。在 "regexFilter" 键中,请注意句点是如何转义的,以及捕获组如何选择“abc”或“def”。"regexSubstitution" 键使用“\1”指定正则表达式的第一个返回匹配项。在这种情况下,系统会从重定向的网址中捕获“abc”,并将其放置在替换项中。

{
  "id": 1,
  "priority": 1,
  "action": {
    "type": "redirect",
    "redirect": {
      "regexSubstitution": "https://\\1.xyz.com/"
    }
  },
  "condition": {
    "regexFilter": "^https://www\\.(abc|def)\\.xyz\\.com/",
    "resourceTypes": [
      "main_frame"
    ]
  }
}

标头

以下示例会从主框架和所有子框架中移除所有 Cookie。

{
  "id": 1,
  "priority": 1,
  "action": {
    "type": "modifyHeaders",
    "requestHeaders": [{ "header": "cookie", "operation": "remove" }]
  },
  "condition": { "resourceTypes": ["main_frame", "sub_frame"] }
}

类型

DomainType

用于描述相应请求是第一方请求还是第三方请求(相对于发起该请求的框架而言)。如果请求与发起请求的框架具有相同的网域 (eTLD+1),则该请求称为第一方请求。

枚举

“firstParty”
网络请求是发起该请求的框架的第一方。

“thirdParty”
网络请求是发起该请求的框架的第三方。

ExtensionActionOptions

Chrome 88 及更高版本

属性

  • displayActionCountAsBadgeText

    布尔值 (可选)

    是否自动将网页的操作次数显示为扩展程序的徽章文字。此偏好设置会在各个会话中保留。

  • tabUpdate
    Chrome 89 及更高版本

    有关如何调整标签页操作次数的详细信息。

GetDisabledRuleIdsOptions

Chrome 111 及更高版本

属性

  • rulesetId

    字符串

    与静态 Ruleset 对应的 ID。

GetRulesFilter

Chrome 111 及更高版本

属性

  • ruleIds

    number[] 可选

    如果指定,则仅包含具有匹配 ID 的规则。

HeaderInfo

Chrome 128 及更高版本

属性

  • excludedValues

    string[] 可选

    如果指定了此条件,则当标头存在但其值包含此列表中的至少一个元素时,系统不会匹配此条件。此属性使用的匹配模式语法与 values 相同。

  • header

    字符串

    标头的名称。仅当未指定 values 和 excludedValues 时,此条件才会匹配名称。

  • values

    string[] 可选

    如果指定了此条件,则当标头的值与此列表中的至少一种模式匹配时,此条件即为匹配。此功能支持不区分大小写的标头值匹配以及以下构造:

    “*”:匹配任意数量的字符。

    “?”:匹配零个或一个字符。

    可以使用反斜杠对“*”和“?”进行转义,例如“\*”和“\?”

HeaderOperation

Chrome 86 及更高版本

此表描述了“modifyHeaders”规则的可能操作。

枚举

“append”
为指定的标头添加新条目。修改请求的标头时,此操作仅支持特定标头。

“set”
为指定标头设置新值,并移除具有相同名称的所有现有标头。

“remove”
移除指定标头的所有条目。

IsRegexSupportedResult

Chrome 87 及更高版本

属性

  • isSupported

    布尔值

  • reason

    指定不支持正则表达式的原因。仅当 isSupported 为 false 时提供。

MatchedRule

属性

  • ruleId

    数值

    匹配规则的 ID。

  • rulesetId

    字符串

    相应规则所属的 Ruleset 的 ID。对于源自动态规则集的规则,此值将等于 DYNAMIC_RULESET_ID。

MatchedRuleInfo

属性

  • 规则
  • tabId

    数值

    如果标签页仍处于活动状态,则为发起请求的标签页的 tabId。否则为 -1。

  • timeStamp

    数值

    匹配规则的时间。时间戳将符合 JavaScript 的时间惯例,即自纪元以来的毫秒数。

MatchedRuleInfoDebug

属性

MatchedRulesFilter

属性

  • minTimeStamp

    number 可选

    如果指定,则仅匹配给定时间戳之后的规则。

  • tabId

    number 可选

    如果指定,则仅匹配给定标签页的规则。如果设置为 -1,则匹配未与任何有效标签页相关联的规则。

ModifyHeaderInfo

Chrome 86 及更高版本

属性

  • header

    字符串

    要修改的标头的名称。

  • 要对标头执行的操作。

  • 值

    字符串 可选

    标头的新值。必须为 append 和 set 操作指定。

QueryKeyValue

属性

  • 键

    字符串

  • replaceOnly

    布尔值 (可选)

    Chrome 94 及更高版本

    如果为 true,则仅当查询键已存在时才替换该键。否则,如果缺少该键,系统也会添加该键。默认值为 false。

  • 值

    字符串

QueryTransform

属性

  • addOrReplaceParams

    QueryKeyValue[] 可选

    要添加或替换的查询键值对的列表。

  • removeParams

    string[] 可选

    要移除的查询键的列表。

Redirect

属性

  • extensionPath

    字符串 可选

    相对于扩展程序目录的路径。应以“/”开头。

  • regexSubstitution

    字符串 可选

    指定了 regexFilter 的规则的替换模式。网址中首次匹配到的 regexFilter 将替换为此模式。在 regexSubstitution 中,可以使用通过反斜杠转义的数字(\1 至 \9)来插入相应的捕获组。“\0”表示整个匹配文本。

  • 转换

    URLTransform(可选)

    要执行的网址转换。

  • 网址

    字符串 可选

    重定向网址。不允许重定向到 JavaScript 网址。

RegexOptions

Chrome 87 及更高版本

属性

  • isCaseSensitive

    布尔值 (可选)

    指定的 regex 是否区分大小写。默认值为 true。

  • regex

    字符串

    要检查的正则表达式。

  • requireCapturing

    布尔值 (可选)

    指定的 regex 是否需要捕获。只有指定了 regexSubstition 操作的重定向规则才需要捕获。默认值为 false。

RequestDetails

属性

  • documentId

    字符串 可选

    Chrome 106 及更高版本

    相应框架的文档的唯一标识符(如果此请求是针对框架的)。

  • documentLifecycle
    Chrome 106 及更高版本

    相应框架的文档的生命周期(如果此请求是针对框架的)。

  • frameId

    数值

    值 0 表示请求发生在主框架中;正值表示请求发生的子框架的 ID。如果加载了(子)框架的文档(type 为 main_frame 或 sub_frame),则 frameId 表示相应框架的 ID,而不是外部框架的 ID。框架 ID 在标签页中是唯一的。

  • frameType

    FrameType 可选

    Chrome 106 及更高版本

    如果相应请求是针对帧的,则为帧的类型。

  • 发起人

    字符串 可选

    发起请求的来源。此值不会因重定向而发生变化。如果这是不透明来源,则将使用字符串“null”。

  • 方法

    字符串

    标准 HTTP 方法。

  • parentDocumentId

    字符串 可选

    Chrome 106 及更高版本

    相应框架的父级文档的唯一标识符(如果相应请求是针对框架且具有父级)。

  • parentFrameId

    数值

    封装了发送请求的帧的帧的 ID。如果没有父框架,则设置为 -1。

  • requestId

    字符串

    请求的 ID。请求 ID 在浏览器会话中是唯一的。

  • tabId

    数值

    发出请求的标签页的 ID。如果请求与标签页无关,则设置为 -1。

  • 类型

    请求的资源类型。

  • 网址

    字符串

    请求的网址。

RequestMethod

Chrome 91 及更高版本

用于描述网络请求的 HTTP 请求方法。

枚举

"connect"

"delete"

“get”

“head”

"options"

"patch"

“post”

"put"

"other"

ResourceType

用于描述网络请求的资源类型。

枚举

"main_frame"

"sub_frame"

"stylesheet"

“脚本”

"image"

“字体”

“object”

"xmlhttprequest"

“ping”

"csp_report"

"media"

"websocket"

"webtransport"

"webbundle"

"other"

Rule

属性

  • action

    如果匹配到此规则,则执行相应操作。

  • 条件

    触发相应规则的条件。

  • id

    数值

    唯一标识规则的 ID。必需,且应大于等于 1。

  • 优先级

    number 可选

    规则优先级。默认为1。如果指定,则应 >= 1。

RuleAction

属性

  • 重定向

    重定向(可选)

    说明应如何执行重定向。仅对重定向规则有效。

  • requestHeaders
    Chrome 86 及更高版本

    要针对请求修改的请求标头。仅当 RuleActionType 为“modifyHeaders”时有效。

  • responseHeaders
    Chrome 86 及更高版本

    要针对请求修改的响应标头。仅当 RuleActionType 为“modifyHeaders”时有效。

  • 要执行的操作的类型。

RuleActionType

描述在给定的 RuleCondition 匹配时要采取的操作类型。

枚举

“block”
屏蔽网络请求。

“redirect”
重定向网络请求。

“允许”
允许网络请求。如果存在与请求匹配的允许规则,则不会拦截该请求。

“upgradeScheme”
如果网络请求网址的架构为 http 或 ftp,则将其升级为 https。

“modifyHeaders”
修改来自网络请求的请求/响应标头。

“allowAllRequests”
允许框架层次结构中的所有请求,包括框架请求本身。

RuleCondition

属性

  • domainType

    DomainType 可选

    指定网络请求对于其来源网域是第一方还是第三方。如果省略,则接受所有请求。

  • 网域

    string[] 可选

    自 Chrome 101 起已弃用

    请改用 initiatorDomains

    该规则将仅匹配源自 domains 列表中的网络请求。

  • excludedDomains

    string[] 可选

    自 Chrome 101 起已弃用

    请改用 excludedInitiatorDomains

    该规则不会匹配源自 excludedDomains 列表的网络请求。

  • excludedInitiatorDomains

    string[] 可选

    Chrome 101 及更高版本

    该规则不会匹配源自 excludedInitiatorDomains 列表的网络请求。如果此列表为空或被省略,则表示不排除任何网域。此属性的优先级高于 initiatorDomains。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 此表达式与请求启动器(而非请求网址)匹配。
    • 列出的网域的子网域也会被排除。
  • excludedRequestDomains

    string[] 可选

    Chrome 101 及更高版本

    如果网域与 excludedRequestDomains 列表中的某个网域匹配,相应规则将不会匹配网络请求。如果此列表为空或被省略,则表示不排除任何网域。此属性的优先级高于 requestDomains。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 列出的网域的子网域也会被排除。
  • excludedRequestMethods

    RequestMethod[] 可选

    Chrome 91 及更高版本

    规则不会匹配的请求方法列表。应仅指定 requestMethods 和 excludedRequestMethods 中的一项。如果两者均未指定,则匹配所有请求方法。

  • excludedResourceTypes

    ResourceType[] 可选

    规则不会匹配的资源类型列表。应仅指定 resourceTypes 和 excludedResourceTypes 中的一项。如果未指定任何一种,则除了“main_frame”之外的所有资源类型都会被屏蔽。

  • excludedResponseHeaders

    HeaderInfo[] 可选

    Chrome 128 及更高版本

    如果请求与此列表中的任何响应标头条件(如果指定)匹配,则规则不匹配。如果同时指定了 excludedResponseHeaders 和 responseHeaders,则 excludedResponseHeaders 属性优先。

  • excludedTabIds

    number[] 可选

    Chrome 92 及更高版本

    规则不应匹配的 tabs.Tab.id 列表。ID 为 tabs.TAB_ID_NONE 会排除并非源自标签页的请求。仅支持会话级范围的规则。

  • excludedTopDomains

    string[] 可选

    Chrome 145 及更高版本

    如果关联的顶级框架的网域与 excludedTopDomains 列表中的某个网域匹配,该规则将不会匹配网络请求。如果此列表为空或被省略,则表示不排除任何网域。此属性的优先级高于 topDomains。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 列出的网域的子网域也会被排除。
    • 对于没有关联的顶级框架的请求(例如 ServiceWorker 发起的请求),系统会改为考虑请求发起者的网域。
  • initiatorDomains

    string[] 可选

    Chrome 101 及更高版本

    该规则将仅匹配源自 initiatorDomains 列表中的网络请求。如果省略此列表,则规则将应用于来自所有网域的请求。不允许使用空列表。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 此表达式与请求启动器(而非请求网址)匹配。
    • 列出的网域的子网域也会匹配。
  • isUrlFilterCaseSensitive

    布尔值 (可选)

    urlFilter 或 regexFilter(以指定者为准)是否区分大小写。默认值为 false。

  • regexFilter

    字符串 可选

    用于与网络请求网址匹配的正则表达式。此语法遵循 RE2 语法。

    注意:只能指定 urlFilter 和 regexFilter 中的一个。

    注意:regexFilter 必须仅由 ASCII 字符组成。此格式与以下网址匹配:主机以 Punycode 格式编码(如果是国际化网域),任何其他非 ASCII 字符都以 UTF-8 格式进行网址编码。

  • requestDomains

    string[] 可选

    Chrome 101 及更高版本

    仅当网域与 requestDomains 列表中的某个网域匹配时,该规则才会匹配网络请求。如果省略此列表,则规则将应用于来自所有网域的请求。不允许使用空列表。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 列出的网域的子网域也会匹配。
  • requestMethods

    RequestMethod[] 可选

    Chrome 91 及更高版本

    规则可以匹配的 HTTP 请求方法列表。不允许使用空列表。

    注意:指定 requestMethods 规则条件也会排除非 HTTP(s) 请求,而指定 excludedRequestMethods 则不会。

  • resourceTypes

    ResourceType[] 可选

    规则可以匹配的资源类型列表。不允许使用空列表。

    注意:必须为 allowAllRequests 规则指定此参数,并且只能包含 sub_frame 和 main_frame 资源类型。

  • responseHeaders

    HeaderInfo[] 可选

    Chrome 128 及更高版本

    如果请求与此列表中的任何响应标头条件(如果指定)匹配,则规则匹配。

  • tabIds

    number[] 可选

    Chrome 92 及更高版本

    规则应匹配的 tabs.Tab.id 列表。ID 为 tabs.TAB_ID_NONE 的请求与非源自标签页的请求相匹配。不允许使用空列表。仅支持会话级范围的规则。

  • topDomains

    string[] 可选

    Chrome 145 及更高版本

    仅当关联的顶级框架的网域与 topDomains 列表中的某个网域匹配时,该规则才会匹配网络请求。如果省略此列表,则该规则会应用于与所有顶级框架网域关联的请求。不允许使用空列表。

    注意:

    • 还允许使用“a.example.com”等子网域。
    • 条目只能包含 ASCII 字符。
    • 对国际化网域使用 Punycode 编码。
    • 列出的网域的子网域也会匹配。
    • 对于没有关联的顶级框架的请求(例如 ServiceWorker 发起的请求),系统会改为考虑请求发起者的网域。
  • urlFilter

    字符串 可选

    与网络请求网址匹配的格式。支持的结构:

    “*”:通配符:匹配任意数量的字符。

    “|”:左侧/右侧锚点:如果用于模式的任一端,则分别指定网址的开头/结尾。

    “||”:域名锚点:如果用于模式的开头,则指定网址的(子)网域的开头。

    “^”:分隔符字符:匹配除字母、数字或以下字符以外的任何内容:_、-、. 或 %。这也匹配网址的末尾。

    因此,urlFilter 由以下部分组成:(可选的左侧/域名锚点)+ 模式 +(可选的右侧锚点)。

    如果省略,则匹配所有网址。不允许使用空字符串。

    不允许使用以 ||* 开头的格式。请改用 *。

    注意:只能指定 urlFilter 和 regexFilter 中的一个。

    注意:urlFilter 必须仅由 ASCII 字符组成。此格式与以下网址匹配:主机以 Punycode 格式编码(如果是国际化网域),任何其他非 ASCII 字符都以 UTF-8 格式进行网址编码。例如,当请求网址为 http://abc.рф?q=ф 时,urlFilter 将与网址 http://abc.xn--p1ai/?q=%D1%84 进行匹配。

RuleConditionKeys

Chrome 145 及更高版本

枚举

"urlFilter"

"regexFilter"

"isUrlFilterCaseSensitive"

"initiatorDomains"

"excludedInitiatorDomains"

"requestDomains"

"excludedRequestDomains"

"topDomains"

"excludedTopDomains"

"domains"

"excludedDomains"

"resourceTypes"

"excludedResourceTypes"

"requestMethods"

"excludedRequestMethods"

"domainType"

“tabIds”

"excludedTabIds"

"responseHeaders"

"excludedResponseHeaders"

Ruleset

属性

  • 已启用

    布尔值

    规则集是否默认处于启用状态。

  • id

    字符串

    唯一标识规则集的非空字符串。以“_”开头的 ID 预留供内部使用。

  • 路径

    字符串

    JSON 规则集相对于扩展程序目录的路径。

RulesMatchedDetails

属性

  • rulesMatchedInfo

    与指定过滤条件匹配的规则。

TabActionCountUpdate

Chrome 89 及更高版本

属性

  • 增加

    数值

    要将标签页的操作次数增加的量。负值会递减计数。

  • tabId

    数值

    要更新操作次数的标签页。

TestMatchOutcomeResult

Chrome 103 及更高版本

属性

  • matchedRules

    与假设请求匹配的规则(如果有)。

TestMatchRequestDetails

Chrome 103 及更高版本

属性

  • 发起人

    字符串 可选

    假设请求的发起方网址(如有)。

  • 方法

    假设请求的标准 HTTP 方法。对于 HTTP 请求,默认为“get”;对于非 HTTP 请求,则忽略此属性。

  • responseHeaders

    对象(可选)

    Chrome 129 及更高版本

    假设请求在发送之前未被阻止或重定向,则假设响应提供的标头。表示为将标头名称映射到字符串值列表的对象。如果未指定,假设响应将返回空的响应标头,这可以匹配根据标头不存在情况进行匹配的规则。例如 {"content-type": ["text/html; charset=utf-8", "multipart/form-data"]}

  • tabId

    number 可选

    假设请求发生的标签页的 ID。无需与实际标签页 ID 对应。默认值为 -1,表示请求与标签页无关。

  • topUrl

    字符串 可选

    Chrome 145 及更高版本

    相应请求的关联顶级框架网址(如果有)。

  • 类型

    假设请求的资源类型。

  • 网址

    字符串

    假设请求的网址。

UnsupportedRegexReason

Chrome 87 及更高版本

说明不支持给定正则表达式的原因。

枚举

“syntaxError”
正则表达式的语法不正确,或者使用了 RE2 语法中不提供的功能。

“memoryLimitExceeded”
正则表达式超出了内存上限。

UpdateRuleOptions

Chrome 87 及更高版本

属性

  • addRules

    规则 [] 可选

    要添加的规则。

  • removeRuleIds

    number[] 可选

    要移除的规则的 ID。系统会忽略所有无效 ID。

UpdateRulesetOptions

Chrome 87 及更高版本

属性

  • disableRulesetIds

    string[] 可选

    与应停用的静态 Ruleset 对应的一组 ID。

  • enableRulesetIds

    string[] 可选

    与应启用的静态 Ruleset 相对应的一组 ID。

UpdateStaticRulesOptions

Chrome 111 及更高版本

属性

  • disableRuleIds

    number[] 可选

    一组与 Ruleset 中的规则对应的 ID,用于停用规则。

  • enableRuleIds

    number[] 可选

    要启用的 Ruleset 中规则对应的一组 ID。

  • rulesetId

    字符串

    与静态 Ruleset 对应的 ID。

URLTransform

属性

  • Fragment

    字符串 可选

    请求的新 fragment。应为空(在这种情况下,系统会清除现有 fragment),或以“#”开头。

  • 主机

    字符串 可选

    请求的新宿主。

  • 密码

    字符串 可选

    相应请求的新密码。

  • 路径

    字符串 可选

    请求的新路径。如果为空,则清除现有路径。

  • 端口

    字符串 可选

    相应请求的新端口。如果为空,则清除现有端口。

  • 查询

    字符串 可选

    相应请求的新查询。应为空(在这种情况下,系统会清除现有查询),或以“?”开头。

  • queryTransform

    QueryTransform(可选)

    添加、移除或替换查询键值对。

  • 方案

    字符串 可选

    请求的新方案。允许的值包括“http”“https”“ftp”和“chrome-extension”。

  • username

    字符串 可选

    请求的新用户名。

属性

DYNAMIC_RULESET_ID

扩展程序添加的动态规则的规则集 ID。

值

"_dynamic"

GETMATCHEDRULES_QUOTA_INTERVAL

可以进行 MAX_GETMATCHEDRULES_CALLS_PER_INTERVAL getMatchedRules 次调用的时间间隔(以分钟为单位)。其他调用会立即失败并设置 runtime.lastError。注意:与用户手势关联的 getMatchedRules 调用不受配额限制。

值

10

GUARANTEED_MINIMUM_STATIC_RULES

Chrome 89 及更高版本

扩展程序在其已启用的静态规则集中保证的静态规则的最低数量。超出此限制的任何规则都将计入全局静态规则限制。

值

30000

MAX_GETMATCHEDRULES_CALLS_PER_INTERVAL

在 GETMATCHEDRULES_QUOTA_INTERVAL 时间段内,getMatchedRules 可被调用的次数。

值

20

MAX_NUMBER_OF_DYNAMIC_RULES

扩展程序可添加的动态规则数量上限。

值

30000

MAX_NUMBER_OF_ENABLED_STATIC_RULESETS

Chrome 94 及更高版本

扩展程序一次可启用的静态 Rulesets 数量上限。

值

50

MAX_NUMBER_OF_REGEX_RULES

扩展程序可添加的正则表达式规则数量上限。此限制会针对动态规则集和规则资源文件中指定的规则分别进行评估。

值

1000

MAX_NUMBER_OF_SESSION_RULES

Chrome 120 及更高版本

扩展程序可以添加的会话级规则数量上限。

值

5000

MAX_NUMBER_OF_STATIC_RULESETS

扩展程序可以指定的最大静态 Rulesets(作为 "rule_resources" 清单键的一部分)。

值

100

MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES

Chrome 120 及更高版本

扩展程序可以添加的“不安全”动态规则的数量上限。

值

5000

MAX_NUMBER_OF_UNSAFE_SESSION_RULES

Chrome 120 及更高版本

扩展程序可以添加的“不安全”会话范围规则的数量上限。

值

5000

SESSION_RULESET_ID

Chrome 90 及更高版本

由扩展程序添加的会话级范围规则的规则集 ID。

值

"_session"

方法

getAvailableStaticRuleCount()

Chrome 89 及更高版本
chrome.declarativeNetRequest.getAvailableStaticRuleCount(): Promise<number>

返回扩展程序在达到全局静态规则限制之前可以启用的静态规则数量。

返回

  • Promise<number>

    Chrome 91 及更高版本

getDisabledRuleIds()

Chrome 111 及更高版本
chrome.declarativeNetRequest.getDisabledRuleIds(
  options: GetDisabledRuleIdsOptions,
)
: Promise<number[]>

返回给定 Ruleset 中当前已停用的静态规则列表。

参数

返回

  • Promise<number[]>

    Promise,解析为与相应规则集中已停用的规则对应的 ID 列表。

getDynamicRules()

chrome.declarativeNetRequest.getDynamicRules(
  filter?: GetRulesFilter,
)
: Promise<Rule[]>

返回扩展程序的当前动态规则集。来电者可以选择指定 filter 来过滤提取的规则列表。

参数

  • filter
    Chrome 111 及更高版本

    用于过滤所提取规则列表的对象。

返回

  • Promise<Rule[]>

    Chrome 91 及更高版本

    Promise,用于解析动态规则集。如果发生暂时性内部错误,Promise 可能会被拒绝。

getEnabledRulesets()

chrome.declarativeNetRequest.getEnabledRulesets(): Promise<string[]>

返回当前启用的一组静态规则集的 ID。

返回

  • Promise<string[]>

    Chrome 91 及更高版本

    Promise,可解析为 ID 列表,其中每个 ID 对应于一个已启用的静态 Ruleset。

getMatchedRules()

chrome.declarativeNetRequest.getMatchedRules(
  filter?: MatchedRulesFilter,
)
: Promise<RulesMatchedDetails>

返回与扩展程序匹配的所有规则。调用方可以选择性地通过指定 filter 来过滤匹配规则的列表。此方法仅适用于具有 "declarativeNetRequestFeedback" 权限的扩展程序,或具有针对 filter 中指定的 tabId 授予的 "activeTab" 权限的扩展程序。注意:如果规则未与有效文档相关联,且匹配时间超过 5 分钟,则不会返回该规则。

参数

返回

  • Chrome 91 及更高版本

    在提取到匹配规则列表后即会解析的 Promise。如果出现错误,Promise 将被拒绝。这种情况可能是由多种原因造成的,例如权限不足或超出配额。

getSessionRules()

Chrome 90 及更高版本
chrome.declarativeNetRequest.getSessionRules(
  filter?: GetRulesFilter,
)
: Promise<Rule[]>

返回扩展程序的当前会话范围规则集。来电者可以选择指定 filter 来过滤提取的规则列表。

参数

  • filter
    Chrome 111 及更高版本

    用于过滤所提取规则列表的对象。

返回

  • Promise<Rule[]>

    Chrome 91 及更高版本

    解析为会话范围规则集的 Promise。

isRegexSupported()

Chrome 87 及更高版本
chrome.declarativeNetRequest.isRegexSupported(
  regexOptions: RegexOptions,
)
: Promise<IsRegexSupportedResult>

检查给定的正则表达式是否会作为 regexFilter 规则条件受到支持。

参数

返回

  • Chrome 91 及更高版本

    Promise,用于解析详细信息,包括是否支持正则表达式以及不支持的原因(如果不支持)。

setExtensionActionOptions()

Chrome 88 及更高版本
chrome.declarativeNetRequest.setExtensionActionOptions(
  options: ExtensionActionOptions,
)
: Promise<void>

配置是否应将标签页的操作次数显示为扩展操作的徽章文本,并提供一种递增该操作次数的方法。

参数

返回

  • Promise<void>

    Chrome 91 及更高版本

testMatchOutcome()

Chrome 103 及更高版本
chrome.declarativeNetRequest.testMatchOutcome(
  request: TestMatchRequestDetails,
)
: Promise<TestMatchOutcomeResult>

检查扩展程序的任何 declarativeNetRequest 规则是否会与假设的请求匹配。注意:此功能仅适用于未封装的扩展程序,因为此功能仅用于扩展程序开发期间。

参数

返回

updateDynamicRules()

chrome.declarativeNetRequest.updateDynamicRules(
  options: UpdateRuleOptions,
)
: Promise<void>

修改扩展程序的当前动态规则集。系统会先移除 options.removeRuleIds 中列出的 ID 对应的规则,然后再添加 options.addRules 中给出的规则。注意:

  • 此更新以单个原子操作的形式进行:要么添加和移除所有指定规则,要么返回错误。
  • 这些规则在浏览器会话和扩展程序更新中保持不变。
  • 无法使用此函数移除作为扩展程序包一部分指定的静态规则。
  • MAX_NUMBER_OF_DYNAMIC_RULES 是扩展程序可以添加的动态规则数量上限。不安全规则的数量不得超过 MAX_NUMBER_OF_UNSAFE_DYNAMIC_RULES。

参数

返回

  • Promise<void>

    Chrome 91 及更高版本

    在更新完成后解析的 Promise。如果出现错误,Promise 将被拒绝,并且规则集不会发生任何更改。这种情况可能由多种原因导致,例如规则格式无效、规则 ID 重复、超出规则数量限制、内部错误等。

updateEnabledRulesets()

chrome.declarativeNetRequest.updateEnabledRulesets(
  options: UpdateRulesetOptions,
)
: Promise<void>

更新扩展程序的已启用静态规则集。系统会先移除 options.disableRulesetIds 中列出的 ID 对应的规则集,然后再添加 options.enableRulesetIds 中列出的规则集。请注意,已启用的静态规则集会在会话之间保持不变,但不会在扩展程序更新之间保持不变,也就是说,rule_resources 清单键将决定每次扩展程序更新时已启用的静态规则集。

参数

返回

  • Promise<void>

    Chrome 91 及更高版本

    在更新完成后解析的 Promise。如果出现错误,Promise 将被拒绝,并且不会对已启用的规则集进行任何更改。这种情况可能由多种原因导致,例如规则集 ID 无效、超出规则数量限制或出现内部错误。

updateSessionRules()

Chrome 90 及更高版本
chrome.declarativeNetRequest.updateSessionRules(
  options: UpdateRuleOptions,
)
: Promise<void>

修改扩展程序的当前会话范围规则集。系统会先移除 options.removeRuleIds 中列出的 ID 对应的规则,然后再添加 options.addRules 中给出的规则。注意:

  • 此更新以单个原子操作的形式进行:要么添加和移除所有指定规则,要么返回错误。
  • 这些规则不会在会话之间持久存在,而是存储在内存中。
  • MAX_NUMBER_OF_SESSION_RULES 是扩展程序可以添加的会话规则数量上限。

参数

返回

  • Promise<void>

    Chrome 91 及更高版本

    在更新完成后解析的 Promise。如果出现错误,Promise 将被拒绝,并且规则集不会发生任何更改。这种情况可能由多种原因导致,例如规则格式无效、规则 ID 重复、超出规则数量限制等。

updateStaticRules()

Chrome 111 及更高版本
chrome.declarativeNetRequest.updateStaticRules(
  options: UpdateStaticRulesOptions,
)
: Promise<void>

停用和启用 Ruleset 中的各个静态规则。对已停用的 Ruleset 所属规则做出的更改将在该 Ruleset 下次启用时生效。

返回

  • Promise<void>

    在更新完成时解析的 Promise。如果出现错误,Promise 将被拒绝,并且不会对已启用的静态规则进行任何更改。

事件

onRuleMatchedDebug

chrome.declarativeNetRequest.onRuleMatchedDebug.addListener(
  callback: function,
)

当规则与请求匹配时触发。仅适用于具有 "declarativeNetRequestFeedback" 权限的未打包扩展程序,因为此 API 仅用于调试目的。

参数