I am working on an desktop inbox notifier for StackOverflow, using the API with Python.

The script I am working on first logs the user in on StackExchange, and then requests authorisation for the application.

Assuming the application has been authorised through web-browser interaction of the user. The application should be able to make requests to the API with authentication, hence it needs the access token specific to the user. This is done with the URL: `https://stackexchange.com/oauth/dialog?client_id=54&scope=read_inbox&redirect_uri=https://stackexchange.com/oauth/login_success`

When requesting authorisation via the web-browser the redirect is taking place and an access code is returned after a `#`. **However, when requesting this same URL with Python (urllib2), no hash or key is returned in the response.**

Why is this and how do I get it to work?

Here is my script (it's experimental) and remember: it assumes the user has already authorised the application.

    #!/usr/bin/env python
    
    import urllib
    import urllib2
    import cookielib
    from BeautifulSoup import BeautifulSoup
    from getpass import getpass    
    
    # Define URLs
    parameters = [ 'client_id=54',
                   'scope=read_inbox',
                   'redirect_uri=https://stackexchange.com/oauth/login_success'
                 ]
    
    dialog_url = 'https://stackexchange.com/oauth/dialog?' + '&'.join(parameters)
    login_url = 'https://openid.stackexchange.com/account/login'
    submit_url = 'https://openid.stackexchange.com/account/login/submit'
    authentication_url = 'http://stackexchange.com/users/authenticate?openid_identifier='
    
    # Set counter for requests:
    counter = 0
    
    # Build opener
    jar = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar))
    
    
    def authenticate(username='', password=''):
    
        '''
            Authenticates to StackExchange using user-provided username and password
        '''
    
        # Build up headers
        user_agent = 'Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'
        headers = {'User-Agent' : user_agent}
    
        # Set Data to None
        data = None
    
        # 1. Build up URL request with headers and data    
        request = urllib2.Request(login_url, data, headers)
        response = opener.open(request)
    
        # Build up POST data for authentication
        html = response.read()
        fkey = BeautifulSoup(html).findAll(attrs={'name' : 'fkey'})[0].get('value').encode()
    
        values = {'email' : username,
                  'password' : password,
                  'fkey' : fkey}
        
        data = urllib.urlencode(values)
        
        # 2. Build up URL for authentication
        request = urllib2.Request(submit_url, data, headers)
        response = opener.open(request)
        
    
        # Check if logged in
        if response.url == 'https://openid.stackexchange.com/user':
            print ' Logged in! :) '
        else:
            print ' Login failed! :( '
        
        # Find user ID URL    
        html = response.read()
        id_url = BeautifulSoup(html).findAll('code')[0].text.split('"')[-2].encode()
    
    
        # 3. Build up URL for OpenID authentication
        data = None
        url = authentication_url + urllib.quote_plus(id_url)
        request = urllib2.Request(url, data, headers)
        response = opener.open(request)
        
        # 4. Build up URL request with headers and data
        request = urllib2.Request(dialog_url, data, headers)
        response = opener.open(request)
        
        if '#' in response.url:
            print 'Access code provided in URL.'
        else:
            print 'No access code provided in URL.'
    
    
    if __name__ == '__main__':
        username = raw_input('Enter your username: ')
        password = getpass('Enter your password: ')
        authenticate(username, password)