« 【AutoPagerize】Google 画像検索対応スクリプト更新(ver.0.01h) | トップページ | 【LDRize】PictPop:Googleでエラーがでる不具合修正 »

2010/05/03

@nifty ダイナミックDNSのIPアドレスを更新するPerlスクリプト

自宅サーバより@nifty ダイナミックDNSのIPアドレスを更新するためのPerlスクリプトを試作してみました。
#! /usr/bin/perl -w

use strict;
use Encode qw/from_to/;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
use URI::Escape;
use FindBin;

#==============================
my $niftyid="(自分のニフティID)";
my $niftypassword="(自分のパスワード)";
#==============================

my $syscode='euc-jp';   # 実行環境の文字コード

my $wget='wget --secure-protocol=auto -O- -q';

my $path=$FindBin::Bin;
my $lastipfile="$path/last_ipaddr";
my $logfile="$path/ddns_nifty.log";

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
my $timestamp=sprintf("%04d/%02d/%02d %02d:%02d:%02d",1900+$year,1+$mon,$mday,$hour,$min,$sec);

open LOG, ">>$logfile" or die "'$logfile' open error";
print LOG "------------------------------------------------------------\n";
print LOG "[$timestamp]\n";

my $last_ipaddr="";
if (-e $lastipfile) {
    open LASTIP, "<$lastipfile" or die "'$lastipfile' open error";
    $last_ipaddr=<LASTIP>;
    close LASTIP;
}

my $inquiry=`$wget "http://domain.nifty.com/domain/DdnsIpChangeConfirm.do?DDNS_CHANGE_IP=IP%95%CF%8DX%83y%81%5B%83W%82%D6"`;
my $dstcode=guess_encoding($inquiry);
$dstcode='shiftjis' unless ref($dstcode);
from_to($inquiry,$dstcode,$syscode);

$inquiry=~/\d+(\.\d+){3}/ or exit 1;
my $ipaddr=$&;

if ($ipaddr eq $last_ipaddr) {
    print LOG "IP Address not changed. ($ipaddr)\n";
    exit 0;
}

print LOG "New IP Address: $ipaddr ... ";

$inquiry=~/<input.*? name="DDNS_UPDATE_IP_ADDRESS" .*?value="(.*?)"/ or exit 1;
my $confirm_upip=$1;
from_to($confirm_upip,$syscode,$dstcode);
$confirm_upip=uri_escape($confirm_upip);

$inquiry=~/<input.*? name="domain" .*?value="(.*?)"/ or exit 1;
my $domain=$1;
from_to($domain,$syscode,$dstcode);
$domain=uri_escape($domain);

my $postdata="DDNS_UPDATE_IP_ADDRESS=$confirm_upip&domain=$domain";
#print "$postdata\n";

$inquiry=~/<form.*? name="ddnsForm" .*?action="(.*?)"/ or exit 1;
my $url=$1;
$url='http://domain.nifty.com'.$url unless ($url=~/^https?:\/\//);

my $result=`$wget --http-user=$niftyid --http-passwd=$niftypassword --post-data="$postdata" "$url"`;
$dstcode=guess_encoding($result);
$dstcode='shiftjis' unless ref($dstcode);
from_to($result,$dstcode,$syscode);

$inquiry=~/\d+(\.\d+){3}/ or exit 1;
my $rsp_ipaddr=$&;

if ($rsp_ipaddr eq $ipaddr) {
    print LOG "success.\n";
    open LASTIP, ">$lastipfile" or die "'$lastipfile' open error";
    print LASTIP "$ipaddr";
    close LASTIP;
}
else {
    print LOG "failure.\n";
}

close LOG;

exit 0;

今のところ、cronで1時間間隔くらいで回しています。
それにしても、Dynamic DNS用の専用APIが用意されているわけじゃなくて、ベタにページ取得するしか方法ないのね…知らないだけかな?
以前は自動更新するためにDiCE DynamicDNS Client (for Linux)を使用していましたが、【重要】ダイナミックDNSサービスリニューアルのお知らせ - お知らせの関係か、動作しなくなっていたため、仕方なく手動更新になっていました。しかし、最近PCをまともに触れないことも多いため、この機会に簡単なスクリプトを書いてみた次第。
DiCEの方は、上記@niftyのお知らせ内の@nifty.plgに変えてみても、DiCEの設定変更: 物理おもしログを参考に試してみても、なぜかうまく行かなかったので、あんまり調べずに放置していた。
Perlの書き方なんて3光年の彼方にすっとんでいたので、@nifty の ddns を自動更新するなどを参考にさせていただきました。
当該ページ内のスクリプトはリニューアル前のものに対応していて現在は動かなそうですが。

« 【AutoPagerize】Google 画像検索対応スクリプト更新(ver.0.01h) | トップページ | 【LDRize】PictPop:Googleでエラーがでる不具合修正 »

パソコン・インターネット」カテゴリの記事

おもいつき」カテゴリの記事

覚書」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: @nifty ダイナミックDNSのIPアドレスを更新するPerlスクリプト:

« 【AutoPagerize】Google 画像検索対応スクリプト更新(ver.0.01h) | トップページ | 【LDRize】PictPop:Googleでエラーがでる不具合修正 »

戻るリンク追加

カレンダー

2020年3月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

ココログカレンダーPlus(旧2)

検索


    • Web全体 サイト内
    • 蔵書のISBNを入力して下さい
    • はじめる前
      初級者向け
      上級者向け
      ブログ紹介
      結果を表示

コメントリストツリー化

無料ブログはココログ