Python 403从服务器而非浏览器访问API时出错
我正在尝试使用Python和urllib2访问Buxfer REST API 问题是我得到了以下回应:Python 403从服务器而非浏览器访问API时出错,python,api,http,http-status-code-403,Python,Api,Http,Http Status Code 403,我正在尝试使用Python和urllib2访问Buxfer REST API 问题是我得到了以下回应: urllib2.HTTPError: HTTP Error 403: Forbidden 但当我通过浏览器尝试同一个电话时,效果很好 脚本如下所示: username = "xxx@xxxcom" password = "xxx" ############# def checkError(response): result = simplejson.load(respon
urllib2.HTTPError: HTTP Error 403: Forbidden
但当我通过浏览器尝试同一个电话时,效果很好
脚本如下所示:
username = "xxx@xxxcom"
password = "xxx"
#############
def checkError(response):
result = simplejson.load(response)
response = result['response']
if response['status'] != "OK":
print "An error occured: %s" % response['status'].replace('ERROR: ', '')
sys.exit(1)
return response
base = "https://www.buxfer.com/api";
url = base + "/login?userid=" + username + "&password=" + password;
req = urllib2.Request(url=url)
response = checkError(urllib2.urlopen(req))
token = response['token']
url = base + "/budgets?token=" + token;
req = urllib2.Request(url=url)
response = checkError(urllib2.urlopen(req))
for budget in response['budgets']:
print "%12s %8s %10.2f %10.2f" % (budget['name'], budget['currentPeriod'], budget['limit'], budget['remaining'])
sys.exit(0)
我还尝试使用请求库,但出现了相同的错误。
我尝试访问的服务器是ubuntu 14.04,任何关于解释或解决为什么会发生这种情况的帮助都将不胜感激
编辑:
这是完整的错误消息:
{
'cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>,
'_content': '
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /api/login
on this server.</p>
<hr>
<address>Apache/2.4.7 (Ubuntu) Server at www.buxfer.com Port 443</address>
</body></html>',
headers': CaseInsensitiveDict({
'date': 'Sun, 31 Jan 2016 12:06:44 GMT',
'content-length': '291',
'content-type': 'text/html; charset=iso-8859-1',
'server': 'Apache/2.4.7 (Ubuntu)'
}),
'url': u'https://www.buxfer.com/api/login?password=xxxx&userid=xxxx%40xxxx.com',
'status_code': 403,
'_content_consumed': True,
'encoding': 'iso-8859-1',
'request': <PreparedRequest [GET]>,
'connection': <requests.adapters.HTTPAdapter object at 0x7fc7308102d0>,
'elapsed': datetime.timedelta(0, 0, 400442),
'raw': <urllib3.response.HTTPResponse object at 0x7fc7304d14d0>,
'reason': 'Forbidden',
'history': []
}
编辑3:
我也可以通过我的本地pycharm控制台进行访问,没有任何问题,只是在我尝试从远程服务器进行访问时…您可能需要执行POST而不是GET请求。大多数登录都是这样工作的 使用请求库,您需要
response = requests.post(
base + '/login',
data={
'userid': username,
'password': password
}
)
你能发布完整的错误信息吗?哪个请求导致403?你拿到令牌了吗?当我在buxfer上创建一个帐户时,你的代码对我来说运行得非常好。我正在Ubuntu 14.04.3上运行Python 2.7.6。嘿,Rob,你有/var/www文件夹吗?我在很多论坛上看到,一些API要求这个文件夹必须存在,才能用于回调过程。你使用的是真实的用户名和密码吗?从错误消息看,似乎您使用了无效用户。403禁止将不会令人惊讶。我是,我正在使用在我的web浏览器上的脚本中创建的相同url,并且我获得了访问权限。嗨,Carl,谢谢你的时间,我刚刚尝试使用POST,但错误仍然存在same@johan855你能看看浏览器开发者控制台上的网络标签吗(Chrome和Firefox都有这个功能),完成登录过程,查看哪些信息被发送到服务器以及如何发送。是POST还是GET,是表单编码还是JSON编码,或者其他什么,参数和它们的值是什么(可能有一些隐藏字段),等等,这些都应该提供使用脚本登录所需的所有信息。嗨,Carl,我在问题中添加了结果,但我担心这不包含我以前不知道的任何内容,请求是GET,响应是JSON编码的,在导航到url@johan855我不知道
urllib2
代码是否会维护服务器返回的cookie。根据您的Chrome输出,肯定返回了一些重要的登录相关cookie。你可以试试看。如果您愿意转到请求
我可以尝试提供更多帮助,因为它在维护请求状态(包括cookie)方面更好。是的,我绝对同意转到请求,我只使用了urllib2,因为这是他们的API示例所建议的。我还尝试了一件事,就是用请求头sendind:User-Agent:Mozilla/5.0(Windows NT 10.0;WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/48.0.2564.97 Safari/537.36,但运气不好。。。
response = requests.post(
base + '/login',
data={
'userid': username,
'password': password
}
)