※この記事は, @azumakuniyukiさんから寄稿頂いた記事をpapixが代理投稿したものです.
Acme::Nyaaで実装した猫プロキシ
去る九月のYAPC::Asia Tokyo 2013の前夜祭で開催されたLTソン::Tinyで「猫とPerl〜応用編1」というタイトルで発表した@azumakuniyukiです。今日は12月22日、毎月22日は猫の日、今年最後の猫の日です。
Acme::Nyaaってのは食わせた文章が「にゃー」とか「ニャー」とか猫っぽい感じになるPerlモジュールで、動物病院から「そろそろ注射です」的なハガキを顧客の猫に出す時に文章を猫向けに変換する時に役立ちます。
こういった実用的なモジュールも実際の使用例があった方がより親しみやすさ、使用した時の実感が得られるのではないでしょうか。そこでHTTP編とSMTP編でAcme::Nyaaの使用例を紹介しようかと思います。
下準備
Acme::Nyaaをgit clone
して猫プロキシ(eg/nyaaproxy
)を起動しておきます。Acme::NyaaはPerl 5.10.1以上で依存しているモジュールはModule::Load
とEncode
の二つです。どちらもPerl 5.10.1の時点でコアモジュールに入っていますので、特にインストールしなくてもOKです。あとは猫プロキシを動かすのにPlackとFurlを使います。
% git clone https://github.com/azumakuniyuki/p5-Acme-Nyaa.git
Cloning into 'p5-Acme-Nyaa'...
remote: Counting objects: 379, done.
remote: Compressing objects: 100% (218/218), done.
...
% cd ./p5-Acme-Nyaa
% plackup -Ilib -p 2222 eg/nyaaproxy.psgi
HTTP::Server::PSGI: Accepting connections at http://0:2222/
猫プロキシ〜HTTP編
plackup
で起動したら、http://127.0.0.1:2222/http://猫っぽくしたいURL
というURLでブラウザを開くだけです。YAPC::Asiaが終わってからUTF-8以外の文字コードも対応した0.0.10を出したので日本語で書いているページならだいたい猫になると思います、たぶん。
このHachioji.pm 日めくりテックトークの主催者である@uzullaさんが9月12日に書かれた記事「PHP Builtin serverで、dot(.)が入るURLで挙動が変わってつらい(かもしれない)」を猫プロキシ経由で参照した様子です。
本来なら猫プロキシを通した一例として出すページは前日の@__papix__さんの記事「Perl meets GPU」が良いところですが、Acme::Nyaaは理系的な文章(句読点が,.なの)をうまく変換出来ないので、無難に主催者の記事を一例として使いました。
別の表現をすると、作成するWebページでは句読点を「,」「.」で表記すればある程度の猫避けになります。
猫プロキシ〜SMTP編
Net::SMTPSでGmailへ
Net::SMTPのSTARTTLS対応版であるNet::SMTPSを使って本文を猫っぽい感じに変換しつつ、SSLな通信でSMTP認証してからGmail経由でメールを送信するサンプルコードです。 net-smtps-as-a-sample.pl
#! /usr/bin/env perl
use strict;
use warnings;
use utf8;
use Encode;
use Acme::Nyaa;
use Email::MIME;
use Email::MIME::Creator;
use Net::SMTPS;
use Authen::SASL;
my $from = '"キジトラ" <kijitora@example.com>';
my $rcpt = '"三毛猫" <mikeneko@example.jp>';
my $subj = '年末のご挨拶';
my $mesg = << 'EOM';
いつもお世話になっております、株式会社キジトラのあずまです。
本年も大変お世話になり誠に有り難う御座いました。来年も引き続きご愛顧賜りますよう
従業員一同お願い申し上げます。
EOM
my $nyaa = Acme::Nyaa->new;
my $mime = Email::MIME->create(
'header' => [
'From' => encode( 'MIME-Header-ISO_2022_JP', $from ),
'To' => encode( 'MIME-Header-ISO_2022_JP', $rcpt ),
'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subj ),
],
'attributes' => {
'content_type' => 'text/plain',
'charset' => 'UTF-8',
'encoding' => '8bit',
},
'body' => $nyaa->cat( \$mesg ),
);
my $args = {
'Port' => 587,
'doSSL'=> 'starttls',
'SSL_verify_mode' => 'SSL_VERIFY_NONE',
};
my $user = 'Gmailのユーザ名';
my $pass = 'Gmailのパスワード';
my $smtp = Net::SMTPS->new( 'smtp.gmail.com', %$args );
my $sasl = Authen::SASL->new(
'mechanisms' => 'Digest-MD5',
'callback' => { 'user' => $user, 'pass' => $pass, 'authname' => $user }
);
$smtp->auth( $sasl );
$smtp->mail( [ split( ' ', $from ) ]->[1] );
$smtp->to( [ split( ' ', $rcpt ) ]->[1] );
$smtp->data;
$smtp->datasend( $mime->as_string );
$smtp->dataend;
$smtp->quit;
1;
正しいMIMEのメールデータを手作りするのは骨が折れるというか面倒くさいのでEmail::MIMEを使っていますが、送信部分はNet::SMTPSを使っています。他の選択肢としてはEmail::SenderとかEmail::Sender::Simpleが良さそうですが、そこそこ依存モジュールがたくさんあります。
上記のコードで猫っぽくしている部分は'body' => $nyaa->cat( \$mesg ),
の部分で、あとは猫とは関係のないコードです。
HainekoのMilter
メール送信時に本文を書き換えるコードをもうちょいちゃんと組み込んだものが、僕が夏ごろから作っているHainekoというJSONでメールが送れるHTTPサーバに入っています。
そろそろページが長くなってきたので、また別の何処かの何かに書こうかと思いますが、Haineko::SMTPD::Milter::Nyaaというモジュールで実装していて、設定ファイルでこのMilter(メール用プラグインみたいなの)を使うかどうかを変更出来ます。
参考
猫プロキシを通して何処かのサイトを眺める時、ウィンドウの空いている場所にお気に入りの猫画像を出しておくと、より臨場感が得られるであろう事は自明の理ですので是非お試しください。勿論、猫と暮らしている人は猫を膝の上に乗せて撫でながらサイトを眺めるのが至高です。