[지저분한] 네이버 자동출첵 Perl script
글쓴이: acidd15 / 작성시간: 월, 2005/07/04 - 9:54오전
#!/usr/bin/perl
use Socket;
use POSIX;
sub parseURL{
my $url=@_[0];
return $url=~m/(https?):\/\/([^\/]*)(.*)/;
}
#클럽아이디
$club_id="";
#날짜 세팅
$start_day=7;
$start_mon=6;
$start_year=2005;
#메시지
$what_say="흠....-_-.";
#id 에 아이디
#pw 에 패스워드
$n_id="";
$n_pw="";
$page_url="http://id.naver.com/nidlogin.login?id=".$n_id."&pw=".$n_pw;
$view_url="http://cafe.naver.com/AttendanceView.nhn?clubid=".$club_id."&attendyear=".$start_year."&attendmonth=".sprintf("%02d",$start_mon)."&attendday=".sprintf("%02d",$start_day);
$post_url="http://cafe.naver.com/AttendancePost.nhn?clubid=".$club_id."&attendyear=".$start_year."&attendmonth=".sprintf("%02d",$start_mon)."&attendday=".sprintf("%02d",$start_day)."&page=&emotion=11&content=".$what_say;
print $page_url."\n";
print $view_url."\n";
print $post_url."\n";
($protocol,$host,$uri)=parseURL($page_url);
if($protocol eq "http"){
$port="80";
}elsif($protocol eq "https"){
$port="443";
}else{
print "Unknown protocol.\n";
exit 0;
}
$port = getservbyname ($port, 'tcp') unless $port =~ /^\d+$/;
$dest_ip = gethostbyname ($host);
$dest_serv_params = sockaddr_in($port, $dest_ip);
socket (S, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
connect (S, $dest_serv_params) or die "connect: $!";
select (S); $| = 1; select (STDOUT); # Eliminate STDIO buffering
$msg="GET ".$uri." HTTP/1.1\r\nConnection: Close\r\nHost: ".$host."\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n";
syswrite(S,$msg,length($msg));
$content="";
while(($len=sysread(S,$read_buffer,256)>0)){
$content.=$read_buffer;
}
close S;
#print $content."\n";
@list=split(/\r\n/,$content);
@cookie_arr=();
for $i(0..@list-1){
if($list[$i]=~/Set\-Cookie:\s*(.+)/g){
push(@cookie_arr,$1);
}
}
$cookie_str="Cookie: ".join(" ",@cookie_arr)."\r\n";
print $cookie_str."\n";
$dest_date=scalar(mktime(0,0,0,$start_day,$start_mon-1,$start_year-1900));
print $dest_date." : ".localtime($dest_date)."\n";
$loop_triger=0;
$count=0;
while(!$loop_triger){
if($dest_date<=time or $count==60){
$count=0;
print time."\n";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
printf "%4d-%02d-%02d %02d:%02d:%02d\n",$year+1900,$mon+1,$mday,$hour,$min,$sec;
print $dest_date." : ".localtime($dest_date)."\n";
#글쓰기 페이지에 연결하여 textarea가 존재하는지 살핀다.
($protocol,$host,$uri)=parseURL($view_url);
if($protocol eq "http"){
$port="80";
}elsif($protocol eq "https"){
$port="443";
}else{
print "Unknown protocol.\n";
exit 0;
}
$port = getservbyname ($port, 'tcp') unless $port =~ /^\d+$/;
$dest_ip = gethostbyname ($host);
$dest_serv_params = sockaddr_in($port, $dest_ip);
socket (S, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
connect (S, $dest_serv_params) or die "connect: $!";
select (S); $| = 1; select (STDOUT); # Eliminate STDIO buffering
$msg="GET ".$uri." HTTP/1.1\r\n".$cookie_str."Connection: Close\r\nHost: ".$host."\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n";
syswrite(S,$msg,length($msg));
$content="";
while(($len=sysread(S,$read_buffer,256)>0)){
$content.=$read_buffer;
}
close S;
if($content=~/ui\('$n_id'/){
print "Already wroted.\n";
#exit 0;
++$start_day;
$dest_date=scalar(mktime(0,0,0,$start_day,$start_mon-1,$start_year-1900));
$view_url="http://cafe.naver.com/AttendanceView.nhn?clubid=".$club_id."&attendyear=".$start_year."&attendmonth=".sprintf("%02d",$start_mon)."&attendday=".sprintf("%02d",$start_day);
$post_url="http://cafe.naver.com/AttendancePost.nhn?clubid=".$club_id."&attendyear=".$start_year."&attendmonth=".sprintf("%02d",$start_mon)."&attendday=".sprintf("%02d",$start_day)."&page=&emotion=11&content=".$what_say;
print $page_url."\n";
print $view_url."\n";
print $post_url."\n";
}else{
#존재 한다면 글을 쓰고 프로그램을 종료한다.
if($content=~/<form name="attendanceFrm"/){
print "OK! I FOUND IT!!!\n";
$delay_time=int(rand(6))+2;
print "DELAY: ".$delay_time."\n";
sleep($delay_time);
($protocol,$host,$uri)=parseURL($post_url);
if($protocol eq "http"){
$port="80";
}elsif($protocol eq "https"){
$port="443";
}else{
print "Unknown protocol.\n";
exit 0;
}
$port = getservbyname ($port, 'tcp') unless $port =~ /^\d+$/;
$dest_ip = gethostbyname ($host);
$dest_serv_params = sockaddr_in($port, $dest_ip);
socket (S, &AF_INET, &SOCK_STREAM, 0) or die "socket: $!";
connect (S, $dest_serv_params) or die "connect: $!";
select (S); $| = 1; select (STDOUT); # Eliminate STDIO buffering
$msg="GET ".$uri." HTTP/1.1\r\n".$cookie_str."Connection: Close\r\nHost: ".$host."\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n";
syswrite(S,$msg,length($msg));
$content="";
while(($len=sysread(S,$read_buffer,256)>0)){
$content.=$read_buffer;
}
close S;
print $content;
#exit 0;
}
}
}
sleep(1);
++$count;
}
저번달에 제가 가입되었던 스터디 클럽에서 출첵 미션하길래 만들어 봤습니다.ㅋ..덕분에 출첵미션 성공해서 상품도 타고 했는데..--;;
급조돼서 좀 지저분 합니다..필요하신분들은 다듬어서 쓰십시요 ^^;
Forums:


자동출첵이 먼가요?
출첵?이 먼지 몰라서 ㅎㅎ
@.@
^^
^^..카페 출석부 입니다..ㅋ
perl은 모르겠구.. 그냥 쉘과 lynx로.. ^^
Re: perl은 모르겠구.. 그냥 쉘과 lynx로.. ^^
오호...물론 원하는 날짜에 출첵을 남길수는 있겠지만 남긴 시간이 맞지 않을수도 있을 것이기 때문에 약간은 아쉬운 스크립트 이군요. :lol:
왜냐? 현재보다 미래나 과거의 어느 특정날짜에 출첵을 할경우 시간은 현재시간으로 남겨지기때문에 출첵을 해도 신뢰성이 없겠죠.. 8)
댓글 달기