>> Edit article
이름
제목
패스워드
안녕하세요 레이옷입니다. 불현듯 바람이 불고, 결국 밤새서 하이텔의 게시판을 갈무리해서 각각을 파일로 저장하는 스크립트를 제작 해봤습니다. 흠. 서비스로 GPL을 명시해봤어용. :) 그리고, 나중에 까먹지 않기 위해서 expect 문법을 친절하게 코멘트해봤습니다. == <pre> #!/usr/bin/expect # # hitel-grabber.exp # Copyright (C) 2000 Reiot(reiot@hanmail.net), the Fallen Lord of MUDMANIA # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111- 1307, USA. # # # configuration # # expect 는 tcl 로 구현되었기 때문에, 당연히 tcl 문법을 사용해야 한다. # # assignment : set var val # set command "downall" # # telnet 을 사용해서 하이텔에 연결한다. # # spawn 을 사용해서 expect script 와 I/O 를 연결할 프로세스를 생성한다. # spawn telnet home.hitel.net # # 아이디를 입력한다. # # expect 는 spawn 된 프로세스로부터의 입력을 기다리는 expect script command 이다. # interact 는 user key stroke 를 기다리는 command 이다. # -nobuffer 를 사용하면 matching pattern 을 output process 로 출력할 수 있다. # -re 는 다음에 오는 패턴이 regular expression 임을 의미한다. # .* 는 "아무 글자나 여러 개"를 의미한다. ()로 둘러싸야 한다. # 따라서, (.*)( |) 은 또는 으로 끝이 나는 한 라인의 스트링을 의미한다. # send 는 spawn 된 프로세스로 출력을 보낸다. # $interact_out(1,string) 은 사용자의 입력이 저장된 버퍼를 의미한다. # 이때, return 을 해주지 않으면 interact 모드를 빠져나올 수 없다. # expect "이용자ID :" { interact -nobuffer -re "(.*)( |)" { send "$interact_out(1,string) "; return } } # # 패스워드를 입력한다. # expect "비밀번호 :" { interact -re "(.*)( |)" { send "$interact_out(1,string) "; return } } # # 사용자가 갈무리받을 게시판으로 이동해서, $command 를 실행하면 갈무리 를 시작한다. # # stty echo 를 해주면, expect_user 에서 사용자의 입력을 볼 수 있다. - echo 는 반대. # send_user 를 하면, spawn 된 process 대신 표준 출력으로 스트링을 전송 한다. # expect_user 는 사용자로부터 입력을 기다린다. ( interact pattern action 과 비슷함 ) # tcl의 expr 명령은 digit string + integer 를 integer 로 자동 변환해준 다. # string trimright src token 은 src 의 오른편에서부터 token 안에 속하 는 캐릭터를 삭제한다. # tcl 의 for 루프는 for { init } { condition } { increment } { body } 와 같이 사용한다. # -ex 는 exact pattern 이라는 뜻이다. [] 는 -ex 와 함께 써서 항상 으 로 escape 시켜줘야 듯! # log_file filename 은 spawn process 로부터의 모든 입력을 filename 파일 로 출력한다. # logfile; 처럼 파라미터 없이 사용하게 되면 이전의 로깅 작업을 종료한다 는 뜻이다. # interact { -nobuffer -re "$command " { stty echo; send_user "갈무리받을 시작글번호, 마침글번호, 파 일prefix를 입력하세요."; send_user "시작글번호 : "; expect_user -re "(.*)( |)"; send_user ""; set from [expr $expect_out(buffer)+0]; send_user "마침글번호 : "; expect_user -re "(.*)( |)"; send_user ""; set to [expr $expect_out(buffer)+0]; send_user "파일prefix : "; expect_user -re "(.*)( |)"; stty -echo; set prefix [string trimright $expect_out(buffer) ]; send_user "downloading from $from to $to"; for { set i $from } { $i <= $to } { incr i } { send "pr $i "; expect -ex "[ENTER] 를 누르십시오." { send " " }; log_file "$prefix-$i.txt"; expect -ex "PRINTER/CAPTURE를 OFF 하시고" { log_file; }; expect -ex "[ENTER] 를 누르십시오." { send " " }; expect "선택(H:도움말) >>" } } } </pre> == 그런데, 하이텔의 게시판을 긁어와서 DB에 저장해두는 것은 별 문제가 없겠지만, 이걸 웹상으로 공개하면 약관 위반이겠지요??? -_-; 아냐.. 동호회 사람들한테 칼맞을꺼야.. :( == BUG : 각 게시물의 마지막 3줄.. ---- PRINTER/CAPTURE를 OFF 하시고 [ENTER] 를 누르십시오. 를 파일에서 빼야 하는데.. 흐흑.. 이건 이 스크립 트에서는 잘 안되는군요. 흠.. 어떡해야 할까욥? -- Reiot, the Fallen Lord of MUDMANIA
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved