If you were seeing a 400 Bad Req, you were most likely sending a bad
upload to the API. We only return a 400 Bad Req if the image is not
found, the multipart form-data is malformed, or if the image is >5MB.

If Twitpic is having a service outage you will always get a 50x error
(502 or 500). If Twitter is having an OAuth Echo outage, you will get
a 401 Unauthorized from the Twitpic API.

Steve Corona
Twitpic

On Jun 4, 3:48 pm, yml <yann.ma...@gmail.com> wrote:
> At that point both services yfrog and twipic work fine. I hate to say
> this but I am almost convince that the pain in the development process
> comes from some outage in either twitpic or Twitter Oauth Echo
> authentication.
>
> for the sake of completeness of this thread here it is my 2 working
> views :http://dpaste.com/203292/
>
> Regards,
> --yml
>
> On Jun 4, 9:59 am, Yann Malet <yann.ma...@gmail.com> wrote:
>
>
>
> > 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(theforkI maintain with
> > >> bunch
> > >> > >>> of twitter related fixes and workarounds)
> > >> > >>> or:...
>
> read more »

Reply via email to