最近才换成ubuntu 12.04 。默认界面中有个广播功能,就是gwibber。试了一下,发现twitter,facebook,sina好像都有问题。于是就研究了下代码,python写的很好修改
关于twitter和facebook都是个https的问题,打开源代码把所有http换成https即可
关于sina就比较蛋疼了,因为Gwibber里的插件是俺Oauth1.0写的,现在sina换成Oauth2.0了,所以所有认证都要变,所幸api密钥还可以用
没仔细研究oauth那个库的用法,就直接用requests模拟oauth2.0的认证了,因为自己用,所以删了很多容错的代码
目前就写了下认证的,api调用的还没写,最近没时间,要赶紧训练了,不然就等虐吧……
文件位置:
/usr/share/gwibber/plugins/sina/gtk/sina
注:按ctrl+L就可以切换到路径编辑模式,Esc退出
from gi.repository import Gdk, Gtk, WebKit, Pango
from gi.repository.Gtk import Builder
import urllib, urllib2, json, urlparse, uuid,requests
from oauth import oauth
from gwibber.microblog.util import resources
from gwibber.microblog.util.keyring import get_from_keyring
import gettext
from gettext import gettext as _
if hasattr(gettext, 'bind_textdomain_codeset'):
gettext.bind_textdomain_codeset('gwibber','UTF-8')
gettext.textdomain('gwibber-service-sina')
import sina.utils
Gdk.threads_init()
sigmeth = oauth.OAuthSignatureMethod_HMAC_SHA1()
class AccountWidget(Gtk.VBox):
"""AccountWidget: A widget that provides a user interface for configuring sina accounts in Gwibber
"""
def __init__(self, account=None, dialog=None):
"""Creates the account pane for configuring Sina accounts"""
Gtk.VBox.__init__( self, False, 20 )
self.ui = Gtk.Builder()
self.ui.set_translation_domain ("gwibber")
self.ui.add_from_file (resources.get_ui_asset("gwibber-accounts-sina.ui"))
self.ui.connect_signals(self)
self.vbox_settings = self.ui.get_object("vbox_settings")
self.pack_start(self.vbox_settings, False, False, 0)
self.show_all()
self.account = account or {}
self.dialog = dialog
self.window = dialog.dialog
has_access_token = False
has_secret_key = False
if self.account.has_key("id"):
has_secret_key = get_from_keyring(self.account['id'], 'secret_token') is not None
try:
if self.account.has_key("access_token") and self.account.has_key("username") and has_secret_key and not self.dialog.condition:
self.ui.get_object("hbox_sina_auth").hide()
self.ui.get_object("sina_auth_done_label").set_label(_("%s has been authorized by Sina") % self.account["username"])
self.ui.get_object("hbox_sina_auth_done").show()
else:
self.ui.get_object("hbox_sina_auth_done").hide()
if self.dialog.ui:
self.dialog.ui.get_object('vbox_create').hide()
except:
self.ui.get_object("hbox_sina_auth_done").hide()
if self.dialog.ui:
self.dialog.ui.get_object("vbox_create").hide()
def on_sina_auth_clicked(self, widget, data=None):
self.winsize = self.window.get_size()
web = WebKit.WebView()
web.get_settings().set_property("enable-plugins", False)
web.get_settings().set_property("enable-developer-extras", False)
web.load_html_string(_("<p>Please wait...</p>"), "file:///")
self.consumer = oauth.OAuthConsumer(*sina.utils.get_sina_keys())
url ="https://api.weibo.com/oauth2/authorize?client_id=%s&response_type=code&redirect_uri=http://gwibber.com/0/auth.html"%self.consumer.key
web.load_uri(url)
web.set_size_request(550, 400)
web.connect("title-changed", self.on_sina_auth_title_change)
self.scroll = Gtk.ScrolledWindow()
self.scroll.add(web)
self.scroll.set_size_request(550, 400)
self.pack_start(self.scroll, True, True, 0)
self.show_all()
self.dialog.infobar.hide()
self.ui.get_object("vbox1").hide()
self.ui.get_object("vbox_advanced").hide()
self.dialog.infobar.set_message_type(Gtk.MessageType.INFO)
def on_sina_auth_title_change(self, web=None, title=None, data=None):
saved = False
if title.get_title() == "Success":
if hasattr(self.dialog, "infobar_content_area"):
for child in self.dialog.infobar_content_area.get_children(): child.destroy()
self.dialog.infobar_content_area = self.dialog.infobar.get_content_area()
self.dialog.infobar_content_area.show()
self.dialog.infobar.show()
url = web.get_main_frame().get_uri()
code = url.split("=")[1]
message_label = Gtk.Label(_("Verifying"))
message_label.set_use_markup(True)
message_label.set_ellipsize(Pango.EllipsizeMode.END)
self.dialog.infobar_content_area.add(message_label)
self.dialog.infobar.show_all()
self.scroll.destroy()
# self.ui.get_object("vbox1").show()
# self.ui.get_object("vbox_advanced").show()
request=requests.session()
data=request.post("https://api.weibo.com/oauth2/access_token?client_id=%s&client_secret=%s&grant_type=authorization_code&redirect_uri=http://gwibber.com/0/auth.html&code=%s"%(self.consumer.key,self.consumer.secret,code)).content
data = json.loads(data)
self.account["user_id"] = data["uid"]
self.account["access_token"] = data["access_token"]
s=request.get('https://api.weibo.com/2/users/show.json?access_token=%s&uid=%s'%(data['access_token'],data['uid']))
account_data=json.loads(s.content)
self.account['username']=account_data['screen_name'].encode('utf-8')
self.dialog.on_edit_account_save()
else:
self.dialog.infobar.set_message_type(Gtk.MessageType.ERROR)
message_label = Gtk.Label (_("Authorization failed. Please try again."))
message_label.set_use_markup(True)
message_label.set_ellipsize(Pango.EllipsizeMode.END)
self.dialog.infobar_content_area.add(message_label)
self.dialog.infobar.show_all()
self.ui.get_object("vbox1").show()
self.ui.get_object("vbox_advanced").show()
self.scroll.destroy()
self.window.resize(*self.winsize)
self.dialog.select_account ()