Python 403从服务器而非浏览器访问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

我正在尝试使用Python和urllib2访问Buxfer REST API

问题是我得到了以下回应:

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