블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.05.27 16:12

[ Perl ] IRC BOT을 만들어봅시다 :-) #5


 흡, 휴가라서 그런지 시간이 남네요. 그러면 시작해 보겠습니다.


IRC BOT을 만들어봅시다 :-) #5

- #4 에서는...

  - 간단하게 CPAN 상에 올려진 PoCo::IRC::Plugin::(.+) 에 대해서 알아봤습니다.
  - Plugin 추가/사용에 대해서 간단하게 알아봤습니다.

 - #5 에서는

  - Encode 모듈을 사용한 한글 취급에 대해서 알아보겠습니다.
  - 실제 사용중인 Bot Command 에 대한 사용예제를 보여드리겠습니다.
 
 - IRC에서의 한글 사용

 현재 hanIRC는 cp949 라는 문자인코딩을 사용하고 있습니다. freenode 같은 경우는 utf-8 이죠. 최근에 한국 펄 커뮤니티(이러면 뭔가 거창해 보임..) 쪽에서 freenode 와 hanIRC 병행체제로 가게 되어서, BOT도 이에 맞춰서 기존의 인코딩 방식을 바꿔줘야 했습니다.
 그리고 Perl 에서의 이런 Encode 관련된 모듈은 이름 그대로 Encode 입니다. 일본의 Dan Kogai 씨가 이 Encode 모듈의 저자입니다.
사용자 삽입 이미지

 흠.. 사실은 지난 YAPC 에서 사인 받았더랬습니다.

 Encode::KR 페이지에서도 간단하게 사용예제를 볼 수 있습니다. 말 그대로 간단합니다! :-)

   use Encode qw/encode decode/; 
$cp949 = encode("cp949", $utf8); # loads Encode::KR implicitly
$utf8 = decode("cp949", $cp949); # ditto

 Encode::KR 페이지의 SYNOPSIS 부분을 그대로 따왔습니다.

 위의 예제 그대로, 일단은 use Encode; 해주시고...
  cp949 문자열을 utf-8으로 바꾸기 위해서는 cp949 문자열을 cp949 로 decode 해주시면 됩니다. 거꾸로 utf8을 cp949 문자열로 바꾸기 위해서는 utf-8 문자열을 cp949로 encode 해주시면 끝입니다.

 어때요? 참 쉽죠? 간단하죠?
 
 - Tutorial

 그러면 간단한 사용예제를 참고해보겠습니다. #4 플러그인 예제를 축약한 것은 여기서 사용하기 위해서 였습니다. :-)

 # URL Find : Title Notify                                                                                                                                  
sub irc_urifind_uri {
    my ($who, $channel, $url, $obj, $msg) = @_[ARG0 .. ARG4];
   
        my $html = scraper {
            process 'title', title => 'TEXT';
        };
        my $data = $html->scrape(URI->new($url));
        return 0 unless $data->{title};
        my $title = $data->{title}; # Web::Scraper 에서 나온 결과물은 UTF-8으로 반환
        $title = encode('cp949', $title); # UTF-8 인 title 내용을 cp949 로 변경
        $irc->yield( privmsg => $channel => $title ); # 해당 채널에 title을 알려줍니다.
   
}

 대화중에서 URL 이 포함되었을 경우에는 그 URL의 title을 얻어내는 코드입니다. 여기에는 Web::Scraper 라는 모듈을 사용해서 간단하게 title을 뽑아낼 수 있습니다. (물론 use Web::Scraper; 해주세요) LWP::Simple 등을 이용해서 간단히 정규표현 써서  얻는 방법도 있지만... 그거야 쓰시는 분 맘대로 이기 때문에... :-)
 아무튼 Web::Scraper 에서 긁힌 결과는 UTF-8 문자열로 반환됩니다.
 이것을 cp949 로 인코딩하구요. 그리고 그 값을 채널에다가 뿌려줍니다.

사용자 삽입 이미지

그럼 이렇게 나오겠죠?



  그럼 다른 예제를 보여드리겠습니다. 물론 perl-irc-bot 에서 사용하고 있는 예제중에서 긁어오겠습니다.

 최근에 perl-irc-bot 프로젝트에 처음으로 커밋해주신 하얀_고양이 님의 네이버 지도 예제입니다.

  !map [지역] 을 입력하면.. 해당 지역의 지도를 나타내는 그런 기능입니다.
 
사용자 삽입 이미지

이같이 사용합니다.


 그러면...

사용자 삽입 이미지

 이렇게 울릉군의 중심을 나타내게 됩니다. :-)
 코드는 아래와 같습니다.

use URI::Escpae;
my $naver_map_url = 'http://map.naver.com/?query=';

sub irc_public {
    my ($sender, $who, $where, $what) = @_[SENDER, ARG0 .. ARG2];
    my $nick = ( split /!/, $who )[0];
    my $channel = $where->[0];

   if ($what =~ /^!([a-z0-9]+)\s?(.*?)?$/) {
        my ($command, $desc) = ($1, $2);
 
        if ($command eq 'map') {
                my $address = $naver_map_url . URI::Escape::uri_escape($desc);
                $irc->yield(privmsg=>$channel=>$address);
        }
   }
}

 여기서는 URI::Escape 모듈을 use 합니다. 2바이트 문자가 URL 에 그대로 들어가면, 어떤 브라우저에서는 자동으로 바꿔서 보내주기도 하지만, 어떤 브라우저는 그것을 인식하지 못하고 글자가 깨지는 경우가 발생합니다.
사용자 삽입 이미지

 보시다 시피 "서울시"라고 2바이트 문자가 query 의 값으로 직접 넣었을 경우의 결과입니다. 뭐 서울 주변이기는 하지만, 제대로 된 값이 아닐경우의 기본 표시가 이곳인 듯 합니다. :-) 검색창의 서울시라는 글씨도 막 깨져있죠?

 그래서 URI::Escape 모듈로 해당 문자열을 uri_escape 해줍니다.

 그외 여러가지 아이디어가 있으시다면, Plugin 모듈을 직접 만들어서 많은 사람들이 사용할 수 있게 만들어도 좋을 것이고... 아니면 자신만 필요한 기능이 있다면 직접 이렇게 Bot Command 를 만들어 주고 쓰셔도 됩니다.
 
  - Summary

   - Encode 모듈을 사용해서 UTF-8 => cp949 의 경우에는 encode("cp949", $utf8),
     cp949 => UTF-8 의 경우에는 decode("cp949", $cp949) 를 하면 됩니다.
   - Web::Scraper 를 통해 간단하게 HTML의 내용중의 일부를 긁어올 수 있습니다.
   - 2바이트 문자의 경우는 URI::Escape 모듈을 이용해서 URL을 Escape 시켜줘야 해당 결과를 제대로 파악할 수 있습니다.

 
 - #6 에서는

  - IKC를 통해서 외부 이벤트를 IRC에 넘겨주는 방법에 대해서 이야기 해보겠습니다.

- PR
※ 현재 POE::Component::IRC를 사용한 Perl Bot 만들기 프로젝트가 진행중입니다.
- http://code.google.com/p/perl-irc-bot
※ 더불어 perldoc을 한글로 번역하기 위한 프로젝트도 진행중입니다.
- http://code.google.com/p/perldoc-kr
※ 거기에 덧붙여 me2day Perl API를 만드는 프로젝트도 진행중입니다.
- http://code.google.com/p/me2day-perl-api

 참여를 원하시면 댓글을 달아주시거나, email: aiatejin@gmail.com
 혹은 IRC(irc.hanirc.org, #perl)에서 JEEN에게 연락하시면 됩니다.

신고
TOTAL 469,885 TODAY 80

티스토리 툴바