为什么LinkedIn auth的脚本标记不是有效的JavaScript?

为什么LinkedIn auth的脚本标记不是有效的JavaScript?,javascript,oauth-2.0,linkedin-api,linkedin-jsapi,Javascript,Oauth 2.0,Linkedin Api,Linkedin Jsapi,显示了一个代码示例,但对于作者的实际意思,它非常混乱 <script type="text/javascript" src="//platform.linkedin.com/in.js"> api_key: [API_KEY] onLoad: [ONLOAD] authorize: [AUTHORIZE] lang: [LANG_LOCALE] </script> api_密钥:[api_密钥] onLoad:[on

显示了一个代码示例,但对于作者的实际意思,它非常混乱

<script type="text/javascript" src="//platform.linkedin.com/in.js">
    api_key:   [API_KEY]
    onLoad:    [ONLOAD]
    authorize: [AUTHORIZE]
    lang:      [LANG_LOCALE]
</script>

api_密钥:[api_密钥]
onLoad:[onLoad]
授权:[授权]
郎朗:[郎朗语言环境]
它不是有效的JS,没有逗号,引号被省略。此外,该示例显示了括号,但必须忽略这些括号,否则将抛出错误。一个真实的例子可以缓解这种混乱,但是,当然,没有提供任何例子

下面是一个有效的示例,但使用的是一个虚构的API密钥(API密钥与客户机ID是同一件事–指南不需要解释)


api_键:93h7nnksxj3ccd
授权:正确
朗:恩
,我不是唯一一个感到困惑的人,这家伙和我想的一样,那就是需要引用

这段代码实际上是如何工作的?对于类型为
text/javascript
的脚本标记,这被认为是有效的语法吗


[编辑]Re:可能重复,似乎不是。查看所选答案。[/edit]

外部脚本直接读取和解析脚本标记的
innerHTML
。这篇博客文章涵盖了以下内容:

本文分析了LinkedIn的JavaScript并确定了使用的解析器:

基本上,下面的代码似乎提取了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)
}
可能重复的
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),