はてなダイアリーコンフィギュレータ(略称:はてダコ)

はてなダイアリーを自動設定

結城浩

はてなダイアリーコンフィギュレータ(略称:はてダコ)は、 ローカルファイルの内容を元に、 はてなダイアリーの詳細設定を行うコマンドラインツールです。

目次

はじめに

一言でいえば、 「はてダラ」の「詳細設定」版と思ってください。

使い方は次の通り。

「はてダコ」スクリプト本体のダウンロード

以下の内容をコピーしてhatedako.plという名前のファイルにしてください。

注意: このスクリプトは無保証です。あなたの自己責任でご利用ください。

#!/usr/bin/perl
#
# hatedako.pl - Hatena Diary Configurator.
#
# Copyright (C) 2004 by Hiroshi Yuki.
# <hyuki@hyuki.com>
# http://www.hyuki.com/techinfo/hatedako.html
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
use strict;
my $VERSION = "0.0.0";

use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Cookies;
use Data::Dumper;

# Prototypes.
sub login();
sub logout();
sub configure_it($);
sub read_configuration();
sub print_debug(@);
sub print_message(@);
sub error_exit(@);

my $debug = 0;

# Hatena user id (if empty, I will ask you later).
my $username = '';

# Hatena password (if empty, I will ask you later).
my $password = '';

# Proxy setting.
my $http_proxy = '';

# Hatena URL.
my $hatena_url = 'http://d.hatena.ne.jp';

# Option for LWP::UserAgent.
my %ua_option = (
    agent => "HatenaDiaryConfigurator/$VERSION", # "Mozilla/5.0",
    timeout => 180,
);

# Other variables.
my $cookie_jar;
my $user_agent;

# Style file.
my $style_file = $ARGV[0];
unless ($style_file) {
    error_exit("Usage: perl hatedako.pl style-file");
}

# Start.
&main;

# no-error exit.
exit(0);

# Main sequence.
sub main {
    # Login if necessary.
    login() unless ($user_agent);

    # Read configuration.
    my $formref = read_configuration();

    # Configure it.
    configure_it($formref);

    # Logout if necessary.
    logout if ($user_agent);
}

# Login.
sub login() {
    $user_agent = LWP::UserAgent->new(%ua_option);
    $user_agent->env_proxy;
    if ($http_proxy) {
        $user_agent->proxy('http', $http_proxy);
        print_debug("login: proxy: $http_proxy");
    }

    # Ask username if not set.
    unless ($username) {
        print "Username: ";
        chomp($username = <STDIN>);
    }

    # Ask password if not set.
    unless ($password) {
        print "Password: ";
        chomp($password = <STDIN>);
    }

    my %form;
    $form{key} = $username;
    $form{password} = $password;

    print_message("Login to $hatena_url as $form{key}.");

    my $r = $user_agent->simple_request(
        HTTP::Request::Common::POST("$hatena_url/login", \%form)
    );

    print_debug("login: " . $r->status_line);

    if (not $r->is_redirect) {
        error_exit("Login: Unexpected response: ", $r->status_line);
    }

    print_message("Login OK.");

    print_debug("login: Making cookie jar.");

    $cookie_jar = HTTP::Cookies->new;
    $cookie_jar->extract_cookies($r);

    print_debug("login: \$cookie_jar = " . $cookie_jar->as_string);
}

# Logout.
sub logout() {
    return unless $user_agent;

    my %form;
    $form{key} = $username;
    $form{password} = $password;

    print_message("Logout from $hatena_url as $form{key}.");

    $user_agent->cookie_jar($cookie_jar);
    my $r = $user_agent->get("$hatena_url/logout");
    print_debug("logout: " . $r->status_line);

    if (not $r->is_redirect and not $r->is_success) {
        error_exit("Logout: Unexpected response: ", $r->status_line);
    }

    print_message("Logout OK.");
}

sub configure_it($) {
    my ($formref) = @_;

    print_debug("configure_it: ", Dumper($formref));

    $user_agent->cookie_jar($cookie_jar);

    my $r = $user_agent->simple_request(
        HTTP::Request::Common::POST("$hatena_url/$username/configdetail", $formref)
#           Content_Type => 'form-data',
#           Content => [
#                %$formref,
#            ]
#        )
    );

    print_debug("configure_it: " . $r->as_string);
    print_debug("configure_it: " . $r->status_line);

    if (not $r->is_success) {
        error_exit("Post: Unexpected response: ", $r->status_line);
    }

    # Success.
    return 1;
}

# Read configuration.
sub read_configuration() {
    my %form;
    my $multiline = undef;

    open(FILE, $style_file) or error_exit("read_configuration: $!: $style_file");
    while (<FILE>) {
        chomp;
        if ($multiline) {
            if (/^$multiline:end$/) {
                $multiline = undef;
            } else {
                $form{$multiline} .= "$_\n";
            }
        } else {
            if (/^$/) {
                next;
            } elsif (/^#/) {
                next;
            } elsif (/^(\w+):begin$/) {
                $multiline = $1;
            } elsif (/^(\w+)=(.*)/) {
                my ($name, $value) = ($1, $2);
                if (defined($form{$name})) {
                    # Multiple values.
                    if (ref($form{$name}) eq "ARRAY") {
                        push(@{$form{$name}}, $value);
                    } else {
                        my @values;
                        push(@values, $form{$name}, $value);
                        $form{$name} = \@values;
                    }
                } else {
                    $form{$name} = $value;
                }
            } else {
                error_exit("read_configuration: Invalid line: $_");
            }
        }
    }
    close(FILE);

    if (defined($multiline)) {
        error_exit("read_configuration: Missing '$multiline:end' line.");
    }

    return \%form;
}

# Debug print.
sub print_debug(@) {
    if ($debug) {
        print "DEBUG: ", @_, "\n";
    }
}

# Print message.
sub print_message(@) {
    print @_, "\n";
}

# Error exit.
sub error_exit(@) {
    print "ERROR: ", @_, "\n";
    exit(1);
}

スタイルファイル

「はてダコ」用の入力ファイルです。

以下の内容をコピーしてstyle.txtというファイル名で保存してください。

