Created
December 10, 2008 11:05
-
-
Save lagash/34306 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/perl | |
use strict; | |
use warnings; | |
use Time::HiRes qw/gettimeofday tv_interval/; | |
my $startTime = [gettimeofday]; | |
use LWP::UserAgent; | |
use HTTP::Cookies; | |
use HTTP::Request::Common qw(POST); | |
use HTML::TreeBuilder; | |
use Switch; | |
my $comment=""; | |
my $email; | |
my $password; | |
my $res; | |
my $loginflag; | |
###ユーザエージェントの生成 | |
#------------------------------------ | |
my $ua = LWP::UserAgent->new; | |
my $cookie_jar = HTTP::Cookies->new( autosave=>1 ); | |
$ua->cookie_jar($cookie_jar); | |
my $url='http://www.tumblr.com/dashboard/'; | |
#プロキシが要る場合は有効に | |
#$ua->proxy('http', 'http://proxyserver:8080'); | |
###読み込みページ設定 | |
#------------------------------------ | |
#GET/POSTデータのロード | |
my $page=$ENV{'QUERY_STRING'}; | |
read(STDIN, $page, $ENV{'CONTENT_LENGTH'}) if(!$page); | |
$page="1" if($page eq ""); | |
#メールアドレスがあったらログインする | |
if($page=~/email=/){ | |
$page=~m|email=(.*)?&pass=(.*)|; | |
$email=$1; | |
$password=$2; | |
$email=~s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego; | |
$page="1"; | |
$loginflag=1; | |
#$comment=$comment."email:$email<br>\n"; | |
} | |
#cookieからログイン済みセッションデータ読み込み | |
if (exists $ENV{'HTTP_COOKIE'} and $loginflag!=1 and $page!~/login/){ | |
foreach (split(/;/,$ENV{'HTTP_COOKIE'})){ | |
my ($key, $val) = split(/=/, $_); | |
$cookie_jar->set_cookie( '', $key, $val, '/', 'www.tumblr.com'); | |
} | |
#ログインページへアクセス | |
}elsif($email ne ""){ | |
$comment=$comment."login processed.<br>\n"; | |
$res=$ua->post('http://www.tumblr.com/login', { email => $email, password => $password }); | |
if($res->as_string=~/incorrect/m){ | |
print "Content-type: text/html\n\n<html>Login Failed";#<br>$page<br>$email : $password</htm>"; | |
exit; | |
} | |
#ログイン情報入力ルーチンへ遷移 | |
}else{&login;} | |
#リブログリンクだったらリブログルーチンへ行く | |
if($page=~/reblog/){&reblog($page);} | |
#ライクだったらライクルーチンへ行く | |
if($page=~/like/){&like($page);} | |
#ページ番号指定ならそのページ番号をセットする | |
if($page=~/goto=(\d+)/){$page=$1;} | |
my $html=""; | |
my $cufld = '.'; | |
my $dbfld = '/w_test/'; | |
my $path = $ENV{'PATH_INFO'}; | |
#// 動作環境セット | |
if ((my $i = index($path, $dbfld)) != -1) { | |
$cufld = '..' . substr($path, $i, $i + length($dbfld) - 1); | |
} | |
if($page=~m/(.*)?&preload=(.*)/ && $2 ne ""){ | |
$page=$1; | |
my $readfile=$2.".html"; | |
#// ファイル読み込み | |
open(FILE, "$cufld/$readfile"); | |
while (<FILE>){ | |
$html =$html.$_; | |
} | |
close(FILE); | |
&temp_remove; | |
} | |
###ダッシュボード読み込み | |
#------------------------------------ | |
$page="" if($page eq "1"); | |
$res = $ua->post($url.$page) if($html eq ""); | |
###クライアントへ送るcookieを用意 | |
my $setCookie=$ua->cookie_jar->as_string; | |
$setCookie=~s/Set-Cookie3/Set-Cookie/g; | |
my $expire_delta_days=90; | |
my @t = gmtime(time() + $expire_delta_days*24*60*60); | |
my @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); | |
my @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); | |
my $expires = sprintf(" expires=\"%s, %02d-%s-%04d %02d:%02d:%02d GMT\";", | |
$w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); | |
$setCookie=~s/domain=www\.tumblr\.com\;/domain=hocipot.ddo.jp\;$expires/g; | |
#$setCookie=~s/domain=www\.tumblr\.com\;/\;$expires/g; | |
###レスポンスヘッダ~HTMLヘッダまでを出力 | |
#------------------------------------ | |
my $endTime = [gettimeofday]; | |
print $setCookie; | |
print "Content-type: text/html\n\n"; | |
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; | |
print '<html>'; | |
print '<head>'; | |
print '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'; | |
print '<title>Tumblr Dashboard for Mobile-page:',$page,'</title>'; | |
print '</head>'; | |
print '<body>'; | |
my $time1=sprintf("<br><br>HTML読込時間:%.6f 秒<br>\n", tv_interval($startTime, $endTime)); | |
$startTime = [gettimeofday]; | |
#ダッシュボード読み込み以前の動作由来のメッセージを表示 | |
print $comment; | |
#ヘッダコンテンツを表示 | |
print "<form action='$ENV{'SCRIPT_NAME'}' method='GET'>\n"; | |
print "<a href=$ENV{'SCRIPT_NAME'}>top</a> "; | |
print "<a href=$ENV{'HTTP_REFERER'} accesskey='*'>before[*]</a> " if($ENV{'HTTP_REFERER'}); | |
print "<input type='text' name='goto' size='3'></input><input type='submit' value='go'></form>\n"; | |
print 'page:',$page,"<br><br>\n"; | |
###ダッシュボードのHTMLを携帯用に変換 | |
#------------------------------------ | |
$html=&convertContents($res->as_string) if($html eq ""); | |
print $html; | |
###コンテンツページフッタの表示 | |
#------------------------------------ | |
$html=~m|preload address:.*\/(\d+\/)(\d+)<br>|si; | |
my $nextPage=$1; | |
my $filename=$2; | |
$endTime = [gettimeofday]; | |
my $time2=sprintf("body書出時間:%.6f 秒<br>\n", tv_interval($startTime, $endTime)); | |
$startTime = [gettimeofday]; | |
print "<br><a href='\?$nextPage$filename\&preload=$filename' target='_self' accesskey='#'>next[#]</a><br><br><br>"; | |
print $time1,$time2; | |
print '</body></html>'; | |
###次のページを先読み | |
#------------------------------------ | |
$res = $ua->post($url.$nextPage.$filename); | |
$endTime = [gettimeofday]; | |
my $time3=sprintf("<br>次ページ読込時間:%.6f 秒<br>\n", tv_interval($startTime, $endTime)); | |
$startTime = [gettimeofday]; | |
$html=&convertContents($res->as_string); | |
$endTime = [gettimeofday]; | |
my $time4=sprintf("HTML処理時間:%.6f 秒<br>\n", tv_interval($startTime, $endTime)); | |
#// ファイル書き込み | |
exit if($filename eq ""); | |
$html=$html."$time3$time4"; | |
open(FILE, ">$cufld/$filename.html") or die; | |
print FILE $html; | |
close(FILE); | |
exit; | |
############################################################### | |
### HTML処理 | |
#------------------------------------ | |
sub convertContents{ | |
(my $tempHtml) = @_; | |
$tempHtml =~s|\n+||gsmi; | |
$tempHtml =~s| +| |gsmi; | |
$tempHtml =~s|><|>\n<|gsmi; | |
$tempHtml =~s|> <|>\n<|gsmi; | |
$tempHtml =~s|.*<html|<html|gsmi; | |
$tempHtml =~s|<head>.*</head>|<head></head>|gsmi; | |
$tempHtml =~s|<body.*<!-- Posts -->|<body>|gsmi; | |
$tempHtml =~s|<li class="post is_mine with_avatar new_post".*?>.*?</li>||gsmi; | |
# $tempHtml=~s|<!-- Username -->.*?<!-- Share post -->||gsmi; | |
$tempHtml=~s|<!-- Post controls -->||gsmi; | |
$tempHtml=~s|>reblog<|><strong>reblog</strong><|gsmi; | |
###ページ内のpostを一つずつ処理 | |
#------------------------------------ | |
my $string=$tempHtml; | |
my $regexp; | |
$regexp = qr/<li[^>]*>(?:(?>(?:(?!<\/?li[^>]*>).)*)|(??{$regexp}))*<\/li>/si; | |
my $acsKey=1; | |
my $returnText=""; | |
#ポスト毎のループ | |
while ($string =~ /($regexp)/gmsi) { | |
if($acsKey>0 and $acsKey<11){ | |
my $dispakey=$acsKey%10; | |
$returnText=$returnText."[<a href='#$dispakey' name='$dispakey' accesskey='$dispakey'>$dispakey</a>] "; | |
} | |
$acsKey++; | |
my $temp=$1; | |
if($temp=~m|\<a href=\"\/edit|){ | |
$returnText=$returnText."--your post--<br><br>\n"; | |
next; | |
} | |
#like用処理 | |
my $currentId=$temp; | |
my $formkey=$temp; | |
$currentId=~m/^\<li id=\"post(\d+)/i; | |
$currentId=$1; | |
$formkey=~m/\<input.*?id=\"form_key.*?value=\"(.*?)\"/msi; | |
$formkey=$1; | |
my $liked="like"; | |
$liked="unlike" if($temp=~m/\<form action=\"\/like.*?style=\"display:none\;\"\>/msi); | |
$returnText=$returnText."$1 : " if($temp =~m|(\d+ notes)|); | |
$temp =~m/\<li .*?class\=.*?(regular|photo|quote|link|conversation|video|audio)/msi; | |
my $postType=$1; | |
$temp=~m/./; | |
$returnText=$returnText."$postType :"; | |
$returnText=$returnText." \<a href=\"$ENV{'SCRIPT_NAME'}\?$liked=$currentId\;$formkey\;\"\>$liked\<\/a\>"; | |
$returnText=$returnText."<br>\n"; | |
my $insertText; | |
###ポストタイプ毎に表示内容を抽出 | |
#------------------------------------ | |
switch($postType){ | |
case "quote"{ | |
my $quort=$temp; | |
$quort=~m|<span class=\"quote\">(.*)?<\/span>|smi; | |
$insertText= "$1<br>\n" if(length $quort>0); | |
} | |
case "link"{ | |
my $link=$temp; | |
$insertText= "$1<br>\n" if($link=~m/<p>(comment:.*)?<\/p>/smi); | |
} | |
case "regular"{ | |
my $regular=$temp; | |
$insertText= "$1<br>\n" if($regular=~m/reblog.*?\/div>(.*)?<div/smi); | |
} | |
case "photo"{ | |
my $photo=$temp; | |
my $thumbSrc=""; | |
my $largeSrc=""; | |
while ($photo=~/src=\"(.*)?\"/gmi){ | |
my $tmpSrc=$1; | |
if($tmpSrc=~m/(.*?\.tumblr\.com.*?)_100(\..*)/i){$thumbSrc="$1_100$2";next;} | |
$largeSrc="http://media.$1_250$3" if($tmpSrc=~m/.*?\.(tumblr\.com.*?)_(\d\d0)(\..*)/i); | |
} | |
#$insertText= "<a href=\"$1_$2$3\"><img src=\"$1_100$3\"><\/a><br>\n" if($tmpSrc=~m/(.*?\.tumblr\.com.*?)_(\d00)(\..*)/i); | |
if($thumbSrc eq ""){$thumbSrc=$largeSrc;$thumbSrc=~s/_[2-9][0-9]0/_100/;} | |
$insertText= "<a href=\"$largeSrc\"><img src=\"$thumbSrc\"><\/a><br>\n"; | |
} | |
else{next;} | |
} | |
$returnText=$returnText."$insertText\n<!---------------->\n"; | |
#Aタグの処理 | |
my $regexp_a; | |
$regexp_a = qr/<a[^>]*>(?:(?>(?:(?!<\/?a[^>]*>).)*)|(??{$regexp_a}))*<\/a>/si; | |
while($temp=~/($regexp_a)/gmsi){ | |
my $tmp=$1; | |
next if($tmp=~/<img/msi); | |
next if($tmp=~/href=\"#\"/msi); | |
next if($tmp=~m/>\ \;</msi); | |
if($tmp!~/tumblr\.com/msi){$tmp=~s|<a href=\"(http:\/\/.*?)\"|<a href=\"http://www.google.co.jp/gwt/n?u=$1\"|gsmi;} | |
$tmp=~s|<a href=\"\/reblog|<a href=\"$ENV{'SCRIPT_NAME'}\?http:\/\/www\.tumblr\.com\/reblog|gsmi; | |
$tmp=~s|(<a href=\".*?\").*?>|$1>|gsmi; | |
$tmp=~s|([\'\"])\/images|$1http:\/\/www\.tumblr\.com\/|gsmi; | |
# $tmp=$tmp.":\<a href=\"$ENV{'SCRIPT_NAME'}\?$liked=$currentId\;$formkey\;\"\>\<strong\>$liked\<\/strong\>\<\/a\>" if($tmp=~m/\<strong\>reblog\<\/strong\>/); | |
$returnText=$returnText."$tmp<br>\n\n"; | |
} | |
$returnText=$returnText."\n<!------------------------------------------------------------->\n<br>\n"; | |
} | |
$tempHtml=~m|<div id=\"pagination\">.*?<a href=\"\/dashboard\/(\d+\/\d+)\" id=\"next_page_link|gsmi; | |
my $next=$1; | |
$returnText=$returnText."<!-- $tempHtml -->" if($1 eq ""); | |
$returnText=$returnText."<br>preload address:$url$next<br>"; | |
return $returnText; | |
} | |
############################################################### | |
###reblog処理 | |
#------------------------------------ | |
sub reblog{ | |
my ($url) = @_; | |
my $res = $ua->post($url); | |
my $html=$res->as_string; | |
my $tree = HTML::TreeBuilder->new; | |
$tree->parse($html); | |
$tree->eof(); | |
foreach my $a ($tree->find("form")) { | |
next if($a->attr('action')eq'/search'); | |
my %hash; | |
# for my $tag( $tree->find('input')){ | |
# next if($tag->attr('name')eq'preview_post'); | |
# $hash{$tag->attr('name')}=$tag->attr('value'); | |
# } | |
# for my $tag( $tree->find('textarea')){ | |
# $hash{$tag->attr('name')}=$tag->as_text; | |
# } | |
# my %hash2=$tree->find('form')->all_external_attr(); | |
for my $tag( $a->find('input')){ | |
next if($tag->attr('name')eq'preview_post'); | |
$hash{$tag->attr('name')}=$tag->attr('value'); | |
} | |
for my $tag( $a->find('textarea')){ | |
$hash{$tag->attr('name')}=$tag->as_text; | |
} | |
my %hash2=$a->find('form')->all_external_attr(); | |
$hash{'post[is_private]'}="0"; | |
$hash{'enctype'}=$hash2{'enctype'}; | |
$hash{'email'}=$email; | |
$hash{'password'}=$password; | |
my $reblogUrl='http://www.tumblr.com'.$hash2{'action'}; | |
$res = $ua->post($reblogUrl, \%hash); | |
print "Content-type: text/html\n\n"; | |
print "rebloged..."; | |
print "<script langage='javascript'>history.back();</script>"; | |
print '</body></html>'; | |
} | |
exit; | |
} | |
############################################################### | |
###like処理 | |
#------------------------------------ | |
sub like{ | |
my ($str) = @_; | |
$str=~m/(.*like)=(.*);(.*);/; | |
my $like=$1; | |
my $id=$2; | |
my $formkey=$3; | |
# my $reblogUrl="http://www.tumblr.com/dashboard/$like"; | |
print "Content-type: text/html\n\n"; | |
print "action:$like id:$id formkey:$formkey\n\n"; | |
# exit; | |
my %hash; | |
$hash{'id'}=$id; | |
$hash{'redirect_to'}="/dashboard"; | |
$hash{'form_key'}=$formkey; | |
my $reblogUrl="http://www.tumblr.com/$like"; | |
$res = $ua->post($reblogUrl, \%hash); | |
# print "Content-type: text/html\n\n"; | |
print $like."d..."; | |
print "<script langage='javascript'>history.back();</script>"; | |
print '</body></html>'; | |
exit; | |
} | |
#################################################### | |
###ログイン入力処理 | |
#------------------------------------ | |
sub login{ | |
print "Content-type: text/html\n\n"; | |
print '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; | |
print '<html>'; | |
print '<head>'; | |
print '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'; | |
print '<title>Tumblr Login</title>'; | |
print '</head>'; | |
print '<body>'; | |
print "<form action='$ENV{'SCRIPT_NAME'}' method='POST'>","\n\n"; | |
print 'email:',"<input type='text' name='email' size='20'></input><br>"; | |
print 'password:',"<input type='password' name='pass' size='20'></input><br>"; | |
print "<input type='submit' value='go'></form>\n"; | |
print "</body></html>"; | |
exit; | |
} | |
#################################################### | |
###古いファイルを削除 | |
#---------------------- | |
sub temp_remove { | |
my $check = (eval { opendir(DIR,$cufld); }, $@ eq ""); | |
if (!$check) { &error("システムエラー",0,"ファイル取得ができません."); } | |
my @list = readdir(DIR); | |
foreach my $file (@list) { | |
next if -d $file; | |
next if($file!~/html/); | |
if (-M "$cufld/$file" > 1/24/6) { unlink "$cufld/$file"; } # 6時間経過の作業ファイルを削除 | |
} | |
close(DIR); | |
}#getdir |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment