Extra Form
라이선스 MIT

EasyMZKdown.exe 


안녕하세요? 좋은 주말 아침이네요 ^^


네모 님의 손목 부상 비보를 듣고 저도 예전에 엘보 부상으로 고생한 적이 있어서


키보드 구입을 차일피일 미루고 있다가 어제 부랴부랴 무접점 30g 키보드를 구입했는데요.


이 스크립트를 작성할 때 사용하면서 진작에 구입했으면 손목에 더 좋았을 것 같다는 생각이 드네요 :)


아직 제가 하루밖에 사용해보지 못해서 자세한 리뷰는 다음에 올리겠습니다.



이 스크립트는 MZK의 이용약관을 최대한 준수하며 다음과 같은 단계로 동작합니다.

(약관상 반드시 MZK는 바이러스 제로 카페에서 다운받아야 하며, 사용 전 홈페이지의 안내를 꼭 읽어야 합니다.)


오토핫키 에디터(SciTE4Autohotkey)가 한글 입력이 안 되고, 


제가 영어를 전혀 할 줄 몰라서 콩글리쉬로 작성된 점을 양해 부탁드립니다 ㅠㅠ



1. 스크립트를 실행하면 브라우저를 열고 기다리는 동안에 MZK 로고를 보여줍니다.




2.  바이러스 제로 카페의 MZK 다운로드 페이지를 보여주며 반드시 이용약관을 읽으라고 안내합니다.

(실제로 브라우저를 클릭하고 체크박스를 체크한 후에 Proceed 버튼을 클릭해야 진행할 수 있습니다.)




2-1. 만약 체크박스를 체크하지 않고 Proceed를 클릭하면 이용약관에 동의하지 않는 것으로 간주하여 경고창을 띄웁니다.




2-2. 브라우저의 내용을 보기 위해 브라우저를 클릭하면 내용을 읽기 편하도록 안내창을 반투명하게 바꿔줍니다.




2-3. 만약 X버튼을 눌러서 스크립트를 중지시키면 스크립트가 중단되었다는 메시지창을 띄워줍니다.

(이하의 모든 과정에서 이와 유사한 방식으로 작동합니다.)



2-4. 체크박스를 클릭하면 비로소 Procced 버튼을 눌러 계속 진행할 수 있습니다.




3. 만약 이전에 이 스크립트를 통해 MZK를 다운받은 적이 있다면, 같은 폴더에 다운받을 것인지를 확인합니다.




3-1. 만약 아니요(N)를 클릭하면, 어느 폴더에 다운로드할 것인지를 묻습니다.




3-2. 만약 이전에 다운받은 mzk.zip 파일이 이미 존재한다면, 파일을 덮어쓸 것인지 묻습니다.




4. mzk.zip 파일을 다운받으며 다운속도를 확인할 수 있는 프로그레스바를 보여줍니다.




5. 다운 완료 후 이전에 이 스크립트를 통해 MZK를 압축해제한 적이 있다면, 동일한 폴더에 압축을 해제할 것인지 묻습니다.




5-1. 만약 아니요(N)를 클릭하면, 어느 폴더에 압축을 해제할 것인지 묻습니다.




6. 압축을 네이티브로 해제합니다. 

(사실 파워쉘의 CopyHere를 이용하는 것이지만, 오토핫키 커뮤니티에서 네이티브로 칭하므로 그렇게 표기하겠습니다 ^^)




6-1. 만약 선택한 폴더에 이미 존재한다면 폴더 내 파일이 모두 삭제될 것이라고 경고창을 띄웁니다.




7. 압축이 완료되면 다운받은 압축파일(mzk.zip)을 삭제할 것인지 여부를 확인합니다.




8. 마지막으로 압축을 해제한 폴더를 열어주며 며칠 자 버전에서 업데이트 하였는지를 보여줍니다.

(MZK를 안전모드에서 실행할 것을 권장하기 때문에 직접 mzk.bat를 실행하지는 않습니다.)





허접하지만 제가 작성한 스크립트는 다음과 같습니다.


어디까지나 연습을 위해 작성한 것으로서 부족한 부분이 많을 것으로 생각됩니다 ㅠㅠ


오토핫키 공식 커뮤니티 등에서 참고한 부분은 출처를 표기했습니다.


저는 원래 7z.exe이나 bandizip.exe를 CMD 명령어로 실행하여 압축을 해제하려고 했는데


이런 방식으로 하면 다수의 파일을 덮어쓰는 과정에서 권한 문제가 발생하더군요 ㅜㅜ


