I have the same coding code to work with a stream of Twitter users running on two different machines. Both Ubuntu Lucid machines use python 2.6.5, but on a machine in my house I get HTTP Error 401: Unauthorized , while at university it works fine. On both machines, it works fine when I use curl with the same parameters, that is, the consumer key, consumer secret, access token and access key.
Check out the code below, it was created by Josh Sharp
from oauth.oauth import OAuthRequest, OAuthSignatureMethod_HMAC_SHA1 from hashlib import md5 import json, time import random, math, re, urllib, urllib2 STREAM_URL = "https://userstream.twitter.com/2/user.json" class Token(object): def __init__(self,key,secret): self.key = key self.secret = secret def _generate_nonce(self): random_number = ''.join(str(random.randint(0, 9)) for i in range(40)) m = md5(str(time.time()) + str(random_number)) return m.hexdigest() CONSUMER_KEY = 'consumer_key' CONSUMER_SECRET = 'consumer_secret' ACCESS_TOKEN = 'token' ACCESS_TOKEN_SECRET = 'token_secret' access_token = Token(ACCESS_TOKEN,ACCESS_TOKEN_SECRET) consumer = Token(CONSUMER_KEY,CONSUMER_SECRET) parameters = { 'oauth_consumer_key': CONSUMER_KEY, 'oauth_token': access_token.key, 'oauth_signature_method': 'HMAC-SHA1', 'oauth_timestamp': str(int(time.time())), 'oauth_nonce': access_token._generate_nonce(), 'oauth_version': '1.0', } oauth_request = OAuthRequest.from_token_and_callback(access_token, http_url=STREAM_URL, parameters=parameters) signature_method = OAuthSignatureMethod_HMAC_SHA1() signature = signature_method.build_signature(oauth_request, consumer, access_token) parameters['oauth_signature'] = signature data = urllib.urlencode(parameters) req = urllib2.urlopen("%s?%s" % (STREAM_URL,data)) buffer = ''
Error trying to run at home:
File "py_stream.py", line 48, in <module> req = urllib2.urlopen("%s?%s" % (STREAM_URL,data)) File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen return _opener.open(url, data, timeout) File "/usr/lib/python2.6/urllib2.py", line 397, in open response = meth(req, response) File "/usr/lib/python2.6/urllib2.py", line 510, in http_response 'http', request, response, code, msg, hdrs) File "/usr/lib/python2.6/urllib2.py", line 435, in error return self._call_chain(*args) File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain result = func(*args) File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 401: Unauthorized
Since it works using curl on both machines, I suppose nothing happened with SSL certification. But at the same time, it makes me wonder what fails when I use it at home.