Внешний скрипт читает и анализирует тег скрипта innerHTML
напрямую.Об этом рассказывает статья в блоге Роджер Ху :
В статье рассматривается JavaScript LinkedIn и указывается используемый синтаксический анализатор:
В основном приведенный ниже код извлекает innerHTML, а затем задает переменные r и K как пары ключ / значение.Пробелы удаляются с помощью функции replace ().
Вот краткое описание, за которым следуют более длинные выдержки:
Данные извлекаются необработанными из innerHTML
:
l = f.innerHTML.replace(A, n)
Определяется регулярное выражение для каждой строки:
g = (/^[\s]*(.*?)[\s]*:[\s]*(.*)[\s]*$/),
Используется для каждой строки, устанавливая r
для клавиши и K
для значения.
W = s.match(g);
r = W[1].replace(A, n);
K = W[2].replace(A, n)
Если совпадений нет, выдается следующая ошибка:
script tag contents must be key/value pairs separated by a colon.
Большая выдержка:
for (U = 0, q = t.length; U < q; U++) {
var f = t[U];
if (!m.test(f.src)) {
continue
}
if (b.test(f.src)) {
c = true
}
try {
l = f.innerHTML.replace(A, n)
} catch (z) {
try {
l = f.text.replace(A, n)
} catch (y) {}
}
}
l = l.replace(J, "$1").replace(A, n).replace(F, n);
ab = C.test(l.replace(j, n));
for (var U = 0, T = l.split(k), q = T.length; U < q; U++) {
var s = T[U];
if (!s || s.replace(j, n).length <= 0) {
continue
}
try {
W = s.match(g);
r = W[1].replace(A, n);
K = W[2].replace(A, n)
} catch (Y) {
if (!ab) {
console.warn("script tag contents must be key/value pairs separated by a colon. Source: " + Y)
}
continue
}
N(r, K)
}
Набор регулярных выражений определяется в верхней частискрипт:
var S = {
"bootstrapInit": +new Date()
},
p = document,
m = (/^https?:\/\/.*?linkedin.*?\/in\.js.*?$/),
b = (/async=true/),
D = (/^https:\/\//),
J = (/\/\*((?:.|[\s])*?)\*\//m),
F = (/\r/g),
j = (/[\s]/g),
g = (/^[\s]*(.*?)[\s]*:[\s]*(.*)[\s]*$/),
x = (/_([a-z])/gi),
A = (/^[\s]+|[\s]+$/g),
u = (/^[a-z]{2}(_)[A-Z]{2}$/),
C = (/suppress(Warnings|_warnings):true/gi),
d = (/^api(Key|_key)$/gi),