독자가 기본적으로 오토핫키의 이해하고 사용한다는 가정하에 작성했습니다. 아래는 따로 설명하지 않습니다.

  • ㅡ If 조건식
  • ㅡ 익스프레션 변수에 대한 이해
  • ㅡ IfInString, MsgBox 명령어
  • ㅡ 함수에 대한 이해

 

파싱이란, 특정 변수에서 문자열을 추출해는것을 의미하는데요.

배포하는 프로그램에서 실시간 공지사항이나, 최신버전의 업데이트알림이 필요할떄가 있습니다. 이런 경우에 웹상의 정보를 파싱하면 되겠죠

 

파싱을 하기위해서는 먼저, 웹의 데이터를 받아와야하는데 일반적인 방법으로는

UrlDownloadToFile 함수로 웹페이지를 다운받거나, WinHttp로 웹페이지 텍스트를 변수로 저장하는데요

혹은 윈도우 API함수를 사용해 웹페이지를 메모리로 읽어올수도 있습니다.

여기에서는 윈도우 API를 사용하여 웹페이지를 메모리로 읽는 방법을 알아보도록 하겠습니다.

가장 빠르고, UrlDownToFile처럼 파일이 남지도 않습니다.

 

사실 파싱을 위한 가장 강력한 방법은 ActiveX로 HTML파일을 각 파트별로 읽어오는 방식입니다

파싱명령어나 정규식을 쓸 필요없이 페이지 정보를 가져오는 것이 가능하죠.

하지만 이번 글에서는 문자열을 추출하기위한 파싱에 대해서만 적고, ActiveX 파싱은 나중에 따로 작성하도록 하겠습니다.

 

필요 라이브러리

 

