Hi, I am newbie in the python, I am stuck into a small problem. Me and my friend are working on the gedit based Twitter plugin. http://code.google.com/p/gedit-twitter-plugin/
Now I want to add the tiny URL thing into this. I am using the bitly API for this. Its is already available in the python bitly.py http://code.google.com/p/python-bitly/ now i want to use this bitly.py into the main file ( importing the bitly.py to the twitter_gedit.py) . One thing more, bitly.py uses the django.utils so you can download that from http://www.djangoproject.com/download/ Thanks. its open
#!/usr/bin/python2.4 # # Copyright 2009 Empeeric LTD. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils import simplejson import urllib,urllib2 import urlparse import string BITLY_BASE_URL = "http://api.bit.ly/" BITLY_API_VERSION = "2.0.1" VERBS_PARAM = { 'shorten':'longUrl', 'expand':'shortUrl', 'info':'shortUrl', 'stats':'shortUrl', 'errors':'', } class BitlyError(Exception): '''Base class for bitly errors''' @property def message(self): '''Returns the first argument used to construct this error.''' return self.args[0] class Api(object): """ API class for bit.ly """ def __init__(self, login, apikey): self.login = vikashdhankar self.apikey = R_a55b050e658854f6846a01faa92f66ee self._urllib = urllib2 def shorten(self,longURL): """ Takes either: A long URL string and returns shortened URL string Or a list of long URL strings and returnes a list of shortened URL strings. """ if not isinstance(longURL, list): longURL = [longURL] for index,url in enumerate(longURL): if not url.startswith("http"): longURL[index] = "http://" + url request = self._getURL("shorten",longURL) result = self._fetchUrl(request) json = simplejson.loads(result) self._CheckForError(json) res = [] for item in json['results'].values(): if item['shortKeywordUrl'] == "": res.append(item['shortUrl']) else: res.append(item['shortKeywordUrl']) if len(res) == 1: return res[0] else: return res def expand(self,shortURL): """ Given a bit.ly url or hash, return long source url """ request = self._getURL("expand",shortURL) result = self._fetchUrl(request) json = simplejson.loads(result) self._CheckForError(json) return json['results'][string.split(shortURL, '/')[-1]]['longUrl'] def info(self,shortURL): """ Given a bit.ly url or hash, return information about that page, such as the long source url """ request = self._getURL("info",shortURL) result = self._fetchUrl(request) json = simplejson.loads(result) self._CheckForError(json) return json['results'][string.split(shortURL, '/')[-1]] def stats(self,shortURL): """ Given a bit.ly url or hash, return traffic and referrer data. """ request = self._getURL("stats",shortURL) result = self._fetchUrl(request) json = simplejson.loads(result) self._CheckForError(json) return Stats.NewFromJsonDict(json['results']) def errors(self): """ Get a list of bit.ly API error codes. """ request = self._getURL("errors","") result = self._fetchUrl(request) json = simplejson.loads(result) self._CheckForError(json) return json['results'] def setUrllib(self, urllib): '''Override the default urllib implementation. Args: urllib: an instance that supports the same API as the urllib2 module ''' self._urllib = urllib def _getURL(self,verb,paramVal): if not isinstance(paramVal, list): paramVal = [paramVal] params = [ ('version',BITLY_API_VERSION), ('format','json'), ('login',self.login), ('apiKey',self.apikey), ] verbParam = VERBS_PARAM[verb] if verbParam: for val in paramVal: params.append(( verbParam,val )) encoded_params = urllib.urlencode(params) return "%s%s?%s" % (BITLY_BASE_URL,verb,encoded_params) def _fetchUrl(self,url): '''Fetch a URL Args: url: The URL to retrieve Returns: A string containing the body of the response. ''' # Open and return the URL url_data = self._urllib.urlopen(url).read() return url_data def _CheckForError(self, data): """Raises a BitlyError if bitly returns an error message. Args: data: A python dict created from the bitly json response Raises: BitlyError wrapping the bitly error message if one exists. """ # bitly errors are relatively unlikely, so it is faster # to check first, rather than try and catch the exception if 'ERROR' in data or data['statusCode'] == 'ERROR': raise BitlyError, data['errorMessage'] for key in data['results']: if type(data['results']) is dict and type(data['results'][key]) is dict: if 'statusCode' in data['results'][key] and data['results'][key]['statusCode'] == 'ERROR': raise BitlyError, data['results'][key]['errorMessage'] class Stats(object): '''A class representing the Statistics returned by the bitly api. The Stats structure exposes the following properties: status.user_clicks # read only status.clicks # read only ''' def __init__(self,user_clicks=None,total_clicks=None): self.user_clicks = user_clicks self.total_clicks = total_clicks @staticmethod def NewFromJsonDict(data): '''Create a new instance based on a JSON dict. Args: data: A JSON dict, as converted from the JSON in the bitly API Returns: A bitly.Stats instance ''' return Stats(user_clicks=data.get('userClicks', None), total_clicks=data.get('clicks', None)) if __name__ == '__main__': testURL1="www.yahoo.com" testURL2="www.cnn.com" a=Api(login="pythonbitly",apikey="R_06871db6b7fd31a4242709acaf1b6648") short=a.shorten(testURL1) print "Short URL = %s" % short urlList=[testURL1,testURL2] shortList=a.shorten(urlList) print "Short URL list = %s" % shortList long=a.expand(short) print "Expanded URL = %s" % long info=a.info(short) print "Info: %s" % info stats=a.stats(short) print "User clicks %s, total clicks: %s" % (stats.user_clicks,stats.total_clicks) errors=a.errors() print "Errors: %s" % errors
from gettext import gettext as _ import gettext import gedit import gtk import gobject import pickle import pprint import twitter from bitly import Api class TwitterPluginHelper(object): def __init__(self, window): self._window = window # self._plugin = plugin self._build_logpanel(window) def update_ui(self): # Called whenever the window has been updated (active tab # changed, etc.) pass def _build_logpanel(self,window): panel = self._window.get_bottom_panel() self.box = gtk.VBox(False,0) self.messageLabel = gtk.Label("What are you doing ?") self.box2 = gtk.HBox(False,0) self.tweetLabel= gtk.Label("Last Message:") self.lastTweet = gtk.Label("") self.box.pack_start(self.messageLabel, False, False, 0) self.box2.pack_start(self.tweetLabel,False,False,0) self.box2.pack_start(self.lastTweet,False,False,0) self.box.pack_start(self.box2, False, False, 0) # self.box.pack_start(self.messageLabel, True, True, 0) self.box1 = gtk.HBox(False, 0) self.tweet = gtk.Entry() self.tweet.set_max_length(140) self.box1.pack_start(self.tweet, True, True, 0) self.button = gtk.Button("Tweet") self.button.connect("clicked", self._tweet, None) self.box1.pack_start(self.button, False, True, 0) image = gtk.Image() self.box.pack_start(self.box1, True, True, 0) panel.add_item(self.box, "Twitter", image) self.box.show_all() self.box1.show_all() def deactivate(self): pannel = self._window.get_bottom_panel() pannel.remove_item(self.box) def _tweet(self,widget,info): message = self.tweet.get_text() pkl_file = open('.gnome2/gedit/plugins/data.pkl', 'rb') data = pickle.load(pkl_file) pkl_file.close() username=data["username"] password=data["password"] api = twitter.Api(username,password) status = api.PostUpdate(message) self.tweet.set_text('') self.lastTweet.set_text(message) class TwitterPlugin(gedit.Plugin): WINDOW_DATA_KEY = "GeditPluginWindowData" def __init__(self): gedit.Plugin.__init__(self) def activate(self, window): helper = TwitterPluginHelper(window) window.set_data(self.WINDOW_DATA_KEY, helper) def deactivate(self, window): window.get_data(self.WINDOW_DATA_KEY).deactivate() window.set_data(self.WINDOW_DATA_KEY, None) def update_ui(self, window): window.get_data(self.WINDOW_DATA_KEY).update_ui() def is_configurable(self): return True def create_configure_dialog(self): pkl_file = open('.gnome2/gedit/plugins/data.pkl', 'rb') data = pickle.load(pkl_file) pkl_file.close() buttons=(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) dialog = gtk.Dialog("Twitter Plugin Configuration", None,0,buttons) usernameLabel = gtk.Label("Username") self.nameEntry = gtk.Entry() self.nameEntry.set_max_length(50) self.nameEntry.set_text(data["username"]) pwLabel = gtk.Label("Password") self.pwEntry = gtk.Entry() self.pwEntry.set_max_length(50) self.pwEntry.set_text(data["password"]) self.pwEntry.set_visibility(False) table = gtk.Table(2, 2, True) table.attach(usernameLabel, 0, 1, 0, 1) table.attach(self.nameEntry, 1, 2, 0, 1) table.attach(pwLabel, 0, 1, 1, 2) table.attach(self.pwEntry, 1, 2, 1, 2) self.savePassCheck = gtk.CheckButton("Remember Username/Password") self.label = gtk.Label("Enter your user name and password") self.label.set_selectable(True) self.label.set_line_wrap(True) dialog.vbox.pack_start(self.label, True, True, 10) dialog.vbox.pack_start(table, True, True, 0) dialog.vbox.pack_start(self.savePassCheck, True, True, 0) dialog.show_all() dialog.connect("response", self.on_response) self.dialog = dialog return dialog def on_response(self, dialog, response_id): if (response_id == gtk.RESPONSE_OK): #get the login details, etc: self.username = self.nameEntry.get_text() self.password = self.pwEntry.get_text() data = {'username': self.username, 'password': self.password} output = open('.gnome2/gedit/plugins/data.pkl', 'wb') pickle.dump(data, output) output.close() self.label.set_text("Saving Data...") elif (response_id == gtk.RESPONSE_CANCEL): self.dialog.destroy() else: self.label.set_text("How did that even happen?")
-- http://mail.python.org/mailman/listinfo/python-list