ishiducaの日記 このページをアンテナに追加 RSSフィード

2011-05-28

[][]WWW::Pixiv::Downloadでキャッシュに画像を保管する 11:52 WWW::Pixiv::Downloadでキャッシュに画像を保管する - ishiducaの日記 を含むブックマーク はてなブックマーク - WWW::Pixiv::Downloadでキャッシュに画像を保管する - ishiducaの日記 WWW::Pixiv::Downloadでキャッシュに画像を保管する - ishiducaの日記 のブックマークコメント

一時的にキャッシュする需要があるのかは別として。

memcachedBASE64エンコーディングしてキャッシュすればいいかなと

p5-www-pixiv-download/eg/cache2memcached.pl ishiduca/p5-www-pixiv-download - GitHub」に置いてあるので、勝手に弄ってください

#!/usr/bin/env perl
use strict;
use warnings;
use Cache::Memcached::Fast;
use MIME::Base64;
use Config::Pit;
use WWW::Pixiv::Download;

@ARGV or die qq(usage: $0 illust_id\n);
my $illust_id = $ARGV[0];

my $cache = Cache::Memcached::Fast->new({
    servers => [ "localhost:11211" ],
});

my $config = pit_get('www.pixiv.net', require => {
    pixiv_id => '', pass => '',
});
die qq(! failed: can not pit_get\n) if ! %$config;

my $client = WWW::Pixiv::Download->new(
    pixiv_id   => $config->{pixiv_id},
    pass       => $config->{pass},
    look       => 1,
    over_write => 1,
);


my($buf, $stuffix);
$client->download($illust_id, {
    mode => 'm',
    cb   => sub {
        my($chunk, $res, $proto) = @_;
        unless ($stuffix) {
            $stuffix = $res->header('Content-Type');
            $stuffix =~ s|image/||;
        }
        local $/;
        $buf .= $chunk;
    },
});

# memcachedに書き込み
$cache->set($illust_id,  encode_base64 $buf) or die $!;

# 書き込んだデータを読み込んで出力&memcachedから削除
test_print( $illust_id, "${illust_id}.${stuffix}");

sub test_print {
    my($illust_id, $filed_path) = @_;

    open my $fh, '>', $filed_path or die $!;
    binmode $fh;
    print $fh decode_base64 $cache->get($illust_id);
    close $fh;

    $cache->delete($illust_id);
}

もっといい方法があるはずなので、ツッコミよろしくお願いします。

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20110528

2010-07-27

[][][]はじめてのTwitter bot 設定とか 17:18 はじめてのTwitter bot 設定とか - ishiducaの日記 を含むブックマーク はてなブックマーク - はじめてのTwitter bot 設定とか - ishiducaの日記 はじめてのTwitter bot 設定とか - ishiducaの日記 のブックマークコメント

前回のはじめてのTwitter botを実際に自動化するのにいくつかハードルを越えなくちゃいけないので、その辺をフォローします。ただし、僕のMacBookOS 10.6)上での話。

おさらいとして、Twitter bot を作るまでの流れ

  • bot用のアイコンを作っておく
  • bot用のアカウントを取得しておく
  • bot用のアカウントで使うアプリケーション(この場合はbot.pl)用にOAuth登録を済ませておく
  • memcachedをインストールしておく
  • 起動時にmemcachedをデーモンプロセスで作動するように設定する
  • botのスクリプトを作る
  • cronでbotを作動させるcrontabの設定をする

bot用のアイコンを作っておく

ここは流す。(僕は /Icon Generator - Generate CS5 or Web 2.0 style icon を使いました)


ボット用のアカウントを取得しておく

ここも流す。


bot用のアカウントで使うアプリケーション(この場合はbot.pl)用にOAuth登録を済ませておく

前出ですが「実用! PerlでコマンドラインからTwitter投稿(OAuth対応) - perl-mongers.org」を参照して取得してください。


memcachedをインストールしておく

OS 10.6 の場合、macport からインストールできる

sudo ports install memcached

起動時にmemcachedをデーモンプロセスで作動するように設定する

memcachedをインストールしたときに作成されたplistを利用する

sudo launchctl load -w /Library/LaunchDaemons/org.macports.memcached.plist

細かく設定したい場合は、plistをいじる


botのスクリプトを作る

前回記事をみてください。


cronでbotを作動させるcrontabの設定をする

ここで困るのが、perlbrew+cpanmな環境でcpanモジュールを使ったperlスクリプトを動かそうとしても、うまく作動しないことがあるということだ。具体的にはperlbrewでインストールしたperlを使わずにデフォルトでインストールされているperlを使おうとしてしまう。

