ラベル Perl の投稿を表示しています。 すべての投稿を表示
ラベル Perl の投稿を表示しています。 すべての投稿を表示

2010年5月5日水曜日

twitterのつぶやきをmixi日記に投稿するスクリプトを作ってみたけど…

twitterの前日のつぶやきをまとめてmixiの日記に投稿するスクリプトを書きました。
mixiの日記投稿のAPIは公開されていナイっぽいので、
こちらを参考にさせていただきました。

mixi for iPhoneから発掘されたmixi日記投稿用API

以下がコードです。今回はPerlを使いました。

use strict;
use warnings;
use LWP::UserAgent;
use LWP::Authen::Wsse;
use HTTP::Request::Common;
use XML::DOM;
use Encode;
use Date::Parse;
use DateTime;
use utf8;


my $entry = "";
my $title = "";

my $ua = LWP::UserAgent->new;

my $req = HTTP::Request->new('GET', "http://twitter.com/statuses/user_timeline.xml");
$req->authorization_basic('(★twitterのユーザ名を入れる)', '(★twitterのパスワードを入れる)');
my $res = $ua->request($req);
if ($res->is_success) {
    my $parser = new XML::DOM::Parser;
    my $doc = $parser->parse($res->content);
    my @status = $doc->getElementsByTagName('status');
    my $t_dt = DateTime->today;
    my $prev_day = $t_dt->day - 1;
    $title .= "  " . $t_dt->year . '/' . $t_dt->month . '/' . $prev_day;
    $title .= encode('utf8', "のつぶやき");
    foreach (@status) {
  my @children = $_->getChildNodes;
  my $text;
  my $dt;
  foreach (@children) {
      if ($_->getNodeType() == ELEMENT_NODE) {
    if ($_->getTagName() eq "text") {
        #$text =  encode('shift_jis', $_->getFirstChild->toString);
        $text =  encode('utf8', $_->getFirstChild->toString);
    } elsif ($_->getTagName() eq "created_at") {
        my $epoch =  str2time($_->getFirstChild->toString);
        $dt = DateTime->from_epoch(epoch => $epoch);
    }
      }
  }
  if ($dt->year == $t_dt->year && $dt->month == $t_dt->month && $dt->day == $t_dt->day-1) {
      $entry .= "  " . $dt->year . '/' . $dt->month . '/' . $dt->day;
      $entry .= " " . $text . "\n\n";      
  }
    }
} else {
    print "error";
    exit;
}

my $id = '(★mixiのログインメールアドレスを入れる)';
my $pass = '(★mixiのパスワードを入れる)';
my $member_id = (★mixiのメンバーidを入れる);

my $ua2 = LWP::UserAgent->new;
$ua2->credentials('mixi.jp:80', '', $id, $pass);

my $content = <<__XML__;
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3.org/2007/app'>
  <title>$title</title>
  <summary>$entry</summary>
</entry>
__XML__

print $content;

$res = $ua2->post(
  "http://mixi.jp/atom/diary/member_id=$member_id",
  'Content-Type' => 'application/atom+xml',
  'content' => $content,
     );

warn $res->content unless $res->code == 201;


使ってみて思ったのが、
twitterは日ごろ、その瞬間に思っていることを気軽に投稿するものなので、
1日まとめてしまうと、なんだか、まとまらないものになってしまいます。

日記なんかは内容をきちんと考えて文章をまとめますが、
twitterはそんなことを考えません。

このようなtwitterをmixiに投稿するスクリプトを常に回してしまうと、
逆にtwitterのつぶやきを日記に公開することを前提として考えながらつぶやいてしまうので、
twitterのメリットがなくなってしまいます。

ということでこのスクリプトはお蔵入りです。

2009年3月21日土曜日

即席でスライドショウをつくってみた。

せっかく画像をダウンロードしたので、スライドショウをつくってみた。

まず、ディレクトリにあるファイルすべてを img 要素にするスクリプトをかく。

#!/usr/bin/perl

