使用Request,HttpNtlmAuth通过身份验证进行系统调用

时间:2014-01-10 22:17:18

标签: python-2.7 subprocess python-requests ntlm yslow

我已经得到了以下代码片段,大胆地告诉我它是“FAIL加载未定义”(神经......)我正在尝试将经过身份验证的会话传递给使用javascript的系统调用。

    import requests
    from requests_ntlm import HttpNtlmAuth
    from subprocess import call
    # THIS WORKS - 200 returned


    s = requests.Session()
    r = s.get("http://example.com",auth=HttpNtlmAuth('domain\MyUserName','password'))
    call(["phantomjs", "yslow.js", r.url])

问题是当“calL”被调用时 - 我得到的是以下

FAIL to load undefined.

我猜测只传递正确的经过身份验证的会话应该有效 - 但问题是我该怎么做才能提取我想要的信息。在所有其他尝试中,这是最富有成果的。请帮忙 - 谢谢!

1 个答案:

答案 0 :(得分:3)

这里似乎有几件事情,所以我会逐一解决。

  1. python中的subprocess模块用于调用系统,就像使用命令行一样。它不知道“经过身份验证的会话”,并且命令行(或shell)不知道如何使用python对象(如会话)来使用phantomjs

  2. phantomjs有python绑定since version 1.8所以我希望通过使用它们可以更容易。但是,我没有使用过它们,所以我不能肯定地告诉你它们会有所帮助。

  3. 我查看了yslow的{​​{3}},似乎没有办法将要下载的内容传递给它。即使这样,内容也不会包含所有内容(例如:任何由selenium / phantomjs或浏览器加载的外部托管的javascript都不会被请求加载)

    yslow好像通常只为您下载网址并执行分析。但是,当网站落后NTLM时,它首先向客户端发送401响应,该响应应向客户端指示它必须进行身份验证。此外,信息被发送到客户端,告知它如何进行身份验证,并提供在NTLM身份验证时使用的参数。这就是requests_ntlmrequests一起使用的方式。第一个请求生成并生成401响应,然后身份验证处理程序生成正确的标头并重新发送请求,这就是您看到200响应绑定到r的原因。

    yslow接受您要发送的标头的JSON表示,这样您就可以尝试使用r.request.headers中的标头,但我怀疑它们是否有效。

    简而言之,这不是通常遵循requests标记的人可以帮助您的问题。查看yslow的文档似乎(技术上)不支持任何类型的身份验证。 yslow开发人员可能会争辩说它支持基本身份验证,因为它允许您指定标头。