Аплет Gnome проверки баланса OptiNET

Всем привет.
Решился таки начать изучать python. Первое что пришло в голову - написать аплет для гнома, показывающий баланс в сети OptiNET.
Кому интересно, под катом исходник.
90% кода, реализующего аплет, взято отсюда =)
я же, практически, переписал только метод get_info.

Файл balanceApplet.py
#!/usr/bin/python
# coding=utf-8

import urllib, httplib, re, sys, os, gtk, gtk.gdk, pygtk, gnomeapplet, gnome

pygtk.require('2.0')

__USER__ = "mylogin"
__PASSWD__ = "mypasswd"
__TITLE__ = "Инет: "
balanceurl = "https://172.18.11.5/cgi-bin/clients/enter"

class BalanceApplet (gnomeapplet.Applet):

def __init__ (self, applet, iid):

self.applet = applet
self.applet.set_name('OptiNET Balance Applet')
self.hbox = gtk.HBox()
self.applet.add(self.hbox)
self.event = gtk.EventBox()
self.hbox.add(self.event)
self.info = gtk.Label()
self.event.add(self.info)
self.event.set_tooltip_text('Баланс для ' + __USER__)
self.event.connect('button-press-event', self.callback_button)
self.__init_popupmenu()
self.applet.connect('destroy', self.callback_destroy)
self.applet.show_all()
self.info.set_text(self.get_info())

def __init_popupmenu (self):

self.applet.setup_menu('''
<popup name='button3'>
<menuitem name='Open Item' verb='Open' stockid='gtk-open'/>
<menuitem name='About Item' verb='About' stockid='gtk-about'/>
</popup>''', [
('Open', self.callback_open),
('About', self.callback_about)
], None)

def get_info (self):
#Подготавливаем данные для авторизации
postdata = {"type_id":"30","login":__USER__,"passwd":__PASSWD__}
params = urllib.urlencode(postdata)

#Подключаемся и отправляем POST запрос
connection = httplib.HTTPSConnection("172.18.11.5:443")
connection.request("POST", "/cgi-bin/clients/main_redirect", params)
response = connection.getresponse()

#Читаем ответ
body = response.read()

#Ничего умнее не нашел как парсить регекспами урл редиректа =)
pattern = re.compile(r'URL\=(.+)\"\>')
redirurl = pattern.search(body).group(1)

#Редиректимся
connection.request("GET", "/cgi-bin/clients/" + redirurl)
response = connection.getresponse()
body = response.read()

#Парсим страницу, в надежде найти баланс =)
pattern = re.compile(r'color\=\"red\"\>\<b\>\&nbsp\;([0-9\.\-]+)')
balance = pattern.search(body).group(1)

connection.close()

balanceurl = "https://172.18.11.5/cgi-bin/clients/" + redirurl

return __TITLE__ + balance

def callback_button (self, widget, event):
if event.button == 1:
self.callback_open(self)

def callback_open (self, event, data=None):
'''Открываем в браузере по клику'''
#gnome.url_show (balanceurl)
self.info.set_text(self.get_info())

def callback_about (self, event, data=None):
'''Показываем стандартное окошко среды GNOME'''
os.system('gnome-about')

def callback_destroy (self, applet):
'''Уничтожаем объект'''
del self.applet

def applet_factory (applet, iid):

BalanceApplet(applet, iid)
return True

def main (args):

if len(sys.argv) == 2 and sys.argv[1] == 'run-in-window':

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title('It works!')
window.connect('destroy', gtk.main_quit)
applet = gnomeapplet.Applet()
applet_factory(applet, None)
applet.reparent(window)
window.show_all()
gtk.main()
sys.exit()

elif len(sys.argv) == 2 and sys.argv[1] == 'help':
'''Выводим хелп по параметрам'''
print '''
--run-in-window - run applet independent of gnome-panel
--help - show this message'''

else:

gnomeapplet.bonobo_factory('OAFIID:GNOME_BalanceApplet_Factory',
BalanceApplet.__gtype__,
'Balance Applet',
'1.0',
applet_factory)



if __name__ == '__main__':
main(sys.argv)

Не забываем дать право на исполнение
# chmod +x balanceApplet.py


