#! /usr/bin/perl -w use strict; use LWP::UserAgent; my @cartridge = qw/ name part percent remain coverage low serial printed /; my @kit = qw/ name part percent remain /; for my $host( @ARGV ) { my $url = qq{http://$host/hp/device/this.LCDispatcher?dispatch=html&cat=0&pos=2}; my $response = LWP::UserAgent->new->request( HTTP::Request->new( GET => $url )); if( !$response->is_success ) { warn "$host: couldn't get $url: ", $response->status_line, "\n"; next; } $_ = $response->content; my (@s) = grep { defined $_ } m{ (?: > # closing tag ([^<]+) # text (name of part, e.g. q/BLACK CARTRIDGE/)
([^<]+) # part number (e.g. q/HP Part Number: HP C9724A/) \s+\s*]+>]+> (\d+) # percent remaining ) | (?: (?: (?: Pages\sRemaining # different text values | Low\sReached | Serial\sNumber | Pages\sprinted\swith\sthis\ssupply ) : \s*

\s*\s*]*>\s*]*>]*>\s* # separated by this | Based\son\shistorical\s\S+\spage\scoverage\sof\s # or just this, within a ) (\w+) # and the value we want ) }gx; my %res; @{$res{K}}{@cartridge} = @s[ 0.. 7]; @{$res{X}}{@kit} = @s[ 8..11]; @{$res{C}}{@cartridge} = @s[12..19]; @{$res{F}}{@kit} = @s[20..23]; @{$res{M}}{@cartridge} = @s[24..31]; @{$res{Y}}{@cartridge} = @s[32..39]; print <