# ★設定の仕方
# ・基本的に行単位の処理
# ・行頭に # がある行はコメント(または無効にしたいキーワード)
# ・通常は「キーワード=値」の形式で指定
# ・複数行の場合には「キーワード:begin」という行から「キーワード:end」という行までの範囲
# ■モード(固定)
mode=enter
# ■タイトル
title=日記
# ■日記の公開(0=パブリック, 1=プライベート)
permission=0
# ■閲覧許可ユーザー(tarou|hanako)
allowuser=
# ■プライベート用メッセージ
privateheader:begin
privateheader:end
# ■テーマ(最新の名前は http://d.hatena.ne.jp/help#theme )
# 3minutes, 3pink, 270b, 270g, 270or, 270pk, 90, alfa,
# another_blue, aoikuruma, aqua, asterisk-blue, asterisk-orange, asterisk-pink,
# arrow, autumn, babypink, bill, bistro_menu, black-lingerie,
# black_mamba, blackbox, blue-border, blue-feather, bluegrad, bluely, book,
# book2-feminine, book3-sky, bright-green, britannian, brown, bubble, candy,
# cards, cassis, cat, check, cherry, chiffon_leafgreen, chiffon_pink,
# chiffon_skyblue, choochoo, christmas, citrus, city, clover, cool_ice, cosmos,
# cross, darkness-pop, darkwhite, date, deepblue, default, delta,
# desert, diamond_dust, dice, dog, dot, dot-lime, dot-orange, dot-sky,
# double, earth-brown, easy, emboss, fine, flower, fluxbox, fluxbox2,
# fluxbox3, fri, futaba, garden, gardenia, gear, germany, gingham-blue,
# gingham-gray, gingham-green, gingham-purple, gingham-yellow, giza, glass,
# gold, grape, gray, gray-note, gray2, green-border, green-tea,
# greentea3, ha, happa, haru, hatena, value=, hellali, himawari, husen,
# hydrangea, iris, kaeru, kaizou, kaki, kanban, kanshin, kasumi,
# kitchen-natural, kotatsu, kurenai, kurotokage, light-blue, lightning, lime,
# line, line-orange, loose-leaf, lovely, lovely_pink, lr, madrascheck,
# magic, marguerite, maroon, matcha, memo, memo2, memo3, menu, metal,
# midnight, mintblue, mirage, momonga, mono, monotone, moo, nachtmusik,
# nahanaha, nande-ya-nen, narrow, natural_gray, navy, nebula, nenga,
# nippon, noel, note, ocha, old-pavement, orange, orange-blue,
# orange-border, orangegrad, pain, pale, paper, pastelpink, pearl, petith,
# petith-b, pettan, pict, pink-border, pinkgrad, piyo-family, plum,
# pokke-blue, pokke-orange, pool_side, pudding, puppy, purple_sun,
# quiet_black, query000, query011, query101, query110, query111or, rain,
# rainy-season, rasuta, rectangle, redgrid, repro, right, rim-daidaiiro,
# rim-fujiiro, rim-mizuiro, rim-sakurairo, rim-tanpopoiro, rim-wakabairo,
# russet, s-blue, s-pink, sagegreen, sakana, sakura, savanna, scarlet,
# seam-line, sepia, sidelight, silver, silver2, simple, simpleblack, sky,
# smoking_black, smoking_gray, smoking_white, snake, snow_man, snowy, soda,
# spring, starlight, stripe, subdued, summer_wave, sunset, tag, tdiary1,
# teacup, thin, tile, tinybox, tinybox_green, town, triple_gray, tuki,
# utsusemi, w2k_button, wall1, wall2, wall3, wall4, wall5_tatami, white,
# white-lingerie, whiteout, will, windowz, wine, winter, wood, xmas, xmastree,
# xxx, yukon,
theme=hatena
# ■ヘッダの色(de, dg, gr, pr, br, rd, sp, pk, te, lg, lb, wh, or, li, bl)
ucolor=de
# ■日記へのコメント(0=なし(表示しない), 1=ユーザー(はてなユーザーのみ), 2=ゲスト(誰でも))
allowcomment=1
# ■コメント拒否ユーザー(idを|で区切る)
denycommentuser=
# ■コメントが登録時のメール通知(0=指定なし, 1=自分のアドレスへ通知)
sendmail=0
# ■トラックバックの表示(0=コメントページに, 1=なし, 2=日記ページ・コメントページの両方に)
hidetrackback=2
# ■日記のリンク元を公開しない(1=公開しない)
# hidereferer=1
# ■日付指定がない日記へのリンクは記録しない(1=記録しない)
# ignoretopref=1
# ■リンク元の記録(0=最新の日付の日記, 1=リンク先の日付の日記, 2=最新とリンク先の両方の日付の日記)
referto=0
# ■日記更新時にpingを送信する(1=送信する)
# sendping=1
# ■ページビューをリセットする(1=リセットする)
# countreset=1
# ■携帯電話番号
mobilephone=
# ■1ページの表示日数
diarylimit=5
# ■日付の書式
# %Y(2003)、%y(03)、%m(01..12)、%c(1..12)、%d(00..31)、%e(0..31)、%a(Sun..)、%W(Sunday..)
dateformat=%Y-%m-%d
# ■日付の変わる時刻
delaytime=6
# ■新しい書き込みの追加方向(0=下, 1=上)
direction=0
# ■キーワードの自動リンク(不要なものをコメントする)
# 読書
linkcname=book
# 音楽
linkcname=music
# 映画
linkcname=movie
# ウェブ
linkcname=web
# コンピュータ
linkcname=elec
# 動物
linkcname=animal
# アニメ
linkcname=anime
# 食
linkcname=food
# スポーツ
linkcname=sports
# ゲーム
linkcname=game
# マンガ
linkcname=comic
# アイドル
linkcname=idol
# 地理
# linkcname=geography
# アート
linkcname=art
# はてな
linkcname=hatena
# はてなダイアリークラブ
linkcname=club
# ■自動リンクするキーワードの最低スコアを指定する
linkscore=0
# ■ページのヘッダ(HTMLタグ利用可)
uheader:begin
uheader:end
# ■ページのフッタ(HTMLタグ利用可)
ufooter:begin
ufooter:end
# ■スタイルシート
style:begin
span.highlight {
    color: black;
    background-color: yellow;
}
img.photo {
    float: right;
    margin: 10px;
    border: 0;
}
a.keyword {
    text-decoration: none;
    border-bottom: 1px solid gray;
}
style:end

更新履歴

関連リンク

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

豊かな人生のための四つの法則