open OUT, "> display.html"
or warn "fail";
opendir DH, ".";
print OUT "<html>\n";
print OUT "<head>\n";
print OUT "<script type=\"text/javascript\" src=\"./slideshow.js\"></script>\n";
print OUT "<link rel=\"stylesheet\" href=\"./slideshow.css\" type=\"text/css\"></link>";
print OUT "</head>\n";
print OUT "<body>\n";
foreach $file (readdir DH) {
if ($file =~ /jpg$/) {
print OUT "<img src=\"";
print OUT "$file";
print OUT "\">\n";
}
}
print OUT "</body>\n</html>\n";


スライドショウのために、slideshow.css と slidesyou.js を用意。


まず、slideshow.css

body {
background-color:black;
}

img {
display : none;
margin-left : auto;
margin-right : auto;
}


つぎに、slideshow.js

var img_list;
var i = 0;

function slide() {
if (i == 0) {
img_list[img_list.length-1].style.display = "none";
} else {
img_list[i-1].style.display = "none";
}
img_list[i].style.display = "block";
if (i == img_list.length-1) { i = 0; } else { i++;}
}

function show(e) {
img_list = document.getElementsByTagName("img");
img_list[img_list.length-1].style.display = "block";
window.setInterval(slide, 10000);
}

window.addEventListener("load", show, false);


まあ、即席で作ったので、だいぶ汚いコードですが・・・。

本当はopacityとか使ってトランジッションとかを派手にしたいんですけど、
今日はここまで。

2009年3月19日木曜日

Webページの画像を保存するPerlスクリプト

Webページにある画像を保存するスクリプトを書いてみました。

#!/usr/bin/perl

use LWP::UserAgent;
use HTML::DOM;
use Digest::MD5 qw(md5_hex);
use Path::Class qw(file);

my $ua = LWP::UserAgent->new;
my $referer = "http://example.com/";
my $url = "http://example.com/";

my $req = new HTTP::Request('GET', $url);
my $res = $ua->request($req);

my $dom_tree = new HTML::DOM;
$dom_tree->write($res->content);
@img = $dom_tree->getElementsByTagName("img");
my $ua2 = LWP::UserAgent->new;
foreach (@img) {
my $filename = Digest::MD5::md5_hex($_->src);
my $filepath = file('./temp', $filename);
unless(-f $filepath->stringify . ".jpg" ) {
$ua2->get( $_->src, ":content_file" => $filepath->stringify . ".jpg", "referer" => $referer);
}
}


LWP::UserAgent は HTTPのリクエストやレスポンスを行うためのモジュールです。
Webページを取得して、それをDOMツリーにして、img要素のsrc属性に記述してある画像ファイルを保存するスクリプトです。

ちょっとはまったのが、はじめに HTML::DOM ではなく、XML::DOM をつかってしまったこと。

もちろん閉じタグがない要素があるので、パースエラーになってしまうのですが、エラーになかなか気づきませんでした。(ちゃんとエラーメッセージ見ろ!って思うけど)

後は、referer を設定しないと アクセスが拒否されるかもしれません。

2009年3月12日木曜日

Perlの勉強

Perlの勉強を始めました。

業務では組み込み系のため、C言語しか使わず、
スクリプト言語はRubyぐらい(しかも、必要最低限しか使わず。。。)
しか使わないので、実はPerlには苦手意識がありました。

でもJavaScriptを勉強しているうちに、
正規表現がいまいち苦手だということがわかり、
「正規表現ならPerlだろ!」という勝手な思い込みから、
勉強を始めることにしました。


で、いざ書いてみると
なかなか癖がある言語だなとおもいました。
サブルーチンの書き方なんかは

sub hello {
my($a, $b) = @_;
print $a+$b
}
hello(1,2);

みたいに、ルーチン名の後に(引数...)の形ではなく、
@_ に引数が格納されて、それを利用するのです。
なんだか、C言語の関数になれていると、すごく気持ち悪く感じるなぁ。。。