仅仅是批量下载很容易的,这种东西嘛,要不要GUI都无所谓的。但是大家知道有很多MM是用WIndows的,而用WIndows的MM是不会用终端的,所以要我写一下GUI也无所谓。
但是由于大菠萝的缘故,我今天…卡卡,才把GUI写了。给…
但是问题就在这里,那就是,我折腾了一个小时也没成功把py2exe做的包运行起来。所以我没有做Windows的安装包咯…真是晕。哪位同学帮我做一下,感激不尽。
如果您使用Windows或者Mac,而且想用这个工具,在某人做出安装包前,请自行安装python和GTK和pyGTK。
如果您是MM我可以亲手教您如何安装….
如果您使用Linux就自己折腾吧。
源码下载: http://www.box.net/shared/ufsbulheb0
下面分别是Linux下和WIndows下的截图:
这是Linux下的:

下面是代码。但是你可能还是需要去上面下载glade文件。
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #!/usr/bin/python # -*- coding: utf-8 -*- # by shellex [www.sxnsx.com] import re import os import sys import gtk import gtk.glade import cookielib import urllib, urllib2 import threading class xn_photo_downloader(threading.Thread): def __init__(self): threading.Thread.__init__(self, name='downloader') self.cookies = cookielib.CookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies)) self.save_path = '/home/shellex/Desktop/xnphotosd/d' self.target_url = '' self.usr = '' self.pwd = '' self.page_cnt = 0 self.pbar = None def verify(self): verify_url = 'http://login.xiaonei.com/Login.do' verify_data= urllib.urlencode( {'email':self.usr, 'password': self.pwd, 'origURL':'http://www.xiaonei.com/SysHome.do' }) self.opener.open(verify_url, verify_data) print '[!]verify finish.' def go(self, target): rep = self.opener.open(target) return rep.read() def enmu_page_url(self): reg1 = '<div class="pager-bottom">[\s\S]*</ol'; m = re.compile(reg1).search(self.go(self.target_url)) if m == None or m.group().find('li') == -1: return [self.target_url] else: reg2 = '<li.*href="(.*?)"' params = re.findall(reg2, m.group()) params = params[:-1] base_url = 'http://photo.xiaonei.com/' return [ base_url + each for each in params] def enmu_photo_url(self, url): reg = '<td class="photoPan">\s*<a href="(.*)">' result = re.compile(reg).findall(self.go(url)) return result def download_photo(self, url): reg = '<div class="photo">\s*<img .* src="(.*?)" ' photo_url = re.compile(reg).search(self.go(url)).group(1) print '[!]download:' + photo_url buf = self.opener.open(photo_url, 'wb').read() head, tail = os.path.split(photo_url) file = open(self.save_path + '/' + tail, 'w+') file.write(buf) file.close() def run(self): self.verify() pages = self.enmu_page_url() self.page_cnt = len(pages) loop1, loop2 = 1, 1 for page_url in pages: print "[!]enter page:" + page_url photos = self.enmu_photo_url(page_url) self.photo_cnt = len(photos) loop2 = 1 for url in photos: progress_txt = 'Page %s/%s: Photo %s/%s' % (loop1, self.page_cnt, loop2, self.photo_cnt) self.download_photo(url) self.pbar.set_text(progress_txt) self.pbar.set_fraction((0.0 + loop2)/self.photo_cnt) loop2 += 1 loop1 += 1 self.pbar.set_text("Done!") class main_win(): def start_btn_clicked_cb(self, widget): downloader = xn_photo_downloader() downloader.save_path = self.ui.get_widget('brower_btn').get_current_folder() downloader.usr = self.ui.get_widget('usr_box').get_text() downloader.pwd = self.ui.get_widget('pwd_box').get_text() downloader.target_url = self.ui.get_widget('album_url_box').get_text() downloader.pbar = self.ui.get_widget('progressbar_main') downloader.setDaemon(True) downloader.start() def __init__(self): # load ui and connect signals self.ui = gtk.glade.XML('ui.glade') self.ui.signal_autoconnect(self) self.win = self.ui.get_widget('main_win') self.win.show() self.win.connect("destroy", gtk.main_quit) self.ui.get_widget('exit_btn').connect("clicked", gtk.main_quit) try: gtk.main() except: print "Shit. A fucking exception caught. Dying a death." sys.exit(1) if __name__ == '__main__': gtk.gdk.threads_init() mw = main_win() |
完了。忘记说了,本Code以GPLv2协议发放。















