代码之家  ›  专栏  ›  技术社区  ›  rm.rf.etc

为什么linkedin auth的脚本标记不是有效的javascript?

  •  3
  • rm.rf.etc  · 技术社区  · 8 年前

    The LinkedIn guide for setting up auth with the Javascript SDK 显示了一个代码示例,但对于作者的实际含义来说,这非常令人困惑。

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

    它不是有效的JS,没有逗号,并且省略了引号。此外,示例显示了方括号,但必须省略这些方括号,否则将引发错误。一个现实世界的例子可以减轻这种困惑,但是,当然,没有提供。

    这是一个有效的例子,但是使用一个组合的API密钥(API密钥与客户机ID是相同的,指南不需要解释这个问题)。

    <script type="text/javascript" src="//platform.linkedin.com/in.js">
        api_key: 93h7nnksxj3ccd
        authorize: true
        lang: en_US
    </script>
    

    As you can see with this other SO question 我不是唯一一个困惑的人,这个人和我想的一样,就是需要引用。

    这个代码实际上是如何工作的?对于类型为 text/javascript ?

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Grokify Milad    8 年前

    外部脚本正在读取和分析脚本标记的 innerHTML 直接。这篇博客文章由 Roger Hu :

    本文检查LinkedIn的javascript并识别所使用的解析器:

    基本上,下面的代码似乎提取了innerhtml,然后将变量r和k设置为键/值对。用replace()函数删除空白。

    下面是一个简短的描述,后面是较长的摘录:

    数据是从 内HTML :

    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),