ค้นหาเว็บไซต์

javascript - การตั้งค่า user agent แบบกำหนดเองใน Chrome Extension Manifest Version 3 ไม่ถูกตั้งค่า


เรามีส่วนขยายที่มีเพียง 2 ไฟล์: manifest.json และ background.js

เบราว์เซอร์ (โครมเวอร์ชัน 112) ไม่รายงานข้อผิดพลาดใด ๆ แต่ตัวแทนผู้ใช้ไม่ได้ถูกตั้งค่าเป็น `my-custom-user-agent` นี่คือตัวโค้ดส่วนขยายทั้งหมด:

manifest.json

{
    "name": "ua-customizer",
    "version": "1",
    "manifest_version": 3,
    "permissions": [
      "declarativeNetRequest"
    ],
    "host_permissions": [
      "<all_urls>"
    ], 
    "background": {
      "service_worker": "background.js"
    }
  }

background.js

const rules = {
  removeRuleIds: [1],
  addRules: [
    {
      id: 1,
      priority: 1,
      action: {
        type: 'modifyHeaders',
        requestHeaders: [
          {
            header: 'user-agent',
            operation: 'set',
            value: `my-custom-user-agent`,
          },
        ],
      },
      condition: {
        urlFilter: '<all_urls>'
      },
    },
  ],
}
chrome.declarativeNetRequest.updateDynamicRules(rules);

มันขาดอะไรไป?

คำตอบ #1

การเปลี่ยนแปลง :

  • แทนที่ urlFilter: '<all_urls>' ด้วย urlFilter: '*' เพราะ <all_urls> ไม่ใช่โครงสร้างที่รองรับใน urlFilter ดู chrome.declarativeNetRequest > RuleCondition > urlFilter
  • เพิ่ม resourceTypes: [ 'main_frame' ] ไปที่ RuleCondition บางทีคุณอาจจะต้องเพิ่มชนิดของทรัพยากรอื่น ๆ ขึ้นอยู่กับเว็บไซต์ที่คุณกำลังใช้ส่วนขยาย แต่ "main_frame" ก็เพียงพอสำหรับ https://www.whatismybrowser.com/detect/what-is-my-user-agent/

โค้ดที่เปลี่ยนแปลง:

condition: {
    resourceTypes: [ 'main_frame' ],
    urlFilter: '*'
},

ทั้งสองการเปลี่ยนแปลงเป็นสิ่งจำเป็น
หากคุณทำเพียงการเปลี่ยนแปลงใดการเปลี่ยนแปลงหนึ่ง ส่วนขยายจะไม่แก้ไขสตริงผู้ใช้เอเจนต์

นอกจากนี้, chrome.declarativeNetRequest.updateDynamicRules(rules); จำเป็นต้องเรียกใช้งานครั้งเดียวเท่านั้น.
ดูที่ chrome.declarativeNetRequest > updateDynamicRules: "กฎเหล่านี้จะถูกเก็บรักษาไว้ตลอดช่วงเวลาของเบราว์เซอร์และการอัปเดตส่วนขยาย."
ฉันแนะนำให้วางมันในตัวจัดการ chrome.runtime.onInstalled:

chrome.runtime.onInstalled.addListener(function(details) {
    chrome.declarativeNetRequest.updateDynamicRules(rules);
});

บทความที่เกี่ยวข้อง