2009-07-08 39 views
5

机械化(Python)401失败,我打开http digest URL。我搜索并尝试调试但没有成功。python机械化可以处理HTTP认证吗?

我的代码看起来像这样。

import mechanize 

project = "test" 
baseurl = "http://trac.somewhere.net" 
loginurl = "%s/%s/login" % (baseurl, project) 
b = mechanize.Browser() 
b.add_password(baseurl, "user", "secret", "some Realm") 
b.open(loginurl) 
+0

失败是什么意思?这是403失败吗?其他一些错误或情况? – ars 2009-07-08 11:22:45

+0

trac是否配置为使用HTTP身份验证进行检查?或者您是否必须通过简单的HTML表单登录? – 2009-07-08 11:54:12

+1

某些东西看起来很奇怪 - 您似乎在导航到登录页面,通常不会对其进行保护。通过基本/摘要认证,您可以直接访问受保护的资源,在HTTP标头中提供您的凭证(当然,这对您来说是机械化的)。 – 2009-07-08 12:04:39

回答

6

机械化宣称参数应该是uri,用户名和密码作为参数,但是您有四个参数。四个参数对于urllib2.add_password是正确的,但是第一个参数应该是领域,而不是uri。

http://wwwsearch.sourceforge.net/mechanize/

我会尝试先改变这种状况。

Trac是否需要摘要?如果不是下一步可以尝试使用基本身份验证,作为一个测试,看看是否能工作,因为你可以添加一个以刚的addHeader:

import base64 
from mechanize import Browser 
browser = Browser() 
browser.addheaders.append(('Authorization', 'Basic %s' % base64.encodestring('%s:%s' % (user, pwd)))) 
+0

最后一个参数是可选的:realm,默认为None。 – 2009-07-08 12:03:11

+0

啊,好的。从来没有见过这样的人,文档也没有提及它......但无论如何,你会发现他只是打开登录屏幕,事实上这根本不是认证错误。 – 2009-07-08 12:27:29

0

根据您的网络自动化项目的复杂程度,可以考虑使用iMacros的。与机械化不同,它运行在网络浏览器中,因此它可以与大多数开箱即用的网站一起使用。

我通过命令行(在我们的Linux服务器上)和iMacros Scripting Edition(通过Windows VMware上的Flash和Java网站)使用COM对象使用免费的Firefox插件。

命令行(免费软件&开源):http://wiki.imacros.net/iMacros_for_Firefox#Command_Line_Support

COM对象(付费版需要):wiki.imacros.net/Python

1
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import mechanize 

a=mechanize.Browser() 
a.open("http://www.facebook.com/login.php") 
a.select_form(nr=0) #form number. 
a["email"]="mailaddress" 
a["pass"]="password" 
a.submit() 
print a 
3

对于机械化HTTP认证您需要将完整的url提供给add_password方法,而不仅仅是主机基地址。

import mechanize 

project = "test" 
baseurl = "http://trac.somewhere.net" 
loginurl = "%s/%s/login" % (baseurl, project) 
b = mechanize.Browser() 
b.add_password(loginurl, "user", "secret", "some Realm") 
b.open(loginurl)