운좋게 오토핫키 공식 커뮤니티에서 네이티브로 압축을 해제할 수 있는 간단명료한 스크립트를 발견하여 이를 사용하게 되었습니다.



; 1. 브라우저를 열고 splashimage로 바이러스 제로 카페 로고를 보여줍니다.
splashimage, mzk.png, b fs15, Wait for launching browser...
URL := "https://cafe.naver.com/ArticleRead.nhn?articleid=94376&clubid=14605461"
run, %URL%
sleep, 1500
hwnd_browser := WinExist("A")
sleep, 1500
splashimage, off
sleep, 300
 
 
; 2. 체크박스 창을 열고 브라우저의 활성화 여부 등을 확인합니다.
gosub, TMsgbox
sleep, 300
hwnd_msgbox := WinExist("A")
targetURL := Func_URL(URL)
Loop
{
    activewindow := WinExist("A")
    if (activewindow = hwnd_browser)
    {
        readbrowser = 1
        WinSet, Transparent, 100, Important
    }
    else
        WinSet, Transparent, OFF, Important        
    if (ok = 1) && (checkstatus = 1) && (readbrowser = 1)
    {
        Gui, Destroy
        break
    }
}
 
 
; 3. 다운받을 폴더를 확인합니다.
IfExist, easymzkdown.log
{
    FileReadLine, savefolder, easymzkdown.log, 1
    Msgbox, 4, Downloading...,
    (Ltrim
        Last time you saved mzk.file in the directory below.
        %savefolder%
        To save the file in the same directory, click Yes.
        To save the file in the other dircetory, click No.
    )
    ifMsgbox, No
    {
        gosub, Selectfolder1st
    }
}
else
   gosub, Selectfolder1st
 
 
savefile := savefolder "\mzk.zip"
if FileExist(savefile)
{
    Msgbox, 4, Warning!,
    (LTrim
        The file already exists.
        Do you want to overwrite it?
    )
    ifMsgBox, No
    {
        msgbox, Download is aborted.
        ExitApp
    }
    else ifMsgBox, Yes
    {
        filedelete, %savefile%
    }
}
 
 
; 4. 프로그레스바를 보여줍니다.
ToolTip, Downloading in progress..
Func_Downloader(targetURL, savefile)
ToolTip
 
 
; 5~7. 압축을 해제할 폴더를 확인하고 압축을 해제합니다.
IfExist, easymzkdown.log
{
    FileReadLine, extractfolder, easymzkdown.log, 2
    Msgbox, 4, Extracting...,
    (Ltrim
        Last time you extract mzk.file to the directory below.
        %extractfolder%
        To extract the file in the same directory, click Yes.
        To extract the file in the other dircetory, click No.
    )
    ifMsgbox, No
    {
        gosub, Selectfolder2nd
    }
}
else
{
   gosub, Selectfolder2nd
}
 
 
 
mzkfolder := extractfolder "mzk\"
if FileExist(mzkfolder)
{
    soundplay, *48
    Msgbox, 4, Warning!,
    (LTrim
        All existing file in this folder will be removed!
        Click YES to proceed!
    )
    ifMsgBox, Yes
    {
        foldertxt := extractfolder "*.txt"
        FileDelete, %foldertxt%
        FileRemoveDir, %mzkfolder%, 1
        gosub, Extract
        Run, %mzkfolder%
        sleep, 1000
    }
    else ifMsgbox, No
    {    
        msgbox, Extraction is aborted.
        ExitApp
    }
}
else
{
    gosub, Extract    
    Run, %mzkfolder%
}
 
 
; 8. 로그파일을 작성합니다.
formattime, date, , yyyy-M-d
IfExist, easymzkdown.log
{
    FileReadLine, lastdate, easymzkdown.log, 3
    Msgbox, 4096,,
    (LTrim
        Update is successfully complete
        from ver %lastdate% to ver %date%.
    )
}
else
{
    Msgbox, 4096,, Installation is successfully complete.
}
 
filedelete, easymzkdown.log
fileappend, %savefolder%`n, easymzkdown.log
fileappend, %extractfolder%`n, easymzkdown.log
fileappend, %date%, easymzkdown.log
 
fileinstall, mzk.png, %A_WorkingDir%, 1
ExitApp
 
 
 
; * Labels *
 
GuiClose:
msgbox, 4096,, Installation is aborted.
ExitApp
 
 
TMsgBox:
Gui, Add, Text, x15 y20 w400 h40 vconfirm, Please click your browser and read this article before installing MZK.
Gui, Add, CheckBox, x38 y40 w370 h50 vcheckstatus, I have read and agree to the terms and conditions of MZK.
Gui, Add, Button, x162 y95 w110 h30 gAccept, Proceed
Gui, Show, w425 h145, Important
WinSet, AlwaysOnTop, , Important
return
 
Accept:
Gui, submit, nohide
if (checkstatus <> 1)
    msgbox, 4096,, You must agree the terms and conditions in order to proceed.
if (checkstatus = 1)
    ok := 1
return
 
 
 
Selectfolder1st:
Gui +OwnDialogs  
FileSelectFolder, savefolder,, 3, Select a folder to save mzk.zip:
if (ErrorLevel = 1)
{
    msgbox, Download is aborted.
    ExitApp
}
return
 
 
 
Selectfolder2nd:
Gui +OwnDialogs  
FileSelectFolder, extractfolder,, 3, Select a folder to extract mzk.zip:
extractfolder := extractfolder "\"
if (ErrorLevel = 1)
{
    msgbox, Extraction is aborted.
    ExitApp
}
return
 
 
 
Extract:
Unzip(savefile, extractfolder)
sleep, 700
Msgbox, 4, ,
(LTrim
    Extracting is complete.
    If you want to delete mzk.zip that you saved in %savefolder%, Click YES.
)
ifMsgBox, Yes
{
    FileDelete, %savefile%  
}
return
 
 
 
; * Funcions *
; URL 확인 함수
Func_URL(articleURL)
{
Html := HTMLtoVar(articleURL, "utf-8")
    RegExMatch(Html, "<a target.*href..(.*).file", targetURL)
    targetURL := RegExReplace(targetURL, "<a.t.*href..", "")
    Return, targetURL
}
 
 
; 인코딩 관련 문제를 해결하는 함수
; https://autohotkey.com/board/topic/101686-objectresponsetext-error/ 참조
HTMLToVar(url, Encoding = "")
{
hObject:=ComObjCreate("WinHttp.WinHttpRequest.5.1")
hObject.Open("GET",url)
hObject.Send()
    hObject.WaitForResponse()
 
If Encoding {
oADO          := ComObjCreate("adodb.stream")
oADO.Type     := 1
oADO.Mode     := 3
oADO.Open()
oADO.Write( hObject.ResponseBody )
oADO.Position := 0
oADO.Type     := 2
oADO.Charset  := Encoding
return oADO.ReadText(), oADO.Close()
}
return hObject.ResponseText
}
 
 
; 파일을 다운받으며 프로그레시브바를 보여주는 함수
Func_Downloader(UrlToFile, SaveFileAs)
{    
    Req := ComObjCreate("WinHttp.WinHttpRequest.5.1")
    Req.Open("HEAD", UrlToFile)
    Req.Send()
   
    FinalSize := Req.GetResponseHeader("Content-Length")    
    Progress, m2 fs15 H70, , Downloading..., %UrlToFile%
    SetTimer, Bar, 100
   
    UrlDownloadToFile, %UrlToFile%, %SaveFileAs%
    Progress, Off
    SetTimer, Bar, Off
 
    Return
   
    Bar: ; https://autohotkey.com/board/topic/101007-super-simple-download-with-progress-bar/page-2
        CurSize := FileOpen(SaveFileAs, "r").Length
        CurSizeTick := A_TickCount
        Speed := Round((CurSize/1024-LastSize/1024)/((CurSizeTick-LastSizeTick)/1000)) . " Kb/s"
        LastSizeTick := CurSizeTick
        LastSize := FileOpen(SaveFileAs, "r").Length
        PctDone := Round(CurSize/FinalSize*100)
        Progress, %PctDone%, %PctDone%`% Done, Download speed : %Speed%, Downloading %SaveFileAs% (%PctDone%`%)
        Return
}
 
 
; Powershell을 이용하여 압축을 해제하는 함수
; https://autohotkey.com/board/topic/60706-native-zip-and-unzip-xpvista7-ahk-l/ 참조
Unzip(zipfle, path)
{
    SFSO := ComObjCreate("Scripting.FileSystemObject")
    If Not SFSO.FolderExists(path)
       SFSO.CreateFolder(path)
    ShAp  := ComObjCreate("Shell.Application")
    ToolTip, Unzipping in progress..
    ShAp.Namespace( path ).CopyHere( ShAp.Namespace( zipfle ).items, 16|256 )
    ToolTip
    Return
}



