13

我想从需要我的 Windows 用户名和密码的网页中获取一些数据。

到目前为止,我有:

opener = build_opener()
try:
    page = opener.open("http://somepagewhichneedsmywindowsusernameandpassword/")
    print page
except URLError:
    print "Oh noes."

urllib2 支持吗?我找到了Python NTLM,但这需要我输入我的用户名和密码。有没有办法以某种方式获取身份验证信息(例如,如果我更改了network.automatic-ntlm-auth.trusted-uris设置,就像 IE 或 Firefox 一样)。

在msander的回答后编辑

所以我现在得到了这个:

# Send a simple "message" over a socket - send the number of bytes first,
# then the string.  Ditto for receive.
def _send_msg(s, m):
    s.send(struct.pack("i", len(m)))
    s.send(m)

def _get_msg(s):
    size_data = s.recv(struct.calcsize("i"))
    if not size_data:
        return None
    cb = struct.unpack("i", size_data)[0]
    return s.recv(cb)

def sspi_client():
    c = httplib.HTTPConnection("myserver")
    c.connect()
    # Do the auth dance.
    ca = sspi.ClientAuth("NTLM", win32api.GetUserName())
    data = None
    while 1:
        err, out_buf = ca.authorize(data) # error 400 triggered by this line
        _send_msg(c.sock, out_buf[0].Buffer)

        if err==0:
            break

        data = _get_msg(c.sock)

    print "Auth dance complete - sending a few encryted messages"
    # Assume out data is sensitive - encrypt the message.
    for data in "Hello from the client".split():
        blob, key = ca.encrypt(data)
        _send_msg(c.sock, blob)
        _send_msg(c.sock, key)
    c.sock.close()
    print "Client completed."

这是很好的撕毁socket_server.py(见这里)。但我收到错误 400 - 错误请求。有没有人有任何进一步的想法?

谢谢,

多姆

4

2 回答 2

16

假设您正在 Windows 上编写客户端代码并且需要无缝 NTLM 身份验证,那么您应该阅读 Python-win32 邮件列表中的 Mark Hammond 的Hooking in NTLM帖子,它基本上回答了相同的问题。这指向包含在 Python Win32 扩展中的 sspi 示例代码(包含在ActivePython中,否则可以在此处下载)。

于 2009-05-26T10:34:05.467 回答
-2

网站可以使用多种形式的身份验证。

  1. HTTP 身份验证。浏览器会在此处弹出一个窗口,供您输入用户名和密码。有两种机制:基本机制和摘要机制。页面附带一个“授权”标题,告诉浏览器(或使用 urllib2 的程序)该做什么。

    在这种情况下,您必须配置您的 urlopener 以提供授权标头需要查看的答案。您需要构建HTTPBasicAuthHandlerHTTPDigestAuthHandler

    AuthHandlers 需要PasswordManager。这个密码管理器可能有一个硬编码的用户名和密码(非常常见),或者它可能很聪明,可以从一些 Windows API 中计算出你的 Windows 密码。

  2. 应用程序身份验证。这是 Web 应用程序将您定向到一个页面的地方,该页面包含您填写用户名和密码的表单。在这种情况下,您的 Python 程序必须使用 urllib2 来执行 POST(带有数据的请求),其中数据是正确填写的表单。对帖子的回复通常包含一个 cookie,它允许您进一步访问。你不需要太担心 cookie,urllib2 会自动处理这个。

你怎么知道你有哪个?您将标头转储到响应中。来自 urllib2.openurl 的响应包括所有标题(在 中page.info())以及页面内容。

阅读Python 中的 HTTP 身份验证

如何使用 urllib、urllib2 和 ClientCookie 通过 Python 脚本登录 phpBB3 论坛?

如何从(非网络)python 客户端访问经过身份验证的 Google App Engine 服务?

于 2009-05-26T10:08:29.433 回答