ReadURL(URL, encoding = "utf-8") {
 static a := "AutoHotkey/" A_AhkVersion
 if (!DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
  return 0
 c := s := 0, o := ""
 if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
 {
  while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s > 0)
  {
   VarSetCapacity(b, s, 0)
   DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
   o .= StrGet(&b, r >> (encoding = "utf-16" || encoding = "cp1200"), encoding)
  }
  DllCall("wininet\InternetCloseHandle", "ptr", f)
 }
 DllCall("wininet\InternetCloseHandle", "ptr", h)
 return o

 

ReadURL.ahk

 

알고리즘

 

1. 프로그램을 실행하면, 웹 주소로 접속해 페이지정보(블로그 글, 개인 호스팅 등)을 읽어온다

2. 정보를 비교/분석후 다음으로 진행

 

아래 예제 코드에서 사용하는 주소는 저의 GitHub 주소를 사용합니다. 여기를 클릭해 웹페이지 정보를 확인해보세요

웹페이지에는 '안녕하세요' 라는 문자열이 있네요

 

#include ReadURL.ahk             ; 라이브러리 파일을 불러온다, /Lib 폴더에 라이브러리를 저장했다면 생략가능

URL := "https://raw.githubusercontent.com/Visionary1/-/master/README.md"                        ; URL라는 변수에 웹 주소 저장
Result := ReadURL(URL)                                 ; Result 라는 변수에 웹 주소를 읽어온 결과값을 저장 (안녕하세요 가 저장되겠네요)
MsgBox % Result                                          ; Result 변수 결과 출력

 

예제1.ahk

 

적용

 

*위 예제에서 사용한것처럼 주소를 GitHub의 Raw페이지를 이용한다면 HTML의 정보에는 텍스트뿐이라서 파싱이 정말로 쉬운데

개인블로그(네이버,티스토리 등) 등의 개인홈페이지를 사용한다면, HTML에는 많은 정보가 들어 있어 원하는 부분만 따로 잘라내야합니다. 따라서, 깃허브를 사용하실줄 안다면 사용하시는걸 적극 추천합니다.

 

이제 페이지정보를 읽어오는것은 문제가 없군요,

이제 웹페이지 정보를 나눠서 원하는 값만 추출하는, 파싱을 배워보도록 하겠습니다.

 

오토핫키에는 String 관련 명령어가있지만 웹페이지(HTML)에서 문자열 추출에는 적절하지 않습니다.

간결한 코드로 파싱이 가능한 정규식 RegExMatch 에 비해서 너무나 긴 코드를 요구하기 때문이죠.

 

단순히 서버온,오프 체크만 한다면야 단순히 IfinString 만으로도 체크가 가능하지만,

버전체크, 구버전일시 자동으로 새버전 다운로드주소로 이동하는 등의 작업을 하고싶다면 정규식을 사용해야 합니다.

파싱을 위한 정규식, RegExMatch 의 구문은 아래와 같습니다.

 

RegExMatch(읽어올변수,"제거할 앞 문자열(.*?)제거할 뒷 문자열",추출값변수)

 

주의하실점은 추출값을 표현할때는 추출값변수에 1을 붙여야합니다.

아래의 예를 확인하세요.

 

읽어올변수 :="제거할 앞 문자열/이 부분이 추출됨/제거할 뒷 문자열"

RegExMatch(읽어올변수,"제거할 앞 문자열(.*?)제거할 뒷 문자열",추출값변수)
MsgBox % 추출값변수1

 

예제2.ahk

 

결과는 예상가능하듯 아래 사진과 같습니다.

 

 

이제 더 나아가 웹페이지를 메모리로 읽은다음 정보를 파싱해볼까요?

예를 위해 제 블로그 글을 파싱해보겠습니다. http://knowledgeisfree.tistory.com/1

 

 

 

시각적으로 보이는 페이지는 위 사진과 같은데, HTML은 아래 사진과 같이 복잡합니다.

 

 

이와 같은 페이지에서 ProgramVersion에서 2.6 을

Announce 에서 "이제 네이버에서 제 블로그 검색이되요!" 등을 어떻게 파싱하는지 아래 예제를 확인하세요.

 

#inclue ReadURL.ahk

URL := "http://knowledgeisfree.tistory.com/1"
Version := 2.5

Address := ReadURL(URL)
IfInString, Address, Server/is/Online ;서버가 Online 상태인지 확인한다
{
    RegExMatch(Address,"@ProgramVersion/(.*?)@",Latest)
    RegExMatch(Address,"@Announce/(.*?)@",Notice)
    if (Latest1 > Version)
        MsgBox, 4164, , % "최신버전 " Latest1 "이 존재합니다`n다운받으시겠어요?"
        IfMsgBox, Yes
        {

RegExMatch(Address,"@Update/(.*?)@",Patch)
Run, %Patch1%

 }

MsgBox, % Notice1
}

 

예제3.ahk

  1. EmP 2015.03.15 11:43 신고

    강좌 잘 보고 있읍니다. 감사합니다.

  2. 몰래온 손님 2015.03.26 17:32 신고

    아이고 몇달을 찾다가 못찾은 것들을 다 찾았네요 감사드립니다...

    앞으로도 좋은 강좌 기대하겠습니다..

    늘 건강하시고 좋은일 많이 생기길 ~~~ 바랍니다 ^^

  3. 몰래온 손님 2015.03.26 17:36 신고

    아참 그런데 " 같은 특수문자가 있으면 `" 해도 안되던데.. 오토핫키에서 어떻게 정규식을 표현해야하나요?
    <span class="title_num">1-1 / 1건</span>
    예를 들면 저 사이에 1건을 가져와야하는데. .. 쌍따옴표가.. 있어서... 해결을 못하고 있네요..ㅠㅠ

    • BlogIcon 예지력 2015.03.26 21:03 신고

      따옴표는 /C 로 처리합니다

    • 몰라무서워 2015.11.09 18:06 신고

      댓글쓰는데 왜 금칙어가 있다면서 차단됐다고 나올까요?

    • 몰라무서워 2015.11.09 18:07 신고

      \C보다 따옴표 두개( "" )가 더 정확하게 작동되는거 같습니다.

  4. 오토핫키배움이 2015.03.29 14:33 신고

    예제가 다운후 바로실행하면 안돼는게 정상인가요???

    컴파일하고 관리자로 했는데도 static a := "AutoHotkey/" A_AhkVersion 에서 오류가나네요

    • BlogIcon 예지력 2015.03.29 20:59 신고

      제가 작성하는 오토핫키 환경은 오토핫키 L 유니코드 32비트 버전입니다. 베이직이시라면 사용이 안되실꺼에요.

  5. 오토핫키배움이 2015.03.30 14:52 신고

    버전 업되니 잘되네요 ^^

    한가지 질문드립니다.

    RegExMatch( R e s u l t , f u s i o n _ 3 " ( . * ? ) > < a h r e f = " 네 이 버 블 로 그 주 소 , a )

    를 하고 싶은데 " 때문인지 잘 안돼네요. 어떻게 해야하나요?

    금칙어때문에 띄엉쓰기했습니다.

  6. 질문 2015.04.01 21:34 신고

    혹시 오토핫키에 이미치처럼 일정텍스트를 찾아서 좌표를 알수있는방법은 없나요?

    글씨체가 변경되도 그곳을 찾을수있도록이요~

    • BlogIcon 예지력 2015.04.28 11:30 신고

      웹이라면 파싱으로 가능한데, 단순 이미지라면 힘들어요
      이미지를 사용한다면 아주 작은 부분을 캡쳐해서 해당부분을 이미지서치해야겠죠?

  7. 감사합니다 2015.04.27 18:16 신고

    예제3.ahk에서
    #inclue -> #Include로 수정해주세요

    • 감사합니다 2015.04.27 18:41 신고

      그리고 /C가 아니고 역슬래시C아닌가요?

      이건 질문인데요
      @ProgramVersion/2.6@
      @Server/is/Online@
      @Announce/3월 25일 어의 패치했습니다@
      @Update/http://knowledgeisfree.tistory.com/74@

      여기서
      Online@
      @Announce/
      추출하려고 하면 어떻게 하나요?

    • BlogIcon 예지력 2015.04.28 11:39 신고

      주로 모바일로 확인하느라 pc글은 수정이 안되네요-_-;

      네 역슬래시에요. 댓글에서 w로 나오길래 /로 표기했는데 전달이 잘못된거 같군요 ㅠㅠ

      Online@ 나 @Announce/ 같은걸 파싱하시려면 정규식보다는
      StringTrimLeft, StringTrimRight 등과 같은 문자열의 왼쪽,오른쪽에서 몇칸만큼 짜르는 파싱명령어를 사용하시는게 좋을듯해요.
      위 명령어로 구글검색하시면 관련글 많이 찾아보실수있을겁니다.

  8. 인생은타이밍 2015.05.20 07:09 신고

    RegExMatch(Result, "<(.*?)>", what)
    만약에 파싱을 할때 위에 명령에서 <여기> 사이에 잇는것이 많을경우에 여러개를 가져올수 잇나요?
    예를 들어서 URL 안에 <1번> <2번> <3번> 이렇게 되어잇으면 위에 명령어를 사용하면 결과는 1번만 나올텐데 3개 모두 나오게 할수는 없나요?

    • BlogIcon 예지력 2015.05.22 23:26 신고

      처음 1번의 위치를 StringGetPos 로 찾고 자르는 과정이 필요해요.
      웹페이지라면 iwb2learner 로 html의 컨트롤값을 따서 하는게 편합니다. 관련글을 국내사이트에선 찾기힘들고 구글링으로 찾아보시면 해외포럼에 글들을 확인해보실수있을거에요

  9. 연습생 2015.08.31 14:20 신고

    죄송합니다 댓글로 연습해보았습니다.. 다 지웠습니다 감사합니다.

  10. 질문 2015.10.28 01:56 신고

    ReadURL나 UrlDownToFile 로 네이버 검색결과를 불러오려는데 검색제한 소스가 읽혀오는데 어떻게해야하나요?

    • BlogIcon 예지력 2015.10.28 07:51 신고

      네이버같은 경우에는 WinHttp를 이용해야 할 것 같네요

  11. 감사해요! 2015.11.03 22:42 신고

    강좌 올려주신게 도움이 많이 되고 있네요ㅎㅎ
    정말 감사합니다!

  12. 고맙습니다. 2015.11.30 19:07 신고

    강좌 정말 잘 보고 갑니다.
    도움이 정말 많이 되었습니다.

  13. 궁금해요 2016.03.16 12:58 신고

    ReqExMatch Function 때문인지
    Call to nonexistent Function 오류가 뜹니다. 해결방법이 없을까요?

    • BlogIcon 예지력 2016.05.04 16:19 신고

      아뇨 오토핫키 자체 내장 함수라 해당 오류는 나올 수가 없습니다
      함수명을 제대로 적었는지 확인해보세요

    • 음흠 2017.06.30 19:55 신고

      REQ가 아니라 REG

  14. 고래사과 2016.05.10 09:48 신고

    오토핫키에서 한글을 분석해서 "한글" 이라면 ㅎㅏㄴㄱㅡㄹ 로 파싱할 수 있나요?

    • 고래사과 2016.05.10 09:49 신고

      한글
      -> ㅎㅏㄴㄱㅡㄹ
      -> GKSRMF
      -> 키보드에서 쳐지는 것처럼 다시 keyCode로 글자입력

      이게 가능할까요?

+ Recent posts