Далее идет файл описывающий наш аплет
файл GNOME_BalanceAppletFactory.server
<oaf_info>
<oaf_server iid='OAFIID:GNOME_BalanceApplet_Factory' type='exe' location='/home/gustik/work/python/balanceApplet.py'>
<oaf_attribute name='repo_ids' type='stringv'>
<item value='IDL:Bonobo/GenericFactory:1.0' />
<item value='IDL:Bonobo/Unknown:1.0' />
</oaf_attribute>
<oaf_attribute name='name' type='string' value='OptiNET balance Applet' />
<oaf_attribute name='description' type='string' value='Show your balance for OptiNET' />
</oaf_server>

<oaf_server iid='OAFIID:GNOME_BalanceApplet' type='factory' location='OAFIID:GNOME_BalanceApplet_Factory'>
<oaf_attribute name='repo_ids' type='stringv'>
<item value='IDL:GNOME/Vertigo/PanelAppletShell:1.0' />
<item value='IDL:Bonobo/Control:1.0' />
<item value='IDL:Bonobo/Unknown:1.0' />
</oaf_attribute>
<oaf_attribute name='name' type='string' value='OptiNET balance Applet' />
<oaf_attribute name='name-ru' type='string' value='Апплет баланса OptiNET' />
<oaf_attribute name='description' type='string' value='Show your balance for OptiNET' />
<oaf_attribute name='description-ru' type='string' value='Отображает ваш баланс в сети OptiNET' />
<oaf_attribute name='panel:category' type='string' value='Utility' />
<oaf_attribute name='panel:icon' type='string' value='computer.png' />
</oaf_server>
</oaf_info>

не забудьте поменять location на свой путь, где лежит balanceApplet.py
Файл GNOME_BalanceAppletFactory.server нужно скопировать в /usr/lib/bonobo/servers/

Для тестирование аплет можно запускать с параметром --run-in-window
#/path/to/applet/alanceApplet.py --run-in-window

Тогда аплет откроется в отдельной окошке.
  • 31 октября 2010, 14:35
  • Gustik
  • просмотров: ~2952
  • рейтинг: ?

Комментарии (5)

Вы - anonymous, войти ?

можно использовать bbcode-теги
[b]жирный текст[/b]
[i]курсив[/i]
[u]underline[/u]
[s]зачеркнутый текст[/s]
[size=20px]размер шрифта[/size]
всякие изменения текста
[left][/left]
[right][/right]
[center][/center]
позиционирование элементов: картинки, текст и т.д
[url][/url]
[email][/email]
внутри тега [url] помещайте ссылки, а внутри [email] адрес электронной почты;
так же [url] можно использовать в виде:
[url=http://example.com]пример[/url],
[url=http://test.ru][img]http://flickr.com/givemeimg.png[/img][/url]
[code][/code]
[quote][/quote]
внутри тега [code] можно помещать программный код (подстветка попытается включиться автоматически); для выделения цитат используйте [quote]
также можно напрямую указать язык [code=cpp]int i;[/code]
[list][/list]
создаем списки, каждый элемент пишется после [*].

Можно указывать маркер - [list=marker].
возможные маркеры 1(decimal), i(lower-roman), I(upper-roman), a(lower-alpha), A(upper-alpha). Примеры:

[list][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=1][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[list=A][*]1 элемент[*]2 элемент[*]3 элемент[/list]
[table][/table]
оформляем таблицу, используя внутренние теги [tr] и [td].
[tr] - строка, [td] - поле в строке,
[table=100%] - можно задавать ширину в процентах, по-умолчанию ширина 100%
[td=2] - можно задавать сколько столбцов входит в это поле. Пример:

[table=50%][tr][td]столбец 1[/td][td]столбец 2[/td][/tr][tr][td]значение 1[/td][td]значение 2[/td][/tr][tr][td=2]сразу 2 столбца[/td][/tr][/table]
[img][/img]
тег для вставки фото или картинок, мы любим картинки. Примеры использования:

[img]http://ya.ru/logo.png[/img],
[img=100x100px]http://ya.ru/logo.png[/img]
[img=fullimg.url]thumbimg.url[/img],
Пожалуйста загружайте картинки на наш сайт, либо вставляйте с бекбоновских ресурсов.
[video][/video]
Проигрывает видео, внутрь вставляем ссылки на видео, поддерживается Play.Ykt.Ru(нужно вставить ссылку на страницу с видео) и tv.ykt.ru(нужно вставить ссылку на адрес файла)