2020-06-28

Firefox 自訂搜尋引擎及搜尋參數

最近經常上網搜尋資料,而在下偏好使用 Firefox (盡量使用自由、開源軟件)
但要自訂 Firefox 的搜尋器比 Chromium 稍微麻煩一點
不能直接在 搜尋 分頁中增加搜尋器,那麼 Firefox 應該如何增加搜尋器?


Firefox 使用 開放搜尋格式 (OpenSearch Format)
匯入 開放搜尋格式 的 描述檔案 的 搜尋引擎 及 搜尋參數 於對應的 網站顯示結果

開放搜尋格式

開放搜尋格式 是一種 XML格式,內容亦只是數個 XML標籤及屬性 來定義

從網站新增

見下文
見下文
普遍具備搜尋設計的網站,都可以直接從 Firefox 搜尋列中新增搜尋器

見下文
但偶然有搜尋設計的網站,不能直接從 Firefox 搜尋列中新增搜尋器
例如在 Blogspot 雖然有搜尋功能,但不能直接加入到 Firefox 的搜尋引擎清單
因此需要自行編寫 開放搜尋檔案,便需要自行編寫 開放搜尋格式 的檔案

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>Search Engine Name, required</ShortName>
    <Description>Search Engine Description, optional</Description>
    <InputEncoding>Text encoding, optional, default UTF-8</InputEncoding>
    <Image width="32" height="32" type="image/png">Image URL or base64 encoded text, optional</Image>
    <Url type="text/html" method="GET" template="search-url">
        <Param name="q" value="{searchTerms}"/>
    </Url>
</OpenSearchDescription>
  • ShortName 搜尋器名稱,必須
  • Description 搜尋器描述,選擇性
  • InputEncoding 輸入編碼,選擇性,預設 UTF-8
  • Image 搜尋器圖案,支持 上限 10KB 容量,base64 編碼,選擇性
    • width 圖案闊度,支援像素範圍為 1~1024
    • height 圖案高度,支援像素範圍為 1~1024
    • type 圖案類型,支援格式與 HTML 的 favicon 相同,通常為
      • image/svg+xml
      • image/png
      • image/x-icon
      • image/vnd.microsoft.icon
  • Url 搜尋器連結,必須
    • type 搜尋器類型,通常為 text/html
    • method HTTP請求方法,通常使用 GETPOST
    • template 搜尋器範本,通常為網頁連結
      • Param 搜尋參數,使用 GET ,可以在範本的連結後直接加上;使用 POST 必須使用 Param標籤
        • name 請求參數的名稱
        • value 請求參數的資料
      • {searchTerms} 搜尋字串,當符合 {searchTerms} 會當作傳入文字作為搜尋字串

使用 GET 方法時,可以減略使用 Param 標籤,直接以 URL參數 傳入資料亦可
<Url type="text/html" method="GET" template="search-url?q={searchTerms}"/>
兩種語法各有好壞,在下偏好使用 Param標籤,可以讓參數較易閱讀,但檔案容量則會較大

例如在下製作方便搜尋在下的 Blogspot 的 開放搜尋格式 的檔案
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>HKGoldenMr.A's Blog</ShortName>
    <Description>HKGoldenMr.A's Blog</Description>
    <Tags>blog</Tags>
    <Image width="32" height="32" type="image/svg+xml">data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMiAzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIHRyYW5zZm9ybT0ibWF0cml4KC4wNTk5NzYgMCAwIC4wNTg3ODkgLjAwMjk5ODggLjAwMTA3ODIpIj4KCQk8cGF0aCBkPSJtNTMzLjUgMjc4LjRjMC0xOC41LTEuNS0zNy4xLTQuNy01NS4zaC0yNTYuN3YxMDQuOGgxNDdjLTYuMSAzMy44LTI1LjcgNjMuNy01NC40IDgyLjd2NjhoODcuN2M1MS41LTQ3LjQgODEuMS0xMTcuNCA4MS4xLTIwMC4yeiIgZmlsbD0iIzQyODVmNCIvPgoJCTxwYXRoIGQ9Im0yNzIuMSA1NDQuM2M3My40IDAgMTM1LjMtMjQuMSAxODAuNC02NS43bC04Ny43LTY4Yy0yNC40IDE2LjYtNTUuOSAyNi05Mi42IDI2LTcxIDAtMTMxLjItNDcuOS0xNTIuOC0xMTIuM2gtOTAuNXY3MC4xYzQ2LjIgOTEuOSAxNDAuMyAxNDkuOSAyNDMuMiAxNDkuOXoiIGZpbGw9IiMzNGE4NTMiLz4KCQk8cGF0aCBkPSJtMTE5LjMgMzI0LjNjLTExLjQtMzMuOC0xMS40LTcwLjQgMC0xMDQuMnYtNzAuMWgtOTAuNGMtMzguNiA3Ni45LTM4LjYgMTY3LjUgMCAyNDQuNHoiIGZpbGw9IiNmYmJjMDQiLz4KCQk8cGF0aCBkPSJtMjcyLjEgMTA3LjdjMzguOC0uNiA3Ni4zIDE0IDEwNC40IDQwLjhsNzcuNy03Ny43Yy00OS4yLTQ2LjItMTE0LjUtNzEuNi0xODIuMS03MC44LTEwMi45IDAtMTk3IDU4LTI0My4yIDE1MGw5MC40IDcwLjFjMjEuNS02NC41IDgxLjgtMTEyLjQgMTUyLjgtMTEyLjR6IiBmaWxsPSIjZWE0MzM1Ii8+Cgk8L2c+Cjwvc3ZnPgo=</Image>
    <Url type="text/html" method="GET" template="https://hkgoldenmra.blogspot.com/search">
        <Param name="q" value="{searchTerms}"/>
    </Url>
