На моей странице есть код отслеживания Менеджера тегов Google. Почему это происходит?
Ответ 1
Это происходит все время, если что-то не может быть дублировано алгоритмом структурированного клона. Этот алгоритм используется window.postMessage
. Если мы прочитаем документацию из window.postMessage
для первого параметра:
сообщение
Данные, которые нужно отправить в другое окно. Данные сериализуются с использованием алгоритма структурированного клона.
и затем откройте описание из алгоритма структурированного клона (см. последнюю ссылку выше), после чего мы можем прочитать:
Структурированный алгоритм клонирования - это алгоритм, определяемый спецификацией HTML5 для копирования сложных объектов JavaScript. Он используется внутренне при передаче данных в Рабочие и из Рабочих через postMessage()
или при хранении объектов с IndexedDB
. Он создает клон путем рекурсии через входной объект, сохраняя карту ранее посещенных ссылок, чтобы избежать бесконечных циклов перемещения.
Вещи, которые не работают со структурированным клоном
Поддерживаемые типы
Я тестировал его с некоторыми объектами, и я могу показать вам следующие примеры, когда это происходит...
Пример с пользовательской функцией
var obj = {something: function(){}};
window.postMessage(obj, '*'); // DataCloneError
Ответ 2
Эти ошибки вызваны сканерами Facebook, выполняющими код JavaScript.
У меня были ошибки в этой ошибке из этих IP-адресов (все в диапазонах IP-адресов Facebook) и пользовательских агентов:
66.220.149.14 - Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
31.13.115.2 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
173.252.87.1 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
69.171.251.11 - facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
Чтобы получить обновленный список IP-адресов искателя Facebook, см. Эту команду на странице https://developers.facebook.com/docs/sharing/webmasters/crawler/:
whois -h whois.radb.net -- '-i origin AS32934' | grep ^route
Вам необходимо будет обновить механизм отчетности об ошибках, чтобы отфильтровать ошибки из этих диапазонов IP.
Вы можете сделать это на стороне клиента в JavaScript, указав IP-адрес пользователя при ошибке (см. Как получить IP-адрес клиента с помощью JavaScript?).
Или вы можете сделать это на стороне сервера. Вот пример ASP.NET MVC:
using System.Linq;
// Requires the IPAddressRange NuGet library:
// https://www.nuget.org/packages/IPAddressRange/
using NetTools;
public class FacebookClientDetector
{
/// <summary>
/// The list of CIDR ranges of facebook IPs that its crawlers use.
/// To generate, run
/// whois -h whois.radb.net -- '-i origin AS32934' | grep ^route
/// https://developers.facebook.com/docs/sharing/webmasters/crawler/
/// </summary>
static readonly string[] facebookIpRanges = new string[] {
"204.15.20.0/22",
"69.63.176.0/20",
"66.220.144.0/20",
"66.220.144.0/21",
"69.63.184.0/21",
"69.63.176.0/21",
"74.119.76.0/22",
"69.171.255.0/24",
"173.252.64.0/18",
"69.171.224.0/19",
"69.171.224.0/20",
"103.4.96.0/22",
"69.63.176.0/24",
"173.252.64.0/19",
"173.252.70.0/24",
"31.13.64.0/18",
"31.13.24.0/21",
"66.220.152.0/21",
"66.220.159.0/24",
"69.171.239.0/24",
"69.171.240.0/20",
"31.13.64.0/19",
"31.13.64.0/24",
"31.13.65.0/24",
"31.13.67.0/24",
"31.13.68.0/24",
"31.13.69.0/24",
"31.13.70.0/24",
"31.13.71.0/24",
"31.13.72.0/24",
"31.13.73.0/24",
"31.13.74.0/24",
"31.13.75.0/24",
"31.13.76.0/24",
"31.13.77.0/24",
"31.13.96.0/19",
"31.13.66.0/24",
"173.252.96.0/19",
"69.63.178.0/24",
"31.13.78.0/24",
"31.13.79.0/24",
"31.13.80.0/24",
"31.13.82.0/24",
"31.13.83.0/24",
"31.13.84.0/24",
"31.13.85.0/24",
"31.13.86.0/24",
"31.13.87.0/24",
"31.13.88.0/24",
"31.13.89.0/24",
"31.13.90.0/24",
"31.13.91.0/24",
"31.13.92.0/24",
"31.13.93.0/24",
"31.13.94.0/24",
"31.13.95.0/24",
"69.171.253.0/24",
"69.63.186.0/24",
"31.13.81.0/24",
"179.60.192.0/22",
"179.60.192.0/24",
"179.60.193.0/24",
"179.60.194.0/24",
"179.60.195.0/24",
"185.60.216.0/22",
"45.64.40.0/22",
"185.60.216.0/24",
"185.60.217.0/24",
"185.60.218.0/24",
"185.60.219.0/24",
"129.134.0.0/16",
"157.240.0.0/16",
"157.240.8.0/24",
"157.240.0.0/24",
"157.240.1.0/24",
"157.240.2.0/24",
"157.240.3.0/24",
"157.240.4.0/24",
"157.240.5.0/24",
"157.240.6.0/24",
"157.240.7.0/24",
"157.240.9.0/24",
"157.240.10.0/24",
"157.240.16.0/24",
"157.240.19.0/24",
"157.240.11.0/24",
"157.240.12.0/24",
"157.240.13.0/24",
"157.240.14.0/24",
"157.240.15.0/24",
"157.240.17.0/24",
"157.240.18.0/24",
"157.240.20.0/24",
"157.240.21.0/24",
"157.240.22.0/24",
"157.240.23.0/24",
"129.134.0.0/17",
"157.240.0.0/17",
"69.171.250.0/24",
"204.15.20.0/22",
"69.63.176.0/20",
"69.63.176.0/21",
"69.63.184.0/21",
"66.220.144.0/20",
"69.63.176.0/20",
};
public static bool IsFacebookClient(string ip)
{
IPAddressRange parsedIp;
if (!IPAddressRange.TryParse(ip, out parsedIp)) {
return false;
}
return facebookIpRanges.Any(cidr => IPAddressRange.Parse(cidr).Contains(parsedIp));
}
}