テキスト中のURLをまとめてダウンロード(wxPython)で

[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()


コメントを残す

メールアドレスが公開されることはありません。