mystry
mystry

Reputation: 23

Twitter HTTP Requests: 403 error

I want to send some HTTP requests to Twitter in Python in order to create a sign in for Twitter users for my app. I am using urllib, and following this link: https://dev.twitter.com/web/sign-in/implementing.

But I am unable to do this. I guess I need to authenticate before requesting a token but I don't know how to do that.

Code:

import urllib.request
req = urllib.request.Request("https://api.twitter.com/oauth/authenticate",
headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read()   //after this statement im 
                                              getting the error

Error:

Traceback (most recent call last):
    File "<pyshell#5>", line 1, in <module>
     html = urllib.request.urlopen(req).read()
    File "C:\Python34\lib\urllib\request.py", line 161, in urlopen
      return opener.open(url, data, timeout)
    File "C:\Python34\lib\urllib\request.py", line 469, in open
      response = meth(req, response)
    File "C:\Python34\lib\urllib\request.py", line 579, in http_response
      'http', request, response, code, msg, hdrs)
    File "C:\Python34\lib\urllib\request.py", line 507, in error
     return self._call_chain(*args)
    File "C:\Python34\lib\urllib\request.py", line 441, in _call_chain
     result = func(*args)
    File "C:\Python34\lib\urllib\request.py", line 587, in http_error_default
     raise HTTPError(req.full_url, code, msg, hdrs, fp)
    urllib.error.HTTPError: HTTP Error 403: Forbidden

Upvotes: 1

Views: 1502

Answers (1)

Padraic Cunningham
Padraic Cunningham

Reputation: 180411

If you go to the url with a browser it shows you that you need a key:

Whoa there! There is no request token for this page. That's the special key we need from applications asking to use your Twitter account. Please go back to the site or application that sent you here and try again; it was probably just a mistake.

If you go to this link it will let you choose one of your apps and it will bring you to a signature-generator that will show you the request settings.

To get a request_token you can use requests_oauthlib:

import requests
from requests_oauthlib import OAuth1


REQUEST_TOKEN_URL = "https://api.twitter.com/oauth/request_token"
CONSUMER_KEY = "xxxxxxxx
CONSUMER_SECRET = "xxxxxxxxxxxxxxxxx"

oauth = OAuth1(CONSUMER_KEY, client_secret=CONSUMER_SECRET)
r = requests.post(url=REQUEST_TOKEN_URL, auth=oauth)
print(r.content)
oauth_token=xxxxxxxxxxxxxx&oauth_token_secret=xxxxxxxxxxx&oauth_callback_confirmed=true

You then need to extract the oauth_token oauth_token_secret:

from urlparse import parse_qs
import webbrowser

data = parse_qs(r.content)
oauth_token = data['oauth_token'][0]
oauth_token_secret = data['oauth_token_secret'][0]
AUTH = "https://api.twitter.com/oauth/authorize?oauth_token={}"
auth = AUTH.format(oauth_token)
webbrowser.open(auth)

A webpage will open asking to Authorize your_app to use your account?

For python 3 use:

from urllib.parse import parse_qs


data = parse_qs(r.text)
oauth_token = data['oauth_token'][0]
oauth_token_secret = data['oauth_token_secret'][0]

Upvotes: 1

Related Questions