有 20 个流言 关于 “Python+GTK校内相册下载工具。”
August 18th, 2008 at 1:27 pm
嘿嘿,100行啊。
你小子做这个动机不纯啊,哈哈。
Reply(回复)
August 18th, 2008 at 3:35 pm
[quote comment="363"]嘿嘿,100行啊。
你小子做这个动机不纯啊,哈哈。[/quote]
哪有哦,我纯洁得很呢。
Reply(回复)
August 24th, 2008 at 12:09 am
猫猫啊,未必一定 py2exe,
不然你每个程序都带一套独立的 python + gtk, 你服务的 mm 的电脑要爆掉啦~
反正这种程序都是要有网络才能用的,
不如做个包装,
运行时检查是否有 python、pyGtk,
没有就自动下载自动无提示安装 pyGtk 到系统
Reply(回复)
August 24th, 2008 at 11:27 pm
[quote comment="377"]猫猫啊,未必一定 py2exe,
不然你每个程序都带一套独立的 python + gtk, 你服务的 mm 的电脑要爆掉啦~
反正这种程序都是要有网络才能用的,
不如做个包装,
运行时检查是否有 python、pyGtk,
没有就自动下载自动无提示安装 pyGtk 到系统[/quote]
还得再写个Win32程序, 麻烦. 我用Fx插件搞定咯…
Reply(回复)
August 25th, 2008 at 8:01 pm
我想改成pyqt的……
郁闷了……想用QT4+C++做……可怎么也不会……
Reply(回复)
August 26th, 2008 at 11:14 am
[quote comment="380"]我想改成pyqt的……
郁闷了……想用QT4+C++做……可怎么也不会……[/quote]
代码都在…应该很容易吧..
Reply(回复)
September 1st, 2008 at 1:48 pm
pyqt4的改完了……打好包了……好大……10M…………
给人用去了……
C++的还是搞不定…………
Reply(回复)
September 1st, 2008 at 3:47 pm
[quote comment="394"]pyqt4的改完了……打好包了……好大……10M…………
给人用去了……
C++的还是搞不定…………[/quote]
看看上面山猫的留言吧。
Reply(回复)
September 2nd, 2008 at 9:46 am
看了……
但 有多少人会为一个软件而去装python和GUI的环境呢?
Reply(回复)
September 2nd, 2008 at 12:44 pm
楼上的,是第一次点击运行后,自动下载,自动安装,
对用户只提示是“正在系统更新/安全升级/优化你的系统/调优你的计算机”之类,
不主动告诉他们是在安装 PyGtk。
Reply(回复)
September 4th, 2008 at 10:25 am
加一块20多M……还什么都不告诉用户……
微软还提示装.net
不能连微软都不如啊……
用户有权知道干什么了……这太不负责任了吧…………
Reply(回复)
@白痴一个, 应该提示的吧,就像AIR运行的时候一样吧?如果没有安装会提示下载。。
Reply(回复)
September 4th, 2008 at 11:05 am
用户是傻瓜,
你不能告诉他额外的东西。
看现在的 google chrome_installer.exe
安装也是不用问任何多余问题的。
Reply(回复)
September 4th, 2008 at 11:08 am
那些多余的东西,你问了用户又怎么样,有哪个傻瓜会真的去看么,
还不是下意识使劲点击[下一步]、[确定]。
少一问方便一步。
亏某些人还说 win 下某些 XX 软件安装多方便,连续按回车就装好了,
也不想想这几十个回车有什么意义
Reply(回复)
September 4th, 2008 at 11:09 am
对了, PyGtk 20M 是解压缩后的,
7z 压缩就只有几M 了,
用 7z 做自解压程序很简单的
Reply(回复)
September 6th, 2008 at 11:00 am
嗯,就是这样子。
Reply(回复)
May 25th, 2009 at 9:23 pm
能像dropbox那样上传相片到校内相册吗?
Reply(回复)
@amoblin,
dropbox还能上传到校内? 。。。。
不能。只从校内提供了批量上传我就取消了这个功能
Reply(回复)
@shellex, 我不是说dropbox上传到校内。我是说能不能监视一个相片文件夹,然后上传此文件夹下的相片到校内?
“只从校内提供了批量上传我就取消了这个功能”是什么意思呢?
Reply(回复)
@amoblin,
哦。是这个意思哈。
当然可以。用inotify监视文件系统事件就可以了。当然啦,我这个很简单,木有这个功能。
>>至于这个 ““只从校内提供了批量上传我就取消了这个功能”是什么意思呢?”
貌似是我穿越了…我错了。