</OpenSearchDescription>

製作 開放搜尋檔案 後,使用 HTML 的 link標籤 或 Javascript 新增 開放搜尋檔案 到 Firefox
HTML 的 link標籤
<link rel="search" type="application/opensearchdescription+xml" href="opensearch-file-url" title="New Search Engine Title"/>
Javascript 語法
window.external.AddSearchProvider("opensearch-file-url");
不論 HTML 的 link標籤 或 Javascript 都 不能直接匯入本機檔案

見下文
Javascript 語法即使使用 createObjectURL 的 blob 都不能匯入

見下文
見下文
必須使用有效 IP 及 域名 才能匯入,因此最少都要建立臨時網頁伺服器

見下文
見下文
新增搜尋器後便可以的搜尋列輸入資料,直接使用指定搜尋器搜尋資料

見下文
雖然 Firefox 本身已經提供搜尋器,但需要改動搜尋器的參數,都可以自行製作或改良
例如 Firefox 原本的 Google搜尋器 只是簡單搜尋關鍵字,但想設定更多參數

見下文
在 搜尋 分頁會列出所以 搜尋器
有需要可以修改 預設搜尋器 及 搜尋器次序

見下文
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>Custom Google Search</ShortName>
    <Url type="text/html" method="GET" template="https://www.google.com/search">
        <Param name="q" value="{searchTerms}+-site%3Awikipedia.org"/>
    </Url>
</OpenSearchDescription>
例如在下不想在 Google搜尋器 搜尋與 wikipedia.org 相關的結果,可以在範本的內容加上 +-site%3Awikipedia.org

雖然 Firefox 使用 OpenSearch 不及 Chromium 直接輸入搜尋器直觀
但使用 OpenSearch 還可以接受以 POST 形式傳送參數

header("Content-Type: text/plain; charset=UTF-8");

echo "GET\n";
var_dump($_GET);

echo "POST\n";
var_dump($_POST);
製作 PHP 測試 GET 及 POST

<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>Test Get</ShortName>
    <Url type="text/html" method="GET" template="http://127.0.0.1:28080/test.php">
        <Param name="q" value="{searchTerms}"/>
    </Url>
</OpenSearchDescription>
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
    <ShortName>Test Post</ShortName>
    <Url type="text/html" method="POST" template="http://127.0.0.1:28080/test.php">
        <Param name="q" value="{searchTerms}"/>
    </Url>
</OpenSearchDescription>
製作以 POST方法 發送的 OpenSearch

見下文
新增用作測試 GET 及 POST 的搜尋器

見下文
以 GET 搜尋資料

見下文
PHP 傳回 GET 的資料

見下文
以 POST 搜尋資料

見下文
PHP 傳回 POST 的資料

雖然能新增 GET 及 POST 的尋搜器
但其他 HTTP方法 例如:PUT, DELETE, PATCH 等便不能

總結

現在除了可以自製搜尋器,還可以因應需要改良搜尋器的搜尋參數
但每個搜尋器接受的參數都不同,匯入搜尋器前都先了解參數內容

另外使用 OpenSearch 可以發佈到公共空間,分享及其他使用者

亦因為知道有這種技術後,所以在下已經將在下的 Blog 搜尋器加入到 HTML 中
可以方便閣下新增在下的 Blog 搜尋器,有興趣亦可以加入到 Firefox 搜尋中
可以在閣下自己網站加上搜尋器,方便其他使用者搜尋閣下網站資料

參考資料

沒有留言 :

張貼留言