現在關報警的方法是先上http://monitor.taobao.com,沒登陸過的話會定向到登陸頁面,之後模糊搜索服務器名,全選報警項 ,關閉.如果有一組機器,整個操作比較費時.
先用firefox和httpfox看了一下關報警的交互過程.剛開始用curl試了試,最後決定用perl來做,因爲中間需要解析html頁面.用的是windows上的active perl,因爲管理機上的cpan我沒權限.
activeperl 自帶LWP,HTTP::Cookies,HTML::TokeParser和調試好助手Data::Dumper;
use LWP;
use HTTP::Cookies;
use Data::Dumper;
use HTML::TokeParser;
輸入主機名和操作,open或close
$host=$ARGV[0];
$operaton=$ARGV[1];
因爲這個系統用到了cookie,所以有cookie可以直接訪問,沒有的話就得輸一次密碼.
my $browser = LWP::UserAgent->new;
#指定cookie文件
$browser->cookie_jar( HTTP::Cookies->new(
'file' => 'cookies.lwp',
# where to read/write cookies
'autosave' => 1,
# save it to disk when done
));
密碼驗證用的是post方法,主要的屬性是id和pass_word
my $url='https://guesthouse.seraph.taobao.com/login/?url=http://monitor.taobao.com/emonitor/attention/my_production_list.htm&client=habo&ver=1.1';
my $response = $browser->post($url,
[
'id' => '用戶名,
'pass_word' => '密碼',
'ver'=>'1.1',
'self_action'=>'login',
'src'=>'gh',
'url'=>'http://monitor.taobao.com/emonitor/attention/my_production_list.htm'
]
);
登陸成功cookies.lwp就會有東西了,基本上一天登一次就足夠了
下面模仿模糊查詢,查詢是get方法
$url='http://monitor.taobao.com/emonitor/itemview/item_view_list.htm?type=dark&hostName=$host&groupName=&itemName=&tag=&orderName=a.health_status&orderUpDown=desc&page=1&pageSize=50';
$response = $browser->get( $url);
print $response->content;
my $content=$response->content;
下面要解析返回的內容,這個頁面裏有一些name屬性是checkid的input標籤,代表了與服務器關聯的報警項目,其中的value屬性將來發post方法時會組合成一條字符串放在ids屬性裏
my $p = HTML::TokeParser->new( \$content);
my @ids;
while (my $token = $p->get_tag('input')) {
my $text = $token->[1]{name};
if ($text eq 'checkids'){
my $value = $token->[1]{value};
#print Dumper($token);
push @ids, $value;
# print '$value\n';
}
}
my $ids=join(',',@ids);
ajaxHostNoticeOpr.do就是負責關報警的,type就是指定開關報警,open或close
$url='http://monitor.taobao.com/emonitor/itemview/ajaxHostNoticeOpr.do';
$response = $browser->post( $url,
[
'ids' => $ids,
'type' => $operation,
]
);
print $response->content;
在這個基礎上就可以實現自動打開或關閉幾十臺機器的報警了