CODE‎ > ‎API‎ > ‎

google picasa

利用python來操作一些picasa功能

import gdata.photos.service
import gdata.media
import gdata.geo

登入
gd_client = gdata.photos.service.PhotosService()
gd_client.email = email
gd_client.password = password
gd_client.source = 'exampleCo-exampleApp-1'
gd_client.ProgrammaticLogin()

取得相簿List
albums = gd_client.GetUserFeed(user=email)
for album in albums.entry:
  print 'title: %s, number of photos: %s, id: %s' % (album.title.text, album.numphotos.text, album.gphoto_id.text)

得到結果
title: CG, number of photos: 8, id: 5441695546238474225
.....

取得相片(只有檔名)
photos = gd_client.GetFeed('/data/feed/api/user/%s/albumid/%s?kind=photo' % (username, album.gphoto_id.text))
for photo in photos.entry:
  print 'Photo title:', photo.title.text

以上在 gdata文件上皆可查詢到,還包含上傳與刪除

因為Picasa的上傳介面越來越完善,實際上除非必要否則自己寫上傳功能的機會很少,為了管理的方便最好直接使用 picasa的同步功能。

在此順便做一個實際範例,因為google blogger以經可以開啟內建的燈箱功能(大概是配合Google+吧),所以直接取用內部燈箱效果來達到相簿效果,一來在blogger裡不必再傻傻的上傳圖片連結,二來隱藏起來的圖片暫不顯示也可以增進效率。

大概效果就像這篇文章一樣。雖然在文章內沒看到相片,但相片以經偷偷藏在文章裡,只要點擊相簿連結就可以看到完整相片。

但基本上還是得將要顯示的相片貼在文章裡,基本上在文章的HTML編輯裡大概是有這樣的一段程式
<a href=""><img border="0" height="120" width="160" src=""/>....相簿..</a>
<div id="div_choice" style="display:none" >

    <a href=""><img border="0" src=""/></a>

</div>

第一行是一個縮圖的相簿連結,然後在Div裡隱藏所有的相片,如果只是一兩張直接剪貼還好,若有幾十張或上百張,那保證你會哭,所以我們就靠程式來完成。

  • 首先把相片全同步到picasa的新相簿裡。
  • 再來複製新相簿的RSS連結路徑。
  • 然後執行 gAblum.py 就會幫我們產生完整HTML碼。
  • 把產生的HTML碼貼到blogger即可。

以下是gAblum.py內容
# -*- coding: utf-8 -*-
import feedparser, os

rsspath = "相簿的RSS"
items = feedparser.parse(rsspath)['items']

s = '<a href="%s"><img border="0"  height="120" width="160" src="%s"/>....ablum..</a>' % (items[0]['media_content'][0]['url'], items[0]['media_content'][0]['url'])

s = s + '<div id="div_choice" style="display:none" >'

for i in range(1, len(items)):
s = s + '<a href="' + items[i]['media_content'][0]['url'] + '"><img border="0" src="' + items[i]['media_content'][0]['url'] + '"/></a>'
    
s = s + '</div>'

print s

當然可以把這程式變形就可以當成下載相簿圖片的工具了
import feedparser, os
items = feedparser.parse("<remote picasa web rss feed>")['items']
for i in range(0, len(items)):
    os.system("wget -q %s" % items[i]['media_content'][0]['url'])

方法2
"""Download picasa webalbums given a URL."""

from xml.dom import minidom
import urllib2
import sys


def main(rssurl):
    print "Fetching the rss file..."
    response = urllib2.urlopen(rssurl)
    rssfile = response.read()
    response.close()

    print "Parsing the rss file..."
    xmldata = minidom.parseString(rssfile)
    tmp = xmldata.getElementsByTagName('media:content')
    for i in tmp:
        url = i.getAttribute('url')
        filename = url.split('/')[-1]
        print "Downloading", filename
        response = urllib2.urlopen(url)
        img = response.read()
        fh = open(filename, 'w')
        fh.write(img)
        fh.close()


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print "Usage: %s rss-url" % sys.argv[0]
    main(sys.argv[1])

Comments