Package: fanfou
Installation$sudopipinstallfanfouUsage>>>importfanfouStep 1:  AuthorizeThe module provides several ways to authorize, see more details onFanfou API OAuth.Way 1:>>>consumer={'key':'your key','secret':'your secret'}>>>client=fanfou.OAuth(consumer)# (1)(2)>>>request_token=client.request_token()>>>print(client.authorize_url)# browse the url to authorize>>>access_token=client.access_token()# done(1). The default callback is ‘http://localhost:8080’.(2). The default authorize_url is ‘m.fanfou.com/…’, you can pass auth_host=’fanfou.com’ to change it.Maybe you handling the callback elsewhere, create a new client and get access_token, like that:>>>client=fanfou.OAuth(consumer,request_token)>>>access_token=client.access_token()# done>>># or>>>client=fanfou.OAuth(consumer)>>>access_token=client.access_token(request_token)# doneWay 2:>>>consumer={'key':'your key','secret':'your secret'}>>>client=fanfou.OAuth(consumer,callback='oob')>>>request_token=client.request_token()>>>print(client.authorize_url)# browse the url and copy verifier_code>>>verifier_code='your verifier_code'>>>access_token=client.access_token(oauth_verifier=verifier_code)# doneYou can also create a new client and get access_token, like the way 1 above.Way 3:>>>consumer={'key':'your key','secret':'your secret'}>>>access_token={'key':'your key','secret':'your secret'}# access_token is what you saved before>>>client=fanfou.OAuth(consumer,access_token)# doneWay 4:>>>consumer={'key':'your key','secret':'your secret'}>>>client=fanfou.XAuth(consumer,'username','password')# done>>>access_token=client.access_token()# optional, if you want to save access_tokenUsing https:In the lastest edition, you can using https like that:>>>consumer={'key':'your key','secret':'your secret'}>>>client=fanfou.XAuth(consumer,'username','password',fake_https=True)The fake_https is available in all authorize ways.Step 2: Access APIWe assume that you’ve got client on Step 1, now you have two styles to access API.Style 1:>>>importjson>>>>>>resp=client.request('/statuses/home_timeline','GET')# resp is a HTTPResponse instance>>>print(resp.code)>>>data=json.loads(resp.read())# Python 3: data = json.loads(resp.read().decode('utf8'))>>>foritemindata:>>>print(item['text'])>>>>>>body={'status':'update status test 1'}>>>resp=client.request('/statuses/update','POST',body)>>>print(resp.code)Style 2:>>>importjson>>>>>>fanfou.bound(client)# note the line>>>>>>body={'page':2,'count':20,'mode':'lite'}>>>resp=client.statuses.home_timeline()>>>data=json.loads(resp.read())# Python 3: data = json.loads(resp.read().decode('utf8'))>>>foritemindata:>>>print(item['text'])>>>>>>body={'status':'update status test 2'}>>>resp=client.statuses.update(body)>>>print(resp.code)If you want to use style 2, you mustfanfou.bound(client)before use. They have the same effect, just two different styles.Just put all you want to request args to a dict (above is body), and then access a API. If you want to upload a photo, please seepack_image.
More API details onFanfou API Apicategory.What’s new in 0.2.x>>>fanfou.bound(client)>>>>>>resp=client.users.show()>>>data=resp.json()# equal: data = json.loads(resp.read().decode('utf8'))In this update, you can get a Python object directly by using resp.json().More detailspack_image(args, binary=None)On/account/update_profile_imageand/photos/uploadyou need to upload a image,pack_imagecan help you work easily.>>># update profile image>>>args={'image':'test.jpg','mode':'lite'}>>>body,headers=fanfou.pack_image(args)>>>resp=client.account.update_profile_image(body,headers)>>># or, resp = client.request('/account/update_profile_image', 'POST', body, headers)>>>print(resp.code)>>>>>># upload photo>>>args={'photo':'http://static.fanfou.com/img/fanfou.png','status':'upload online photo'}>>>body,headers=fanfou.pack_image(args)>>>resp=client.photos.upload(body,headers)>>>print(resp.code)Just put the filename in the args, then pack_image it, and then you can access API. The image file can be local or network file, pack_image will auto read it.Sometimes you want to provide binary bytes instead of filename when you’re writing a webapp, because the data you get from the form is binary. (likem.setq.me)>>>f=open('test.jpg')>>>args={'photo':'test.jpg','status':'upload local photo'}>>>body,headers=fanfou.pack_image(args,binary=f.read())# note the line>>>f.close()>>>resp=client.photos.upload(body,headers)>>>print(resp.code)print_api(‘plain’)The following code print all api_access_url that be allowed pass to client.request:>>>fanfou.print_api('plain')If you type the line and watch the results carefully, you will find two api_access_url have‘/:id’, they are:POST /favorites/destroyPOST /favorites/createBecause these API needidon it’s access_url, so we get id from body and replace :id, like that:>>>body={'id':'zFbiu4CsJrw'}>>>resp=client.request('/favorites/create/:id','POST',body)>>>print(resp.url)You will see resp.url ishttp://api.fanfou.com/favorites/create/zFbiu4CsJrw.json(Forget to mention that ‘.json’ will add to the access_url).print_api(‘bound’)>>>fanfou.print_api('bound')The line likefanfou.print_api(‘plain’)but it will print all available methods that like client.statuses.home_timeline.Your IDE (or editor) can autocomplete them afterfanfou.bound(client).auth classesThe __init__ method for auth classes is as follows:classOAuth(oauth_consumer, oauth_token=None, callback=None, auth_host=None, https=False, fake_https=False)classXAuth(oauth_consumer, username, password, https=False, fake_https=False)ThanksThankFanfouand thank you for tolerating  my poor English.If you have any questions, I am here@home2.