用GAE访问fanfou API,支持发图
2011 2 18 01:10 AM 0条评论 272次查看 0顶 0踩
分类:无 标签:Google App Engine, python
# -*- coding: utf-8 -*-
from django.utils import simplejson as json
from google.appengine.api import urlfetch
import urllib
import mimetypes
import base64
import random
_api_url = 'http://api.fanfou.com/'
_http_methods={
'GET':urlfetch.GET,
'POST':urlfetch.POST,
'HEAD':urlfetch.HEAD,
'PUT':urlfetch.PUT,
'DELETE':urlfetch.DELETE
}
def _generate_boundary(length=16):
s = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_'
a = []
for i in range(length):
a.append(random.choice(s))
return ''.join(a)
def _get_content_type(filename):
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
def _encode_multipart_formdata(fields, files=[]):
"""
fields is a sequence of (name, value) elements for regular form fields.
files is a sequence of (name, filename, value) elements for data to be uploaded as files
Return (boundary, body)
"""
boundary = _generate_boundary()
crlf = '\r\n'
l = []
for k, v in fields:
l.append('--' + boundary)
l.append('Content-Disposition: form-data; name="%s"' % k)
l.append('')
l.append(str(v))
for (k, f, v) in files:
l.append('--' + boundary)
l.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (k, f))
l.append('Content-Type: %s' % _get_content_type(f))
l.append('')
l.append(str(v))
l.append('--' + boundary + '--')
l.append('')
body = crlf.join(l)
return boundary, body
class Fanfou:
def __init__(self, username, password):
self.username=username
self.password=password
self.http_status=0
self.http_headers={}
self.http_body=''
def _fetch(self, method, url, params={}, headers={}, files=None):
payload=None
if method.upper() in ['POST','PUT']:
if files and type(files) == list:
boundary, payload = _encode_multipart_formdata(params.items(), files)
headers['Content-Type']='multipart/form-data; boundary=%s' % boundary
else:
payload=urllib.urlencode(params)
res=urlfetch.fetch(url, payload, _http_methods[method.upper()], headers)
self.http_status=res.status_code
self.http_headers=res.headers
self.http_body=res.content
return res.content
def api_call(self, http_method, api_method, params={}, files=None):
raw_content=self._fetch(
http_method,
''.join([_api_url,api_method,'.json']),
params,
{'Authorization':'Basic %s' % base64.b64encode('%s:%s' % (self.username, self.password))},
files
)
return json.loads(raw_content)用法:
from fanfou import Fanfou
fanfou=Fanfou('name','pass')
#时间线
fanfou.api_call('GET', 'statuses/public_timeline')
#传图
fanfou.api_call('POST', 'photos/upload', {'status':'test...'}, files=[('photo','aaa.jpg', photo_data )]) More