for the searchable archives:

I received help from someone (whom I believe wants to remain
anonymous):
   http://pastebin.com/m7b09edc
   http://pastebin.com/mf4ba5f9

awesome! it doesn't use the build_opener method, but instead packages
the boundary/content-type builder method (see http://berserk.org/uploadr/)
into a very nice module. snaps.

On Feb 20, 6:45 pm, lucy <[email protected]> wrote:
> I've tried a variety of ways to send "raw multipart data" to twitter's
> update_background_image REST api.
> specs:
>      http://apiwiki.twitter.com/REST+API+Documentation#updateprofilebackgr...
>
> The problem is that I get back a server error. I'd appreciate any
> help. I'm probably misunderstanding "raw multipart data", so feel free
> to offer resources that might help.
>
> Currently I'm using python with the urllib and urllib2 standard
> libraries. I looked at pycurl but that would be a pain to integrate
> because everyone on the project uses different platforms (for which
> pycurl doesn't provide binaries) and possess varying levels of
> 'install-fu'.
>
> I found this to be a useful tutorial on urllib and urllib2:
>    http://www.voidspace.org.uk/python/articles/urllib2.shtml
>
> I've tried sending the image opened, eg "open(imgname, 'rb'), and
> mime'd, according to this resource:
>    http://www.python.org/doc/2.2.3/lib/node397.html
>
> Here is some python code and errors. Be sure to provide a twitter
> username and password instead of XXX.
>
> >>> username = XXX
> >>> password = XXX
> >>> url = 'http://twitter.com/account/update_profile_background_image.json'
> >>> imgname = 'media/tcal/img/twitter_icon.jpg'
> >>> fp = open(imgname, 'rb')
> >>> img = MIMEImage(fp.read())
> >>> fp.close()
> >>> values = {'image':img }
> >>> data = urllib.urlencode(values)
> >>> auth = urllib2.HTTPPasswordMgrWithDefaultRealm()
> >>> auth.add_password(None, 'http://twitter.com/account/', username, password)
> >>> authHandler = urllib2.HTTPBasicAuthHandler(authHandler)
> >>> opener = urllib2.build_opener(authHandler)
> >>> opener.open(url, data)
>
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 387, in open
>     response = meth(req, response)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 498, in http_response
>     'http', request, response, code, msg, hdrs)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 419, in error
>     result = self._call_chain(*args)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 360, in _call_chain
>     result = func(*args)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 823, in http_error_401
>     url, req, headers)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 801, in http_error_auth_reqed
>     return self.retry_http_basic_auth(host, req, realm)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 811, in retry_http_basic_auth
>     return self.parent.open(req)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 387, in open
>     response = meth(req, response)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 498, in http_response
>     'http', request, response, code, msg, hdrs)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 425, in error
>     return self._call_chain(*args)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 360, in _call_chain
>     result = func(*args)
>   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> python2.5/urllib2.py", line 506, in http_error_default
>     raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
> urllib2.HTTPError: HTTP Error 500: Internal Server Error
>
> >>> try:
>
> ...   opener.open(url, data)
> ... except IOError, e:
> ...   print e.msg
> ...   print e.message
> ...   print e.headers
> ...   print e.info
> ...   print e.code
> ...   print e.filename
> ...   print e.hdrs
> ...
> Internal Server Error
>
> Date: Fri, 20 Feb 2009 23:33:23 GMT
> Server: hi
> Last-Modified: Fri, 20 Feb 2009 23:33:23 GMT
> Status: 500 Internal Server Error
> Pragma: no-cache
> Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-
> check=0
> Content-Type: text/html; charset=utf-8
> Content-Length: 4491
> Expires: Tue, 31 Mar 1981 05:00:00 GMT
> X-Revision: f6f5cf9a6a6126d6bcbde0d04f0484fa2e41de04
> X-Transaction: 1235172803-94142-20328
> Set-Cookie: lang=en; path=/
> Set-Cookie: lang=en; path=/
> Set-Cookie:
> _twitter_sess=BAh7CToTcGFzc3dvcmRfdG9rZW4iLWI4NzlhMDY4NzExNjU3Mzg4NzgzYTJi
> %250ANmNhYzQ0ODJhZjFjN2ExYzg6CXVzZXJpBJVMGAE6B2lkIiU3OTIyMTIyYzIy
> %250AZWZjYTJiNzU2MDAzNzNhNjFiN2M0NiIKZmxhc2hJQzonQWN0aW9uQ29udHJv
> %250AbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--
> f3377a9ca3b85f32ccc0d06a6293d95cbc16245d; domain=.twitter.com; path=/
> Vary: Accept-Encoding
> Connection: close
>
> <bound method HTTPError.info of HTTPError()>
> 500http://twitter.com/account/update_profile_background_image.json
> Date: Fri, 20 Feb 2009 23:33:23 GMT
> Server: hi
> Last-Modified: Fri, 20 Feb 2009 23:33:23 GMT
> Status: 500 Internal Server Error
> Pragma: no-cache
> Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-
> check=0
> Content-Type: text/html; charset=utf-8
> Content-Length: 4491
> Expires: Tue, 31 Mar 1981 05:00:00 GMT
> X-Revision: f6f5cf9a6a6126d6bcbde0d04f0484fa2e41de04
> X-Transaction: 1235172803-94142-20328
> Set-Cookie: lang=en; path=/
> Set-Cookie: lang=en; path=/
> Set-Cookie:
> _twitter_sess=BAh7CToTcGFzc3dvcmRfdG9rZW4iLWI4NzlhMDY4NzExNjU3Mzg4NzgzYTJi
> %250ANmNhYzQ0ODJhZjFjN2ExYzg6CXVzZXJpBJVMGAE6B2lkIiU3OTIyMTIyYzIy
> %250AZWZjYTJiNzU2MDAzNzNhNjFiN2M0NiIKZmxhc2hJQzonQWN0aW9uQ29udHJv
> %250AbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%253D%253D--
> f3377a9ca3b85f32ccc0d06a6293d95cbc16245d; domain=.twitter.com; path=/
> Vary: Accept-Encoding
> Connection: close
>
> thanks!
> lucy.

Reply via email to