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

たまにプレーンテキスト中にttp://~みたく書かれてるurlをまとめてダウンロードしたいときがあるので、Pythonでダウンローダを書いてみました。

以前の記事 wxPythonでドラッグ&ドロップ+クリップボード
を殆ど流用。
ちゃんとしたモジュールにまとめて再利用しやすくしないとダメですねぇ

  • 起動すると小さいウィンドウが開きます。
    テキストエリアへ、urlを含んだログをコピペ、もしくはドラッグ&ドロップ
  • ダウンロードボタンを押してダウンロード開始。
    終了しても、特に何もしないのでわかりにくいです(すんません)
  • スクリプトファイルの置かれた直下にdownloadという名前のフォルダを掘って保存。
  • ファイル名はurlをurllib2.quoteでエンコードしたものをそのまま使用。
  • jpgとzipのみurlを抽出。 必要に応じて、適当に増やしてください
# -*- 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()
Tags:

Related posts

Tags:

Comments are closed.