Skip to content

Instantly share code, notes, and snippets.

@lagash
Created December 10, 2008 11:05
Show Gist options
  • Save lagash/34306 to your computer and use it in GitHub Desktop.
Save lagash/34306 to your computer and use it in GitHub Desktop.
#!/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/>\&nbsp\;</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