jungo 10.04.2011 23:49

СкриптыПолучаем данные со странички дропбокс с помощью python

Я использую xmonad без панелей/треев и тому подобных плюшек, которые лично мне не нужны для продуктивной работы. Как то раз понадобилось мониторить события, которые происходят на дропбоксе, в т.ч. в расшаренной с другими пользователями директории. Поэтому решил написать скрипт, который получал бы все произошедшие события и отрисовывал их на рабочем столе, прямо на обоине.

Вообще рабочий стол я вижу редко, поэтому цвет и содержимое обоев для меня не важно, соответственно есть две возможности:
1) либо создавать обоину монотонного цвета (например, под цвет темы, у меня Zenburn)
2) либо использовать любое готовое изображение

Для работы скрипта необходимы:
1) Python 2
2) feh
3) Аккаунт на www.dropbox.com

Вот сам скрипт:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from mechanize import Browser
from lxml.html import parse
from PIL import Image,ImageDraw,ImageFont
from subprocess import Popen

# login requisites
email = 'email'
passw = 'pass'
# font settings
font_type = '/home/jungo/.fonts/DroidSans.ttf'
font_size = 18
# screen settings
# initial position on screen
x = 10
y = 10
# distance between time and event text
time_text_distance = 190
# screen size
screen_size = (1680, 1050)
# output_image settings
output_image = '/tmp/wallpaper.png'
background_color = '#323932'
text_color = '#e0e0e0'
# number of events to output
total_events = 10

def get_events():
br = Browser()
br.open('https://www.dropbox.com/login')
login_form = <f for="for" f="f" in="in" br.forms="br.forms"><0>
login_form<'login_email'>=email
login_form<'login_password'>=passw
br.form = login_form
br.submit()

response = br.open('https://www.dropbox.com/events#events:false:' + str(total_events))
doc = parse(response).getroot()

# parse page and get result
# result = < event 1, time 1, event 2, time 2, ... >
output =

for event in doc.cssselect('td.note'):
output.append(event.text_content().strip())
return output

def draw_picture(text):
# create new image ...
#im = Image.new('RGB',screen_size, background_color)
# ... or open image
im = Image.open('/home/jungo/stuff/walls/space.jpg')
draw = ImageDraw.Draw(im)
font = ImageFont.truetype(font_type, font_size)
time_pos = <x>
text_pos = </x><x>
font_height = font_size + 6
for i in range(0, len(text), 2):
try:
text<i> = text</i><i>.decode('utf-8')
except UnicodeEncodeError:
pass
# draw text
draw.text(tuple(text_pos), text</i><i>, fill=text_color, font=font)
# draw time
draw.text(tuple(time_pos), text</i><i>, fill=text_color, font=font)
# change coordinates for next step
time_pos<1> += font_height
text_pos<1> += font_height

im.save(output_image, "PNG")

# create picture
draw_picture(get_events())
# set it as wallpaper
Popen('feh --bg-scale '+output_image, shell=True).communicate()</i></x></f>




Настройки располагаются в самом скрипте (мне так было удобнее). Данный скрипт показывает общий подход к задаче - в принципе, можно выдернуть абсолютно любую информацию с личной страницы и отобразить её, например в conky/xmobar/dzen2/etc.


Тэги: Dropbox PIL python
+ 5 -
Похожие Поделиться

IT.Tux.Droid 11.04.2011 02:54 #
Еще можно залогинится на Dropbox'e, перейти в настройки https://www.dropbox.com/account/settings отметить "Enable RSS feeds" и на странице https://www.dropbox.com/events кликнув по "Subscribe to this feed" получить RSS ссылку на Events для своего rss-агрегатора ;)

А если события все-же надо выводить на рабочий стол, то я порекомендовал бы функцию get_events() сделать вида:
def get_events():
data = urllib.urlopen("https://www.dropbox.com/циферки/циферки/циферки/events.xml").read()

db_date = re.findall('<pubDate>(.*)</pubDate>', data)
db_title = re.findall('(.*)<a href='.*' title=\".*\">(.*)</a>.', data)

db_event = <>
for i in range(len(db_date)):
db_event.append(<0>+db_title<1>, db_date>)
### db_event<0> = 'title'
### db_event<1> = 'date'

return db_event
Be happy! =)
knicefire 11.04.2011 09:19 #
в python все же не принято использовать конструкции типа
for i in range(len(db_date)): без особой на то нужды

ниже приведенный вариант более pythonic так сказать :):
for i in db_date:
db_event.append(i<0>+i<1>, i)
return db_event
IT.Tux.Droid 11.04.2011 11:42 #
ага pythonic, но в данном случае, range нужен еще для получения индексов из db_title (не только db_date) ;)
knicefire 11.04.2011 11:50 #
оу... прошу прощения, действительно не заметил что данные берутся из title

но в таком случае более pythonic код был бы похож на это:

for i, d in enumerate(db_date):
db_event.append(<0>+db_title<1>, d>)
return db_event

P.S. Не сочтите за наглость. Код отличается не значительно. Сколько программистов столько и подходов к программированию. :)
IT.Tux.Droid 11.04.2011 12:08 #
Код отличается не значительно.

да не, так действительно намного лучше выглядит :) спасибо ;)
Сколько программистов столько и подходов к программированию. :)

и это хорошо =)