学内無線LANのferecとかいうのに自動でログインしてみる。

ついでにブラウザのプロキシも変更。*1

#! /usr/bin/perl
use strict;
use warnings;

use LWP::UserAgent;

# パスワード入力時にエコーを消すために使う。
use Term::ReadKey;

# プロキシの設定ファイル。
my $proxy_file = 'C:/proxy.txt';
# プロキシの設定ファイルのバックアップ。ログイン時にこれを作って、ログアウト時に戻す。
my $proxy_file_org = 'C:/proxy.txt.org';
# 設定ファイルの中身。
my $proxy_file_data = <<'EOF';
function FindProxyForURL( url, host )
{
	return "PROXY proxy.uec.ac.jp:8080";
}
EOF
# HTML表示
sub w3m {
  my $html = shift @_;
  open W3M, '| /usr/bin/w3m -dump -T text/html -I EUC -O SJIS'
    or die 'w3mが開けない。' . "$!\n";
  print W3M $html;
  close W3M;
}
# ユーザ名とパスワード
my $user = undef;
my $pass = undef;

if( &login_shiteru ){
  &logout;
  &proxy_file_reset;
}else{
  &login;
  &proxy_file_set;
}
exit;

# ログインしてるか。
sub login_shiteru {
  return ( -e $proxy_file_org );
}

# ログイン
sub login {
  print STDERR 'ログイン' . "\n";

  # ユーザ名確認
  while( not $user ){
    print STDERR "ユーザ名 : ";
    $user = <STDIN>;
    chomp $user;
  }
  # パスワード確認
  while( not $pass ){
    print STDERR "パスワード : ";
    ReadMode 'noecho';  # 画面にエコーしないように。
    $pass = ReadLine 0; # 1行読み取り。
    chomp $pass;
    ReadMode 'normal'; # 画面のモードを元に戻す。
    print "\n"; # 改行がでないので。
  }

  # 送信
  my $ua = new LWP::UserAgent;
  my $url = 'https://ferec.cc.uec.ac.jp/cgi-bin/ferec.cgi';
  my $res = $ua->post( $url,
                       {
                         user => $user,
                         pass => $pass,
                       } );
  if( $res->is_error ){
    w3m( $res->error_as_HTML );
    die "post失敗。\n";
  }
  
  # 認証結果を出力。
  w3m( $res->content );
}

# ログアウト
sub logout {
  print STDERR 'ログアウト' . "\n";

  # 送信
  my $ua = new LWP::UserAgent;
  my $url = 'https://ferec.cc.uec.ac.jp/cgi-bin/ferec.cgi?logout=';
  my $res = $ua->get( $url );
  if( $res->is_error ){
    w3m( $res->error_as_HTML );
    die "get失敗。\n";
  }
  # 認証結果を出力。
  w3m( $res->content );
}

# 内部用設定ファイルに書き換え。
sub proxy_file_set {
  # 元の設定ファイルを、名前変更して残す。
  rename $proxy_file, $proxy_file_org
    or die '設定ファイルのバックアップが作れない。' . $!;

  # 新しい設定ファイルを作る。
  open FILE, ">", $proxy_file
    or die 'ファイル(' . $proxy_file . ')が作れない。' . $!;
  print FILE $proxy_file_data;
  close FILE;
}

# 元の設定ファイルに戻す。
sub proxy_file_reset {
  # 元の設定ファイルを戻す。
  rename $proxy_file_org, $proxy_file
    or die '設定ファイルが元に戻せない。' . $!;
}
__END__