I have just uploaded the same image using the web interface : http://twitpic.com/1ttrlu <http://twitpic.com/1ttrlu>do you have any recommendation ? On how to solve this issue. <http://twitpic.com/1ttrlu>Regards, --yml
On Fri, Jun 4, 2010 at 9:56 AM, Yann Malet <yann.ma...@gmail.com> wrote: > Steve, > The image is only 33.7kb and it is a jpg. > Do you have any python sample code for the ? > Regards, > --yml > > > On Fri, Jun 4, 2010 at 9:38 AM, Steve C <st...@twitpic.com> wrote: > >> Twitpic will only 400 Bad Request you if it can't find the image in >> your multipart/form- >> data or if the image is invalid (not jpg/png/gif or >5MB in size). >> >> Thanks, >> >> Steve C >> Twitpic >> >> On Jun 4, 9:20 am, Yann Malet <yann.ma...@gmail.com> wrote: >> > If I send this request to 127.0.0.1:9000 without the file here it is >> the >> > string I can observe : >> > >> > """ >> > (ve)y...@yml-laptop:jess3$ netcat -l -p 9000 >> > POST / HTTP/1.1 >> > Accept-Encoding: identity >> > Content-Length: 377 >> > X-Auth-Service-Provider: >> https://api.twitter.com/1/account/verify_credentials.json >> > Host: 127.0.0.1:9000 >> > User-Agent: Python-urllib/2.6 >> > Connection: close >> > Content-Type: multipart/form-data; >> boundary=a45bd25da2844dac81003987b3c19e18 >> > X-Verify-Credentials-Authorization: OAuth realm=" >> http://api.twitter.com/", >> > oauth_signature_method="HMAC-SHA1", >> > oauth_consumer_key="y2hEqGNEmyjU2De3hNcg", >> > oauth_token="90476798-5VZeNLpXUCaJ06UaWve2c4JVfdcJj5D4r21JxUFM", >> > oauth_signature="NMPlU4cRYl0b6jbQJ1xGXaZ5%2FpM%3D" >> > >> > --a45bd25da2844dac81003987b3c19e18 >> > Content-Disposition: form-data; name="key" >> > Content-Type: text/plain; charset=utf-8 >> > Content-Length: 32 >> > >> > 4bb040d1ec65427f8038cdd60a12cde2 >> > --a45bd25da2844dac81003987b3c19e18 >> > Content-Disposition: form-data; name="message" >> > Content-Type: text/plain; charset=utf-8 >> > Content-Length: 13 >> > >> > copine et moi >> > --a45bd25da2844dac81003987b3c19e18-- >> > ^C >> > (ve)y...@yml-laptop:jess3$ >> > >> > """ >> > >> > Does any one can spot the issue ? >> > Regards, >> > --yml >> > >> > >> > >> > On Fri, Jun 4, 2010 at 9:14 AM, Yann Malet <yann.ma...@gmail.com> >> wrote: >> > > Hello Zac, >> > >> > > I rewrote everything in my app based on python-oauth2 : >> > >http://dpaste.com/203168/ >> > > The file is still hardcoded to ease the comprehension. I hope this >> will >> > > help you to spot my issue. >> > >> > > The error message I get from twitpic is 400 bad request. >> > > Regards, >> > > --yml >> > >> > > """ >> > > class OAuthEchoRequest(oauth.Request): >> > > def to_header(self, realm='http://api.twitter.com/'): >> > > headers = super(OAuthEchoRequest, self).to_header(realm=realm) >> > > return {'X-Verify-Credentials-Authorization': >> > > headers['Authorization']} >> > >> > > @login_required >> > > def twitpic_upload_photo(request): >> > > if request.method == 'POST': >> > > form = PhotoForm(request.POST, request.FILES) >> > > if form.is_valid(): >> > > profile = Profile.objects.get(user=request.user) >> > > token = oauth.Token(profile.oauth_token, >> > > profile.oauth_secret) >> > >> > > params = { >> > > 'oauth_consumer_key': settings.TWITTER_CONSUMER_KEY, >> > > 'oauth_signature_method':"HMAC-SHA1", >> > > 'oauth_token':token.key, >> > > 'oauth_timestamp':oauth.generate_timestamp(), >> > > 'oauth_nonce':oauth.generate_nonce(), >> > > 'oauth_version':'1.0' >> > > } >> > >> > > oauth_echo_request = OAuthEchoRequest(method="GET", >> > >> > > url=settings.TWITTER_VERIFY_CREDENTIALS, >> > > #parameters=params >> > > ) >> > >> > > >> signature=oauth_echo_request.sign_request(oauth.SignatureMethod_HMAC_SHA1() >> , >> > > consumer, >> > > token) >> > >> > > headers = oauth_echo_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 >> > > #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() >> > >> > > return direct_to_template(request, >> > > "twitter_integration/photo_form.html", >> > > {"form":form,}) >> > > """ >> > >> > > On Thu, Jun 3, 2010 at 10:48 PM, Zac Bowling <zbowl...@gmail.com> >> wrote: >> > >> > >> Hi Yann, >> > >> > >> I don't see anything obvious that stands out as wrong to me in your >> > >> implementation from just looking at it, but I'm not sure. I do have >> OAuth >> > >> Echo code working for Twitpic but using the OAuth2 library. If you >> don't >> > >> figure out an answer, you can hit me up off the list and I'll see if >> I >> > >> separate our version so it works independently and I'll post it on >> gist for >> > >> you. >> > >> > >> If you want to upgrade though to python-oauth2, the biggest change is >> > >> swapping out your imports to use oauth2 instead of oauth and removing >> the >> > >> "OAuth" prefix on all the class names. >> > >> > >> For example: >> > >> import oauth >> > >> oauth.OAuthRequest(...) >> > >> oauth.OAuthToken(...) >> > >> > >> becomes: >> > >> import oauth2 >> > >> oauth2.Request(...) >> > >> oauth2.Token(...) >> > >> > >> etc... >> > >> > >> Most of the API that you care about is identical from there. The >> library >> > >> has evolved a bit but it should be obvious and most of the public >> methods >> > >> remained the same. In my fork, I've fixed a few issues and added some >> > >> changes to support XAuth and a few other minor issues (like forcing >> > >> Authentication headers on POSTs for Twitter). >> > >> > >> Zac Bowling >> > >> @zbowling >> > >> > >> On Jun 3, 2010, at 6:37 PM, Yann Malet wrote: >> > >> > >> Zac, >> > >> I would love to do this but I can't find any documentation on how to >> do >> > >> Oauth Echo with python-oauth2. I would gladly switch to python-ouath2 >> if I >> > >> could find some code showing How to use it to post a picture on >> twitpic : >> > >>http://dev.twitpic.com/docs/2/upload/ >> > >> > >> <http://dev.twitpic.com/docs/2/upload/>Any help would be greatly >> > >> appreciated. >> > >> Regards, >> > >> --yml >> > >> > >> On Thu, Jun 3, 2010 at 7:41 PM, Zac Bowling <zbowl...@gmail.com> >> wrote: >> > >> > >>> It may not help fix your problem but I would recommend upgrading to >> the >> > >>> python-oauth2 library. (Don't be confused by the name; it's not an >> oauth 2.0 >> > >>> library, but just the next generation of the original oauth 1.0a >> library >> > >>> that Leah Culver wrote). There are bunch of little issues with the >> original >> > >>> one that don't follow the spec exactly that are fixed and it's not a >> > >>> difficult upgrade (as long as your are not hosting an OAuth server >> of your >> > >>> own because those interfaces changed considerably). >> > >> > >>>http://github.com/zbowling/python-oauth2(the fork I maintain with >> bunch >> > >>> of twitter related fixes and workarounds) >> > >>> or: >> > >>>http://github.com/simplegeo/python-oauth2(the official upstream) >> > >> > >>> Zac Bowling >> > >>> @zbowling >> > >> > >>> On Jun 3, 2010, at 3:15 PM, Steve C 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),... >> > >> > read more ยป > > >