なので、cronを実行するときには

crontab -e

として、環境変数を追加する

PATH=/Users/ユーザー名/perl5/perlbrew/bin:/usr/bin:/usr/sbin:/bin:sbin

あとは、適当な間隔(例だと3min)で動くように設定する

*/3 * * * * perl /Users/ユーザー名/スクリプトのあるディレクトリ名/bot.pl

できあがり

http://twitter.com/tkdhoncho_bot

treeboatreeboa2010/07/27 18:27ホォオオオ!cronはそのためのやつだったのか
bot作るだけでも案外たいへんそう
うまくまとめられてて サスガ^^b

SarahSarah2013/02/02 03:18Peecrft shot! Thanks for your post!

vfvvalkovfvvalko2013/02/02 19:28kGFiT1 <a href="http://ymammxedvual.com/">ymammxedvual</a>

iecqvvlvriecqvvlvr2013/02/04 12:42J0vNbo <a href="http://bxzqjxelvbss.com/">bxzqjxelvbss</a>

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100727

2010-07-22

[][][]はじめてのTwitter bot 16:19 はじめてのTwitter bot - ishiducaの日記 を含むブックマーク はてなブックマーク - はじめてのTwitter bot - ishiducaの日記 はじめてのTwitter bot - ishiducaの日記 のブックマークコメント

TwitterAPIから任意のハッシュタグのついたツイートを拾ってRTするbotを作ってみました。

巷にTwitter botは溢れているから今更な感じしますが、僕は初めて!(だから問題ない)


流れとしては

  1. TwitterAPIに検索ワードを投げる
  2. レスポンスをパースする
  3. 前回の検索で引っかかったツイートまたは、それをもとにRTしたツイートしたツイートと、それら以外のツイート(今回の検索で引っかかったツイート)を分ける
  4. 今回RTするツイートを整形する
  5. 今回RTするツイートをmemcachedに記憶する
  6. RTする

拾ってきたツイートをRTするだけだと、重複があったり、またbot自身がRTしたツイートを再度ツイートしてしまってスパムボットになってしまうので、それらを弾くためにキャッシュを使って前回までのポストを記憶しておくと楽チンです。今回は memcached を使って実装してみました。


事前にやっておくこと

  • bot用のアイコンを作っておくこと(これ重要w)
  • bot用のアカウントを取得しておく
  • bot用のアカウントで使うアプリケーション(この場合は bot.pl )用にOAuth登録をしておく(consumer key, consumer serect, access token, access token secret)
  • memcachedをインストール、起動しておく

(bot.pl)

use strict;
use warnings;
use LWP::UserAgent;
use JSON;
use OAuth::Lite::Consumer;
use Cache::Memcached::Fast;
use Encode;

my $keyword = '%23tkdhoncho';
my $user_id = 'Bot UserID';

my $cache = Cache::Memcached::Fast->new({
    servers => [ "localhost:11211" ]
});

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key    => 'Bot Consumer Key',
    consumer_secret => 'Bot Consumer Serect',
);
my $access_token = OAuth::Lite::Token->new(
    token  => 'Bot Access Token',
    secret => 'Bot Access Token Secret',
);

my $ua = LWP::UserAgent->new;
$ua->timeout(10);

my $uri = "http://search.twitter.com/search.json?q=$keyword";

my $response = $ua->get( $uri );
die $response->decoded_content unless $response->is_success;

my $result = decode_json($response->{_content});

for (@{$result->{results}}) {
    my $id = $_->{id};

    if ((! $cache->get($id)) and ($_->{from_user_id} ne $user_id)) {
        my %stat = (
            friend => $_->{from_user},
            tweet  => $_->{text},
        );

        $cache->set($id, \%stat);

        $stat{tweet} =~ s/@/!/g;
        my $tweet  = 'RT !' . $stat{friend} . '>>' . $stat{tweet};
        $tweet = substr $tweet, 0, 140;

        my $request = $consumer->gen_oauth_request(
            method => "POST",
            url    => 'http://twitter.com/statuses/update.json',
            token  => $access_token,
            params => { status => encode_utf8($tweet) },
        );
        my $response = $ua->request($request);

        die $response->status_line unless $response->is_success;
 
        warn join(" ", $id, encode_utf8($tweet)) . "\n";
    }
}

exit 0;

あとはcronを使って定期的に実行させます。

参照

追記

memcachedの導入やらcronの設定を「はじめてのTwitter bot 設定とか - ishiducaの日記 - Hatena::Group::Perl」に書きました。

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20100722