Mojo::UserAgentかわいい (@ YAPC::Asia2013 前夜祭 LT-thon 2013-09-19)
-
Upload
turugina -
Category
Technology
-
view
1.521 -
download
1
Transcript of Mojo::UserAgentかわいい (@ YAPC::Asia2013 前夜祭 LT-thon 2013-09-19)
Mojo::UserAgentかわいい
~ use Mojolicious as HTTP client ~
2013-09-19 @ LT-thon in YAPC::Asia 2013
turugina
皆さん、
Mojolicious好きですか?
ですよね
Mojolicious萌え♡
Mojolicious萌え♡
みんな大好きMojolicious
● http://mojolicio.us/● 現在のバージョン: 4.39 (2013-09-16)
Mojolicious has...
● Web Server (HTTP, HTTPS, WebSocket)○ Mojo::Server::*
● CLI Framework○ Mojolicious::Command::*○ test, cpanify, print routes, run as CGI,○ you can write your own commands
● UserAgent (HTTP/WebSocket client)○ Mojo::UserAgent, Mojo::Transaction::*○ Mojo::Cookie::○ DOM/Selectors
● ojo module (for one-liner)○ perl -Mojo -E ‘b(g(“mojolicio.us”)->body)-
>html_unescape->say’
As HTTP UserAgent
Mojo::UserAgent
Mojo::UserAgent::Transactor
Mojo::Transaction::HTTP
Mojo::Message::Request
Mojo::Message::Response
use
Basic Usage
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;my $tx = $ua->get(‘URL’ => Header =>BODY);
if ( my $res = $tx->success) {# $res をつかってごにょごにょ
} else {my ($msg, $code) = $tx->error;die “$msg: $code”;
}
Get
my $tx = $ua->post(‘http://www.example.com/login’, form => { username => ‘scott’, password => ‘tiger’ });
if ( my $res = $tx->success ) {for my $cookie (map {$_->res->cookies} @{$tx-
>redirects}) {if ( $cookie->name eq ‘PHPSESSID’ ) {
# ごにょごにょ
}}
}
Put
my $cookie = Mojo::Cookie::Response->new;$cookie->name(‘PHPSESSID’);$cookie->value($phpsessid);$cookie->path(‘/’);
$ua->cookie_jar->add($cookie);
Scraping
my $coll = $res->dom(‘section#illust_list ul li a.work’);# $coll … Mojo::Collection
$coll->each(sub {my ($e, $count) = @_;my $title = $e->find(‘h1’)->first->text;my $img_url = $e->find(‘img’)->first->attr(‘src’);
# ごにょごにょ
});
JSON
my $tx = $ua->post(‘...’, json => {loren => ‘ipsum’});
# assuming json in response:# { “result”: “ok”, “body”: {“title”: “hogehoge”} }if (my $res = $tx->success) {
if ( $res->json(‘/result’) eq “ok” ) {say $res->json(‘/body/title’);
}}
ByteStream
use Mojo::ByteStream;
my $tx = $ua->get(‘http://.../foo.jpg’);
if ( my $res = $tx->success ) {my $bs = Mojo::ByteStream->new($res->body);$bs->spurt(‘/tmp/foo.jpg’);say “MD5: “, $bs->md5_sum;
}
普通に使う分には
超優 秀
Mojo::UserAgent
Mojo::Server
優秀な子たちですから
Easy to mashup
Mojo::UserAgent
Mojo::Server
the Internet
Data
myapp
Cache/DB
HTML, js,...
Service
と、いうのを
2日くらいで作ってみた
けどデータ元がpixivで自分のアカウントでログインしてるから公開はできない
2013-09-23追記: pixivのアカウント情報はバージョン管理に入ってないことを確認したのでコード晒してみます:
https://code.launchpad.net/~turugina/+junk/illust_sns_viewer但し、このコードを使ってpixivさんに迷惑はかけないように!
概要
Mojo::UserAgent
Mojo::Server
pixiv
検索結果画像
myapp
DBMFile Cache
jQuery. Gallarie
「艦これかわいい」
艦これ KAWAII!
http://www.pixiv.net/member_illust.php?mode=medium&illust_id=38587771
Demo
ご清聴ありがとうございました