[pukiwiki]
たまにプレーンテキスト中にttp://~みたく書かれてるurlをまとめてダウンロードしたいときがあるので、Pythonでダウンローダを書いてみました。
[/pukiwiki]
[pukiwiki]
以前の記事 [[wxPythonでドラッグ&ドロップ+クリップボード:http://boxheadroom.com/2008/10/06/wxpython_dd_clipboad]]
を殆ど流用。
ちゃんとしたモジュールにまとめて再利用しやすくしないとダメですねぇ
-起動すると小さいウィンドウが開きます。
テキストエリアへ、urlを含んだログをコピペ、もしくはドラッグ&ドロップ
-ダウンロードボタンを押してダウンロード開始。
終了しても、特に何もしないのでわかりにくいです(すんません)
-スクリプトファイルの置かれた直下にdownloadという名前のフォルダを掘って保存。
-ファイル名はurlをurllib2.quoteでエンコードしたものをそのまま使用。
-jpgとzipのみurlを抽出。 必要に応じて、適当に増やしてください
[/pukiwiki]
# -*- coding: utf-8 -*-
#DropDownload.py
import os
import wx
import urllib2
import re
import time
import glob
class MyTextDropTarget(wx.TextDropTarget):
def __init__(self, WinObj):
wx.TextDropTarget.__init__(self)
self.WinObj = WinObj
def OnDropText(self, x, y, text):
self.WinObj.AppendText("\n")
self.WinObj.AppendText(text)
class MyApp(wx.PySimpleApp):
opener = urllib2.build_opener()
opener.addheaders = [("User-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)")]
def OnInit(self):
if not os.path.exists("download"):
os.mkdir("download")
Frm = wx.Frame(None, -1, "wxPython", size=(450, 150),pos=(850,700))
#うちの環境にあわせて座標を決め打ちしてあります。適当に直してください
#デスクトップサイズの取得などは勉強中。。。
self.Btn = wx.Button(Frm, -1, u"ダウンロード")
self.Btn.Bind(wx.EVT_BUTTON, self.OnButton)
self.TxtCtrTo = wx.TextCtrl(Frm, -1, u"", pos=(10,30),\
size=(430,70),\
style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_PROCESS_ENTER)
Frm.SetDropTarget(MyTextDropTarget(self.TxtCtrTo))
#Frm.SetTransparent(200)
Frm.Show()
return 1
def OnButton(self,event):
t=self.TxtCtrTo.GetValue()
# jpgとzipのみ。適当に増やしてください
#re.sub(r"(ttp://|\s)(?P[^:]*?\.(jpg|zip))\s",self.httpdownload,t)
re.sub(r"ttp://(?P[^:]*?\.(jpg|zip))\s",self.httpdownload,t)
#クリップボードへ
#生の文字列ではなく、wx.TextDataObjectへ変換する必要がある
self.TxtCtrTo.AppendText("\ndone\n\n")
def httpdownload(self,a):
u=a.groupdict()["url"]
uri="http://%s"%u
fname="download\\%s"%urllib2.quote(u,safe="")
if os.path.exists(fname):
#同名のファイルが存在し、且つ24時間以内にダウンロードしたものならスキップ
t=os.stat(fname)[-2]
dt=time.time()-t
if dt<(24*60*60):
return
l=fname.split(".")
ext=l[-1]
l.pop()
bd="".join(l)
#24時間以上経過した同名ファイルが存在したら、時刻文字列を付加
#必要ないときはreturn
idx=time.strftime("%Y%m%d%H%M%S",time.localtime()[:9])
fname="%s+%s.%s"%(bd,idx,ext)
print "*",fname
if os.path.exists(fname):
print "fname error"
return
print uri
op=self.opener.open(uri)
dat=op.read()
fp=open(fname,"wb")
fp.write(dat)
fp.close()
time.sleep(5)
app = MyApp()
app.MainLoop()