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.
