VB(A)

[VB.Net] 포토갤러리 일괄 다운로더

당근쨈 2017. 3. 5. 18:01

금정구청 포토갤러리 일괄 다운로더


토끼같은 아이들의 사진을 한땀한땀 받다가 지친 영혼을 위해 만든 하찮지만 정성이 가득한 다운로드 매니저입니다.
금정구청 포토갤러리를 이용하시는 분들의 수고를 조금이나마 덜어드림을 희망합니다.


1. 금정구청 포토갤러리에 접속하여 위와 같은 페이지까지 접속합니다.



 2. 주소창을 복사하여 'Enter Photo Gallery URL' 에 붙여넣기를 한 후 '확인'을 누릅니다

주소가 정확하지 않으면 에러 납니다.


3. 사진을 저장할 폴더를 지정해줍니다.

4. 게이지가 움직이면서 다운로드가 시작됩니다. ▼


5. 기다립니다.


Imports System.Net
Imports System.ComponentModel
Imports System.Text.RegularExpressions
 
Public Class MainFrm
 
    Private WithEvents download As New WebClient
    Private i As Long
    Private SaveFolder As String
    Private CurrentFileNumber As Integer
 
    Private Sub btnAddressOk_Click(sender As Object, e As EventArgs) Handles btnAddressOk.Click
 
        Dim WinHttp As Object, Temp As String   '웹페이지 소스 파싱용 변수
        Dim Match As Match, Matches As MatchCollection  'URL 및 이미지 주소 파싱 정규식용 변수
        Const RegexOption As RegexOptions = RegexOptions.IgnoreCase '정규식 옵션(대소문자 구분 안함)
        Dim v() As String, j As Long    '사진 원본 주소를 담을 배열
        Const MainURL As String = "http://photo.geumjeong.go.kr/photoH/"    '사진 원본 주소 중복되는 부분
 
        'WebClient 헤더 지정(지정 안 하면 사진 다운로드 시 에러남)
        download.Headers.Add("user-agent""Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
 
        '포토갤러리 주소 확인 → 이상하면 프로그램 종료, 안 이상하면 Match 변수 초기화
        Match = Regex.Match(txtAddress.Text, "http:\/\/photo.geumjeong.go.kr\/photoDetail.asp\?photo_id", RegexOption)
 
        If Not Match.Success Then
            MsgBox(Prompt:="포토갤러리 주소를 확인하세요", Title:="Error", Buttons:=vbCritical)
            Exit Sub
 
        Else
            Match = Nothing
        End If
 
        '버튼 비활성화, 사진 저장할 폴더 지정
        btnAddressOk.Enabled = False
        Call GetFolderName()
 
        Try
 
            '포토갤러리 웹페이지 소스 파싱
            WinHttp = CreateObject("WinHttp.WinHttpRequest.5.1")
            With WinHttp
                .Open("GET", txtAddress.Text)
                .send
                .waitforresponse
                Temp = .responsetext
            End With
            WinHttp = Nothing
 
            '사진 제목 및 주소 추출 후 소스변수 초기화
            Match = Regex.Match(Temp, "제.*목:<\/td><td><font.+?>(.+?)<\/td>", RegexOption)
            Matches = Regex.Matches(Temp, "filepath=\\+(\w+)\\+&filename=(\w+.jpg)", RegexOption)
            Temp = vbNullString
 
            '레이블 값(사진제목, 저장폴더) 지정
            lblDownloading.Text = "Downloading " & Match.Groups(1).Value
            lblSavingTo.Text = "Saving To " & SaveFolder
 
            '사진 갯수만큼 재배열 후 사진원본주소를 배열에 삽입
            j = Matches.Count - 1
            ReDim v(j)
 
            For i = 0 To j
                With Matches(i)
                    v(i) = MainURL & .Groups(1).Value & "/" & .Groups(2).Value
                End With
            Next i
 
            '사진 다운로드 실행
            DownloadAllFiles(v, SaveFolder)
 
        Catch ex As Exception
            MsgBox("다운로드에 실패하였습니다." & vbLf & ex.Message, Buttons:=MsgBoxStyle.Critical, Title:="Error!!")
            Close()
        End Try
    End Sub

    Private Sub GetFolderName()
        '저장할 폴더 지정
        If FolderBrowserDialog1.ShowDialog() = DialogResult.OK Then
            SaveFolder = FolderBrowserDialog1.SelectedPath + "\"
        Else
            Exit Sub
        End If
    End Sub

    Private Async Sub DownloadAllFiles(ByVal FileNames As IEnumerable(Of String), SaveFolder As String)
 
        Dim SaveFileName As String
 
        For Each FileName In FileNames
 
            '로컬에 저장된 각 사진 개수(총 진행사항 파악 위한 변수)
            CurrentFileNumber += 1
 
            '로컬에 저장될 파일명
            With FileName
                SaveFileName = SaveFolder + .Substring(.LastIndexOf("/"))
            End With
 
            With download
                AddHandler .DownloadFileCompleted, AddressOf download_DownloadFileCompleted
                AddHandler .DownloadProgressChanged, AddressOf download_DownloadProgressChanged
                Await .DownloadFileTaskAsync(New Uri(FileName), SaveFileName)
            End With
        Next
 
    End Sub

    Private Sub download_DownloadProgressChanged(ByVal sender As ObjectByVal e As DownloadProgressChangedEventArgs) Handles download.DownloadProgressChanged
 
        Dim TotalPercent As Double = CurrentFileNumber / i * 100
 
        With e
            pbFile.Value = .ProgressPercentage
            If pbFile.Value > 1 Then pbFile.Value = .ProgressPercentage - 1
            lblFilePregress.Text = "Downloaded " & Math.Round(.BytesReceived / 10002& " KB / " & Math.Round(.TotalBytesToReceive / 10002& " KB (" & Math.Round(.ProgressPercentage, 2& " %)"
        End With
 
        pbTotal.Value = TotalPercent
        lblTotalDownload.Text = "Downloaded " & CurrentFileNumber & " / " & i & " (" & Math.Round(TotalPercent, 2& " %)"
 
    End Sub
    Private Sub download_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs) Handles download.DownloadFileCompleted
        If CurrentFileNumber = i Then
            MsgBox("다운로드가 완료되었습니다.", Buttons:=MsgBoxStyle.Information, Title:="Photo Gallery")
            Close()
        End If
    End Sub
End Class
 
cs



다운로드 프로그램입니다. 이걸 받아서 실행하시면 됩니다. ▼

PhotoGallery.exe


다운로드 프로그램 소스입니다. 굳이 받을 필요는 없습니다. 

WindowsApplication1.zip



◈ 업데이트2017.03.07. 아이콘 추가, 폴더명 자동생성 체크박스 추가