Thanks Steve for your reply but has you could see in the second code snippet I have posted i have changed this from POST to GET without much success.
I had also replaced the http_url has you suggest. One of my question is how does the file should be sent in the ? multipart_encode or urlencode I would be glad to provide you with any additional information if you need it. Regards, --yml On Thu, Jun 3, 2010 at 6:15 PM, Steve C <st...@twitpic.com> wrote: > I just looked at your code briefly, but I believe the problem is this > line: > > oauth_request = TwitpicOAuthRequest(http_method="POST", > http_url=settings.TWITPIC_API_URL, > > The OAuth Request needs to be signed using the Twitter Endpoint > (https://api.twitter.com/1/account/verify_credentials.json), not the > Twitpic API URL. > > Try something like this: > > oauth_request = TwitpicOAuthRequest(http_method="GET", > http_url="https://api.twitter.com/1/account/verify_credentials.json", > > > On Jun 3, 2:38 pm, yml <yann.ma...@gmail.com> wrote: > > I would greatly appreciate any help. > > Here it is the latest evolution of this piece of code : > > > > """ > > class TwitpicOAuthRequest(OAuthRequest): > > def to_header(self, realm='http://api.twitter.com/'): > > headers = super(TwitpicOAuthRequest, > > self).to_header(realm=realm) > > return {'X-Verify-Credentials-Authorization': > > headers['Authorization']} > > > > def post_photo(request): > > if request.method == 'POST': > > form = PhotoForm(request.POST, request.FILES) > > if not request.session.get('twitter_access_token'): > > return HttpResponse("Not authenticated") > > if form.is_valid(): > > access_token = request.session['twitter_access_token'] > > > > params = { > > 'oauth_consumer_key': settings.TWITTER_CONSUMER_KEY, > > 'oauth_signature_method':"HMAC-SHA1", > > 'oauth_token':access_token.key, > > 'oauth_timestamp':oauth.generate_timestamp(), > > 'oauth_nonce':oauth.generate_nonce(), > > 'oauth_version':'1.0' > > } > > > > consumer = > > oauth.OAuthConsumer(key=settings.TWITTER_CONSUMER_KEY, > > > > secret=settings.TWITTER_CONSUMER_SECRET) > > token = oauth.OAuthToken(key=access_token.key, > > secret=access_token.secret) > > oauth_request = TwitpicOAuthRequest(http_method="GET", > > > > #http_url=settings.TWITPIC_API_URL, > > > > http_url=settings.TWITTER_VERIFY_CREDENTIALS, > > parameters=params) > > > > signature=oauth_request.sign_request(OAuthSignatureMethod_HMAC_SHA1(), > > consumer, > > access_token) > > > > headers = oauth_request.to_header() > > headers['X-Auth-Service-Provider'] = > > settings.TWITTER_VERIFY_CREDENTIALS > > > > #with multipart_encode > > values = [ > > MultipartParam('key',value=settings.TWITPIC_API_KEY), > > > > MultipartParam('message',value=form.cleaned_data['message']), > > MultipartParam('media', > > filename='copine_moi.jpg', > > filetype='image/jpeg', > > fileobj=open("/home/yml/Desktop/ > > copine_moi.jpg","rb")) > > ] > > > > register_openers() > > datagen, heads = multipart_encode(values) > > headers.update(heads) > > req = urllib2.Request(settings.TWITPIC_API_URL, datagen, > > headers) > > # Post to netcat -l -p 9000 > > #req = urllib2.Request("http://127.0.0.1:9000", datagen, > > headers) > > > > #with urlencode > > #values = {} > > #values['key'] = MultipartParam(settings.TWITPIC_API_KEY) > > #values['message'] = > > MultipartParam(form.cleaned_data['message']) > > #values['media'] = open("/home/yml/Desktop/ > > copine_moi.jpg", "rb").read() > > #data = urllib.urlencode(values) > > #req = urllib2.Request(settings.TWITPIC_API_URL, data, > > headers) > > > > response = urllib2.urlopen(req) > > return HttpResponse("the photo is posted") > > else: > > form = PhotoForm(initial={"created_at":datetime.now()}) > > > > return render_to_response("twitter_integration/photo_form.html", > > {"form":form,}, > > > > context_instance=RequestContext(request)) > > """ > > > > On Jun 3, 11:20 am, yml <yann.ma...@gmail.com> wrote: > > > > > > > > > Hello, > > > I am in the process of writing a python web app that should enable the > > > user to post picture to twitpic using the Oauth Echo authorization > > > mechanism. > > > > > The application is already able to post tweet using the Oauth > > > authentication so the access_token is available to us in the session. > > > > > So my question to you guys is that it would be great if someone could > > > point what is the issue in the code below or paste some sample code > > > that upload a picture in python to twitpic. > > > > > """" > > > # OauthRequest is from the python-oauth lib > > > # I overide the to_header method to return a dict with the right key. > > > > > class TwitpicOAuthRequest(OAuthRequest): > > > def to_header(self, realm='http://api.twitter.com/'): > > > headers = super(TwitpicOAuthRequest, > > > self).to_header(realm=realm) > > > return {'X-Verify-Credentials-Authorization': > > > headers['Authorization']} > > > > > def post_photo(request): > > > if request.method == 'POST': > > > form = PhotoForm(request.POST, request.FILES) > > > if not request.session.get('twitter_access_token'): > > > return HttpResponse("Not authenticated") > > > if form.is_valid(): > > > access_token = request.session['twitter_access_token'] > > > > > params = { > > > 'oauth_consumer_key': settings.TWITTER_CONSUMER_KEY, > > > 'oauth_signature_method':"HMAC-SHA1", > > > 'oauth_token':access_token.key, > > > 'oauth_timestamp':oauth.generate_timestamp(), > > > 'oauth_nonce':oauth.generate_nonce(), > > > 'oauth_version':'1.0' > > > } > > > > > consumer = > > > oauth.OAuthConsumer(key=settings.TWITTER_CONSUMER_KEY, > > > > > secret=settings.TWITTER_CONSUMER_SECRET) > > > token = oauth.OAuthToken(key=access_token.key, > > > secret=access_token.secret) > > > oauth_request = TwitpicOAuthRequest(http_method="POST", > > > > > http_url=settings.TWITPIC_API_URL, > > > parameters=params) > > > > > > signature=oauth_request.build_signature(OAuthSignatureMethod_HMAC_SHA1(), > > > consumer, > > > access_token) > > > > > headers = oauth_request.to_header() > > > headers['X-Auth-Service-Provider'] = 'https:// > > > api.twitter.com/1/account/verify_credentials.json' > > > headers['X-Verify-Credentials-Authorization'] += ', > > > oauth_signature="%s"' %signature > > > > > values = {} > > > values['key'] = settings.TWITPIC_API_KEY > > > values['message'] = form.cleaned_data['message'] > > > # the path to the file is hardcoded here in the future it > > > will be taken from the from > > > values['media'] = open("/home/yml/Desktop/copine_moi.jpg", > > > "rb") > > > register_openers() > > > datagen, heads = multipart_encode(values) > > > headers.update(heads) > > > > > req = urllib2.Request(settings.TWITPIC_API_URL, datagen, > > > headers) > > > response = urllib2.urlopen(req) > > > > > return HttpResponse("the photo is posted") > > > else: > > > form = PhotoForm(initial={"created_at":datetime.now()}) > > > > > return render_to_response("twitter_integration/photo_form.html", > > > {"form":form,}, > > > > > context_instance=RequestContext(request)) > > > """" >