Recent Posts
Recent Comments
11-26 00:05
관리 메뉴

동글동글 라이프

지식IN(naver)에서 질문 검색 후 자동 출력 본문

개발자 이야기/Perl

지식IN(naver)에서 질문 검색 후 자동 출력

동글동글라이프 2008. 10. 27. 20:34

지식IN에서 질문을  검색함과 동시에 답변까지 출력해주는 프로그램은 없을까?

...라는 생각이 들어 구현해 보았다.

인자값으로 한글을 받아온 뒤

URL로 검색할 수 있도록 인코딩을 하여 검색 후

10개의 리스트중 랜덤으로 하나의 질문을 골라

그 질문과 답을 출력을 해준다.

질문의 제목만 출력하도록 하였으며 답변은 모든 답변을 출력하도록 하였기 때문에

답변이 많으면 전체적으로 출력되는 내용도 길어진다. ( 이 부분이 조금 안좋은듯.. )



보니깐 여기에 대한 좋은 모듈들이 또 많은 듯하지만... 머리의 한계로 인해...

어서어서 모듈의 어설픈 점에 대한 답글을 달아 주세요!!. 

그런의미에서... Keedi님 항상 감사합니다^^;



- naver.pm

package naver;
use Exporter;
use vars qw( @ISA @EXPORT_OK $VERSION );
use strict;
use warnings;
use LWP::Simple;
@ISA = qw( Exporter );
@EXPORT_OK = qw(kin);
$VERSION = '0.1';
sub kin{
	my $url = "http://kin.search.naver.com/search.naver?where=kin&query=";
	my $question = shift;
	$question =~ s/([^a-zA-Z0-9])/sprintf('%%%02x',ord($1))/ge;
	# URL에서 사용할 수 없는 특수문자를 %뒤에 두자리 16진수 숫자를 써서 인코딩
	# ord($1)는 16진수 형태로 인코딩하는 부분 
	$url.= $question;
	my $page = LWP::Simple::get($url);
	my @title = $page =~ m{_blank href="(.*?)"}gs;
	my $scope = int(rand(10));
	# print "$scope\n"; #랜덤 값 체크 
	# print "$title[$scope]"; #title값 체크 
	my $page_detail = LWP::Simple::get($title[$scope]);
	$page_detail =~ m{<h3>(.*?)<}s;
	my $ReturnText = "질문  : $1 \n";
	my @answer_list = $page_detail =~ m{'answer_contents'>(.*?)</div>}gs;
	foreach my $text (@answer_list){
	$text =~ s/&nbsp;/ /gs;
	$text =~ s/\&lt;/</g;
	$text =~ s/\&gt;/>/g;
	$text =~ s/<p>/\n/gs;
	$text =~ s/(<.*?>)//gs;
	$text =~ s/\s+/ /gs;
	$ReturnText .= "\n답변 : $text \n";
	}
	return $ReturnText;
}


JEEN님의 블로그를 참고하자면 이러한 문구가 있다. (http://jeen.tistory.com/entry/IRC-BOT을-만들어봅시다-5)


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 에 그대로 들어가면, 어떤 브라우저에서는 자동으로 바꿔서 보내주기도 하지만, 어떤 브라우저는 그것을 인식하지 못하고 글자가 깨지는 경우가 발생합니다.


구현하고 나서 생각해보니 JEEN님의 블로그에 URL을 인코딩해주는 모듈을 본적이 있었다는 생각이 들었다..

방금전에야 확인하고 젠장!! 저 모듈이 있었군; 하는 후회가;;

사실 sprintf와 ord함수를 사용하여 변환하는것도 나쁘지는 않은 듯 공부도 되었고....



모듈이기 때문에.. 사용할 수 있도록 간단히 작성...

- kin.pl

1
2
3
4
5
6
use naver qw(kin);
use Encode qw(decode);
sub _de { decode("cp-949", shift) ; };
my $qu = shift;
$text = kin($qu);
print $text;



=================================================================================

- 이제 출력 !

D:\ex>perl kin.pl 배가고픈이유

질문  :  먹어도 먹어도 배가고픈이유? 그리고..

답변 :  먹어도 먹어도 배고플때.. 이럴 땐 무조건 먹는 게 좋은 겁니다! 이렇게 한창
 배고플 때 먹는건 성장기때 성장하기 위해 에너지가 필요하다는 것이죠 ~! 성장기이
신거 같은데.. 마음 껏 드시고 쑥쑥 크세요~_~ 대신 너무 기름진 음식이나 불량 식품
등은 피하시고, 야채와 비타민 등도 골고루 섭취하도록 하세요~ ^^

답변 :  전 그런적이 아주 많다는....ㅇㅅㅇ;;;;; 그러나 먹어도 먹어도 배가 고프시
면 그때 드시는 것이 좋습니다. >0 성장기 청소년에게 일어나는 것으로 먹어도 먹어도
 배가 고픈 것은 그만큼 많은 에너지를 필요로 한다는 것입니다. ^*^;;;;; 그때 드시
지 않으면 키가 잘 크지 않습니다. ^^;;;;; 좋은하루 보내세여~! ^0^~!

답변 :  질문 내용 잘 받아 보았습니다. ^0^, 청소년기 시절에는 그러한 현상이 일어
납니다. ^0^ 왜냐하면,한창 성장할시기에 있기 때문에,먹어도 배가 고프고 그런 것입
니다. ^0^ ^-^, 식사 맛있게 드시고,특히 아무거나 드시지 마시고,**가 많이 들어있는
 음식을 드시면,몸에 살이찌지 않아서 좋으며,성장을 하는데에도 도움이 되며,몸도 건
강하고 예뻐진답니다. ^0^ ^-^ ^0^ , ^0^ ~님 ^0^ 아셨지요. ^0^ ^-^ ,

D:\ex>perl kin.pl 배가고픈이유

질문  :  배가고픈이유?

답변 :  인체는 음과 양이 있다고 하지요 양은 열 즉 화입니다 위장에 열이 많으면 소
화가 잘됩니다 열이 없으면 음식을 태우는데(소화) 시간이 많이 걸릴 것입니다 그리고
 열이 많으면 몸의 기운을 빼앗아갑니다 그래서 먹어도 기운이 없는 것입니다 식이요
법으로 체질을 변화시켜 보세요 양 즉 열이 많은 식품은 절대 금하세요 즉 커피 개고
기 인삼 돼지고기 닭고기 밀가루 음식 단음식 등이며 가능하면 음의 음식 즉 과일 채
소 생선 류를 많이 드시면 서서히 체질이 바뀔 것입니다

=================================================================================

4번정도 테스트를 했는데 각기 다른 질문과 답변이 나왔다.

처음에 줄을 띄우는것을 시도했는데 불안정하게 출력되어

정규식 치환이 개판이 되었다;

잠시 보류하여 조금 더 효율적으로 출력할 수 있도록... 만들어야겠다.


이젠 여기다 GTK신공을 써서

보기 좋게 꾸미는 것만 남은 것인가 덜덜덜 ㅠ_ㅠ



일단 GTK 문서 번역부터 조금 더 신경 써야 할듯...






'개발자 이야기 > Perl' 카테고리의 다른 글

More fun with strings(substr,split,join)  (2) 2008.11.03
Chapter 5. Moving On  (0) 2008.10.31
음악을 들어보자 #4  (0) 2008.10.16
음악을 들어보자 #3  (5) 2008.10.12
perl pack/unpack  (1) 2008.10.11
Comments