솔직히 이런 스크립트가 무슨 쓸모가 있겠냐고 생각이 들기도 하지만


1) 파일을 다운받을 폴더와 압축을 해제할 폴더를 일일이 선택하여 클릭하지 않아도 되고,


2) 자동으로 mzk.zip 파일을 삭제해주며,


3) MZK 개발자 입장에서는 카페의 안내글을 무조건 읽도록 유도한다는 점에서


그나마 실익을 찾아볼 수 있겠네요 :)



아울러 이 스크립트는 MZK의 이용약관을 최대한 준수하였으나 사전에 바이러스 제로 카페의 동의를 구하지는 못하였으므로,


개인적인 연습 용도로만 사용해주시면 감사하겠습니다.


그리고 이전에도 말씀드렸듯이 컴파일된 파일을 Virustotal에서 검사를 돌려보니 역시나 일부 백신에서 오진을 합니다.


오진을 하지 않더라도 일부 백신에서 파일 실행 여부 및 방화벽 허용 여부를 묻는 것을 확인하였습니다.





허접한 스크립트인데 읽어주셔서 감사합니다.


마지막으로 무료로 좋은 안티멀웨어 프로그램을 배포해주시는 MZK 제작자분들께 감사드립니다 :)


그럼 야외활동 하기 좋은 날씨인데 즐거운 주말 되세요 ^^



List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
38 코드 파이선 셸에서 실행하면...? 3 제르엘 2018.07.22 546
37 코드 [Python] 모 정부기관 사이트 파싱 후 PC 통신처럼 열람하고 싶은 게시글 번호를 입력하면 내용을 보여주는 소스 (허접) 4 이니스프리 2018.09.14 744
36 코드 [오토핫키] 특정 사이트에 대한 ping 테스트 결과를 실행시간과 함께 로그 파일로 저장하는 스크립트 2 이니스프리 2018.09.22 2054
35 코드 [오토핫키] 구글 드라이브의 공유링크를 이미지 호스팅을 위한 다이렉트 링크로 바꿔주는 스크립트 10 file 이니스프리 2018.09.25 1754
34 코드 [PHP] 기상청 중기예보를 캐러셀로 보여주는 위젯 (매우 허접합니다 ㅠㅠ) 10 file 이니스프리 2018.09.28 733
» 코드 [오토핫키] 브라우저를 열어 지난번과 동일한 폴더에 MZK를 다운받고 압축을 네이티브로 해제하는 스크립트 file 이니스프리 2018.10.20 920
32 코드 [PHP] 기상청 RSS 시간별 예보 위젯 - cache 적용(?) 9 file 이니스프리 2018.10.28 992
31 코드 [PHP] 그누보드 자동 게시글 작성 - 일본기상협회의 우리나라 날씨를 크롤링한 후 파파고로 번역하여 글 작성 4 file 이니스프리 2018.11.15 822
30 코드 [아미나] 게시글을 작성하면 ID와 IP로 필터링하여 자동으로 랜덤 댓글을 남기기 (+랜덤 포인트) 7 file 이니스프리 2018.11.18 805
29 코드 [Python] 텔레그램을 이용한 게시판 새 글 알림봇 7 이니스프리 2018.12.02 3981
28 코드 [PHP] 간단한 캐싱 클래스 3 title: 황금 서버 (30일)humit 2018.12.06 855
27 코드 [아미나] 출석 여부를 나타내는 메인화면 위젯 4 file 이니스프리 2018.12.15 771
26 코드 [아미나] 네이트 실시간 검색어 순위 위젯 (아미나 캐시 적용) 3 file 이니스프리 2018.12.18 1124
25 코드 [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다) 6 이니스프리 2018.12.20 7994
24 코드 [JS] http를 https로 리디렉션! 3 Hanam09 2018.12.30 840
23 코드 [JS]클라이언트에서 Ip를 얻어보자 2 Hanam09 2019.01.21 777
22 코드 [Python] 선택한 파일을 Dropbox API를 이용하여 업로드하고 공유링크를 받아서 이미지 호스팅 용도로 URL을 변환하기 1 file 이니스프리 2019.07.02 1166
21 코드 [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트 2 file 이니스프리 2019.07.03 6105
20 코드 [PHP/Javascript] 아미나에 자동으로 게시글을 생성하고 Ajax로 전송하여 결과를 표시하기 2 file 이니스프리 2019.07.09 926
19 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 file 이니스프리 2019.07.12 1474
Board Pagination Prev 1 2 3 4 Next
/ 4