Revision: 47055
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at May 31, 2011 11:53 by alejandrombernardis
Initial Code
#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (c) 2011 The Octopus Apps Inc. # Licensed under the Apache License, Version 2.0 (the "License") # # Author: Alejandro M. Bernardis # Email: alejandro.m.bernardis at gmail.com # Created: May 10, 2011 7:18:55 PM # import os import urllib import urllib2 import datetime import tornado.auth import tornado.escape import tornado.web # from uuid import uuid1 from poster.encode import multipart_encode from poster.streaminghttp import register_openers class SimpleRequest(object): def __init__(self, path, token, args={}, post_args=None): self._path = path self._token = token self._args = args self._post_data = post_args def read(self): post_data = None if self._post_data is not None: self._post_data["access_token"] = self._token post_data = urllib.urlencode(self._post_data) else: self._args["access_token"] = self._token path = "https://graph.facebook.com%s?%s" % (self._path, urllib.urlencode(self._args)) request = urllib.urlopen(path, post_data) try: response = tornado.escape.json_decode(request.read()) except: return False, "-1" finally: request.close() if response.get("error"): return False, response.get("error") return True, response class BaseHandler(tornado.web.RequestHandler): def get_access_token(self): token = self.current_user["access_token"] if not token: return None return token def get_key(self, source, key, default=None): try: return source[key] except: return default class PostPhotoHandler(BaseHandler, tornado.auth.FacebookGraphMixin): @tornado.web.authenticated def get(self): self.render('fbupload.html') @tornado.web.authenticated def post(self): error = "-1" argument = "Filedata" if argument in self.request.files: success, data = SimpleRequest("/me/albums", self.get_access_token()).read() if success: album_id = None album_name = self.get_argument("album", self.settings["facebook_album_name"]) album_message = self.get_argument("album_message", "") for a in data["data"]: if a["name"] == album_name: album_id = str(a["id"]) if not album_id: success, data = SimpleRequest("/me/albums", self.get_access_token(), post_args={ "name": album_name, "message": album_message }).read() if success: album_id = str(data["id"]) else: error = "6" if album_id is not None: path = 'https://graph.facebook.com/%s/photos' % album_id file = self.request.files[argument][0] to_ext = str(os.path.splitext(file['filename'])[1]).lower() if to_ext in ['.jpg', '.jpge', '.png', '.gif']: to_name = uuid1().hex to_file = '%s/%s%s' % (self.settings["upload_path"], to_name, to_ext) try: f = open(to_file, 'w') f.write(file["body"]) except Exception: if f: f.close() error = "5" finally: if f: f.close() register_openers() datagen, headers = multipart_encode({ "access_token": self.get_access_token(), "message": self.get_argument("message", self.settings["facebook_title"]), "source": open(to_file) }) try: request = urllib2.Request(path, datagen, headers) error = tornado.escape.json_decode(urllib2.urlopen(request).read()) if error.get("id"): error = tornado.escape.json_encode({ 'fbid': error.get("id"), 'name': to_name, 'extension': to_ext, 'path': '/static/upload/', 'content-type': file["content_type"], 'url': '%s://%s/static/upload/%s%s' % ( self.request.protocol, self.request.host, to_name, to_ext ) }) except urllib2.HTTPError, urllib2.URLError: error = "4" else: error = "3" else: error = "2" else: error = "1" self.finish(str(error))
Initial URL
http://www.alejandrob.com.ar/
Initial Description
Initial Title
Py | Tornado Facebook Upload Photo
Initial Tags
Initial Language
Python