#!/usr/bin/env python # # Copyright (c) 2012 Raul Gutierrez S. - rgs@itevenworks.net # Copyright (c) 2013 Alan Aguiar alanjas@hotmail.com #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal #in the Software without restriction, including without limitation the rights #to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #copies of the Software, and to permit persons to whom the Software is #furnished to do so, subject to the following conditions: #The above copyright notice and this permission notice shall be included in #all copies or substantial portions of the Software. #THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #THE SOFTWARE. # NOTE: This is a plugin to enable uploading of Turtle Art projects to # Facebook. It currently works for the GTK3 version of Turtle Blocks and # only from the GNOME desktop. # USAGE: Download this file into the gnome_plugin directory; make sure the # filename is fb_plugin.py (Mediawiki capitalizes the first letter of files). # When you launch TA from the GNOME desktop by running turtleblocks.py # you should see a new menu, Facebook, which allows you to upload your # project. Please report any problems to rgs and walter. import pycurl import urlparse import gtk try: import webkit WEBKIT = True except ImportError: WEBKIT = False from plugin import Plugin from util.menubuilder import MenuBuilder, MENUBAR from gettext import gettext as _ class FbUploader(): UPLOAD_URL = "https://graph.facebook.com/me/photos?access_token=%s" def __init__(self, image_path, access_token): self._image_path = image_path self._access_token = access_token def doit(self): c = pycurl.Curl() c.setopt(c.POST, 1) c.setopt(c.URL, self._get_url()) c.setopt(c.HTTPPOST, self._get_params(c)) c.perform() print c.getinfo(c.HTTP_CODE) def _get_url(self): return self.UPLOAD_URL % (self._access_token) def _get_params(self, c): params = [] params.append(('source', (c.FORM_FILE, self._image_path))) return params class Fb_plugin(Plugin): APP_ID = "172917389475707" REDIRECT_URI = "http://www.sugarlabs.org" def __init__(self, parent): self._access_token = "" self._auth_win = None def get_menu(self): if _('Upload') in MENUBAR: menu, upload_menu = MENUBAR[_('Upload')] else: upload_menu = None menu = gtk.Menu() MenuBuilder.make_menu_item(menu, _('Facebook wall post'), self._post_menu_cb) if upload_menu is not None: return None # We don't have to add it since it already exists else: upload_menu = MenuBuilder.make_sub_menu(menu, _('Upload')) return upload_menu def set_tw(self, turtleart_window): self.tw = turtleart_window def enabled(self): return True def _post_menu_cb(self, widget): if not WEBKIT: self.tw.showlabel('status', 'install webkit: sudo yum install pywebkitgtk') print('webkit not installed: sudo yum install pywebkitgtk') return if self._access_token == "": self._grab_fb_app_token() return self._post_to_fb() def _grab_fb_app_token(self): url = self._get_auth_url() w = gtk.Window() sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.show() w.move(200, 200) w.set_size_request(800, 400) wkv = webkit.WebView() wkv.load_uri(url) wkv.grab_focus() wkv.connect('navigation-policy-decision-requested', self._nav_policy_cb) sw.add_with_viewport(wkv) w.add(sw) w.show_all() self._auth_win = w def _get_auth_url(self): url = "http://www.facebook.com/dialog/oauth?client_id=%s" % ( self.APP_ID) url += "&redirect_uri=%s" % (self.REDIRECT_URI) url += "&response_type=token&scope=publish_stream" return url def _nav_policy_cb(self, view, frame, req, action, param): uri = req.get_uri() if uri: url_o = urlparse.urlparse(uri) params = urlparse.parse_qs(url_o.fragment) if 'access_token' in params: self._access_token = params['access_token'][0] self._auth_win.hide() self._post_to_fb() def _post_to_fb(self): ta_file, image_file = self.tw.save_for_upload("ta fb") uploader = FbUploader(image_file, self._access_token) uploader.doit()