讓廣告聯播網能使用 Google 搜尋的翻譯相關功能

Google 搜尋提供多種翻譯相關功能,方便使用者瀏覽翻譯後的內容。如果您是廣告聯播網供應商,在遇到翻譯網頁無法正常顯示廣告的情形時,請按照本指南的步驟操作,以確保廣告能正確顯示或歸因。

我們的做法

從搜尋結果中存取 Google 翻譯提供的翻譯內容時,只要使用者點選經過翻譯的搜尋結果,Google 就會從發布者的網站上擷取該網頁,並重新編寫來源網址。

將 Google 翻譯網址轉換為原始網址

如果廣告聯播網需要使用發布者的來源網址,您就必須轉換 Google 翻譯後的網址,以確保廣告能正常顯示。請按照下列步驟,解碼發布者的主機名稱:

  1. 移除後置字元 .translate.goog,擷取主機名稱中的網域前置字元。
  2. , (半形逗號) 字元隔開 _x_tr_enc 參數,並儲存為 encoding_list
  3. 在網域前置字元前方加上 _x_tr_hp 參數的值 (如果有的話)。
  4. 如果 encoding_list 中包含 1,且輸出內容的開頭為 1-,請從步驟 2 的輸出內容中移除 1- 前置字元。
  5. 如果 encoding_list 中包含 0,且輸出內容的開頭為 0-,請從步驟 3 的輸出內容中移除 0- 前置字元。如果您移除了前置字元,請將 is_idn 設為 true;否則,請將 is_idn 設為 false
  6. /\b-\b/ (規則運算式) 替換為 . (點) 字元。
  7. -- (雙連字號) 字元替換成 - (連字號) 字元。
  8. 如果將 is_idn 設為 true,請加入國際化域名編碼前置字元 xn--
  9. 選用:轉換為萬國碼 (Unicode)。

JavaScript 程式碼範例:從 Google 翻譯網址中解碼出主機名稱

function decodeHostname(proxyUrl) {
  const parsedProxyUrl = new URL(proxyUrl);
  const fullHost = parsedProxyUrl.hostname;
  // 1. Extract the domain prefix from the hostname, by removing the
        ".translate.goog" suffix
  let domainPrefix = fullHost.substring(0, fullHost.indexOf('.'));

  // 2. Split _x_tr_enc parameter by "," (comma), save as encodingList
  const encodingList = parsedProxyUrl.searchParams.has('_x_tr_enc') ?
      parsedProxyUrl.searchParams.get('_x_tr_enc').split(',') :
      [];

  // 3. Prepend value of _x_tr_hp parameter to the domain prefix, if it exists
  if (parsedProxyUrl.searchParams.has('_x_tr_hp')) {
    domainPrefix = parsedProxyUrl.searchParams.get('_x_tr_hp') + domainPrefix;
  }

  // 4. Remove '1-' prefix from the output of step 2 if encodingList contains
  //    '1' and the output begins with '1-'.
  if (encodingList.includes('1') && domainPrefix.startsWith('1-')) {
    domainPrefix = domainPrefix.substring(2);
  }

  // 5. Remove '0-' prefix from the output of step 3 if encodingList contains
  //    '0' and the output begins with '0-'.
  //    Set isIdn to true if removed, false otherwise.
  let isIdn = false;
  if (encodingList.includes('0') && domainPrefix.startsWith('0-')) {
    isIdn = true;
    domainPrefix = domainPrefix.substring(2);
  }

  // 6. Replace /\b-\b/ (regex) with '.' (dot) character.
  // 7. Replace '--' (double hyphen) with '-' (hyphen).
  let decodedSegment =
      domainPrefix.replaceAll(/\b-\b/g, '.').replaceAll('--', '-');

  // 8. If isIdn equals true, add the punycode prefix 'xn--'.
  if (isIdn) {
    decodedSegment = 'xn--' + decodedSegment;
  }
  return decodedSegment;
}

重建網址

  1. 使用原始的網頁網址,以經過解碼的主機名稱取代原本的主機名稱。
  2. 移除所有 _x_tr_* 參數。

測試程式碼

您可以使用下表,為程式碼建立單元測試。對任一 proxyUrl 來說,decodeHostname 必須與預期的值相同。

下表只能用於測試主機名稱解碼作業,請務必確保網址的路徑、片段和原始參數維持不變。

proxyUrl decodeHostname
https://example-com.translate.goog example.com
https://foo-example-com.translate.goog foo.example.com
https://foo--example-com.translate.goog foo-example.com
https://0-57hw060o-com.translate.goog/?_x_tr_enc=0 xn--57hw060o.com (⚡😊.com)
https://1-en--us-example-com/?_x_tr_enc=1 en-us.example.com
https://0-en----w45as309w-com.translate.goog/?_x_tr_enc=0 xn--en--w45as309w.com (en-⚡😊.com)
https://1-0-----16pw588q-com.translate.goog/?_x_tr_enc=0,1 xn----16pw588q.com (⚡-😊.com)
https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=l llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk
https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=www-l www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk
https://a--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-com.translate.goog/?_x_tr_hp=a--xn--xn--xn--xn--xn--------------------------a a-xn-xn-xn-xn-xn-------------aa-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com
https://g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b-com.translate.goog/?_x_tr_enc=0&_x_tr_hp=0- xn--g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b.com (💖🌲😊💞🤷‍♂️💗🌹😍🌸🌺😂😩😉😒😘💕🐶🐱🐭🐹🐰🐻🦊🐇😺.com)