清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#QQWry.Dat放~/.irssi下,脚本改名叫wry.pl 放~/.irssi/scripts/,然后链接到~/.irssi/scripts/autorun
# include $whois_decip somewhere in your /FORMAT whois
# 作者 x11
# ikk- 改过
use Irssi 20011207;
use strict;
use vars qw($VERSION %IRSSI);
use Text::Iconv;
#use IP::QQWry;
$VERSION = "1.0";
%IRSSI = (
authors => "x11",
contact => "x11.vip\@gmail.org",
name => "wry",
description => "Print the locality of clients when they join/part channels, and whois.",
license => "GPLv2 or later"
);
my $wrydata = Irssi::get_irssi_dir() . "/QQWry.Dat";
if (not -e $wrydata) {
Irssi::print "can't find qqwry.dat, quit ";
return;
}
sub wry2 {
my ($host) =@_;
$host =~ /.*\@(.*)$/;
my $ip = $1;
return '' if not $ip;
return 'mibbit' if $ip =~ /mibbit\./;#不是Ip
return 'WEB' if $ip == '59.36.101.19';
$ip =~ s/\.\w*$/.1/ if $ip =~ /(\d{1,3}\.){3}\w{5,9}/ ; #替换 linuxfire 后ip
if ($ip =~ /[a-zA-Z]/) { #取域名的IP host
$ip =~ /^([\w\.\-\d]*)/;
$ip = $1;
return '' if $ip !~ /\w\./;#没有.; 至少要 xx.com
my $tmp = qx{host $ip | head -n 1};
$tmp =~ /((\d{1,3}\.){3}\d+)$/ ;
$ip = $1;
return '' if $ip !~ /\d\./;#不是Ip
}
my ($ipbegin,$ipend, $ipData1, $ipData2, $DataSeek ,$ipFlag);
my ($ipAddr1,$ipAddr2);
my @ip=split(/\./,$ip);
my $ipNum;
if ($ip[3]) {
$ipNum = $ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];
} else {
$ipNum = $ip[0]*16777216+$ip[1]*65536+$ip[2]*256;
}
open(FILE,"$wrydata");
binmode(FILE);
sysread(FILE,$ipbegin,4);
sysread(FILE,$ipend,4);
$ipbegin=unpack("L",$ipbegin);
$ipend=unpack("L",$ipend);
my $ipAllNum = ($ipend-$ipbegin)/7+1;
my $BeginNum=0;
my $EndNum=$ipAllNum;
Bgn:
my $Middle= int(($EndNum+$BeginNum)/2);
seek(FILE,$ipbegin+7*$Middle,0);
read(FILE,$ipData1,4);
my $ip1num=unpack("L",$ipData1);
if ($ip1num > $ipNum) {
$EndNum=$Middle;
goto Bgn;
}
read(FILE,$DataSeek,3);
$DataSeek=unpack("L",$DataSeek."\0");
seek(FILE,$DataSeek,0);
read(FILE,$ipData2,4);
my $ip2num=unpack("L",$ipData2);
if ($ip2num < $ipNum) {
goto nd if ($Middle==$BeginNum);
$BeginNum=$Middle;
goto Bgn;
}
$/="\0";
read(FILE,$ipFlag,1);
if ($ipFlag eq "\1") {
my $ipSeek;
read(FILE,$ipSeek,3);
$ipSeek = unpack("L",$ipSeek."\0");
seek(FILE,$ipSeek,0);
read(FILE,$ipFlag,1);
}
if ($ipFlag eq "\2") {
my $AddrSeek;
read(FILE,$AddrSeek,3);
read(FILE,$ipFlag,1);
if($ipFlag eq "\2") {
my $AddrSeek2;
read(FILE,$AddrSeek2,3);
$AddrSeek2 = unpack("L",$AddrSeek2."\0");
seek(FILE,$AddrSeek2,0);
} else {
seek(FILE,-1,1);
}
$ipAddr2=<FILE>;
$AddrSeek = unpack("L",$AddrSeek."\0");
seek(FILE,$AddrSeek,0);
$ipAddr1=<FILE>;
} else {
seek(FILE,-1,1);
$ipAddr1=<FILE>;
read(FILE,$ipFlag,1);
if($ipFlag eq "\2") {
my $AddrSeek2;
read(FILE,$AddrSeek2,3);
$AddrSeek2 = unpack("L",$AddrSeek2."\0");
seek(FILE,$AddrSeek2,0);
} else {
seek(FILE,-1,1);
}
$ipAddr2=<FILE>;
}
nd:
close(FILE);
#$/="\n";
my $iconv = Text::Iconv->new("gbk", "utf8");
chomp($ipAddr1);
#chomp($ipAddr2);
#$ipAddr2 =~ s/\s*CZ88\.NET//;
#my $locality = $iconv->convert($ipAddr1.$ipAddr2);
my $locality = $iconv->convert($ipAddr1);
$locality =~ s/IANA//gi;
return $locality;
}#wr y2
sub wry {
my ($host) =@_;
$host =~ /.*\@(.*)$/;
my $ip = $1;
$ip =~ s/\.\w*$/.1/;
return '' if not $ip;
my $qqwry = IP::QQWry->new($wrydata);
my $iconv = Text::Iconv->new("gbk", "utf8");
my $locality = $qqwry->query($ip);
$qqwry->clear();
$locality = $iconv->convert($locality) or $locality = '';
$locality =~ s/IANA//gi;
return $locality;
}
sub client_part {
my ($server, $channame, $nick, $host) = @_;
return if $host =~ /admin.linuxfire.com.cn$/;
#print $channame , ' part ' , $nick ;
my $locality = wry2($host);
$channame =~ s/^://;
my $channel = $server->channel_find($channame);
#$channel->printformat(MSGLEVEL_PARTS, 'part_linuxfire', $nick, $host, $locality, $channel->{name});
Irssi::signal_stop();
return 0;
}
sub client_join {
my ($server, $channame, $nick, $host) = @_;
return if $host =~ /\@netadmin.linuxfire.com.cn$/;
#print $channame , ' join ' , $nick ;
my $locality = wry2($host);
$channame =~ s/^://;
my $channel = $server->channel_find($channame);
$channel->printformat(MSGLEVEL_JOINS, 'join_linuxfire', $nick, $host, $locality, $channel->{name});
Irssi::signal_stop();
return 0;
}
sub client_quit {
my ($server, $nick, $host, $reason) = @_;
return if $host =~ /admin.linuxfire.com.cn$/;
#print ' quit ' , $nick ;
my $locality = wry2($host);
for my $channel (Irssi::channels()) {
if ($channel->nick_find($nick)) {
$channel->printformat(MSGLEVEL_QUITS, 'quit_linuxfire', $nick, $host, $locality, $reason);
}
}
Irssi::signal_stop();
return 0;
}
sub cmd_wry {
my ($nick) = @_;
my $channel = Irssi::active_win()->{active};
$nick =~ s/\s//g;
if (not $nick) {
$channel->print("/wry nickname");
return 0;
}
my $nickinfo = $channel->nick_find($nick);
if ($nickinfo) {
my $locality = wry2($nickinfo->{host});
if ($locality) {
$channel->print("$nick($nickinfo->{host}) is from $locality");
}
else {
$channel->print("$nick($nickinfo->{host}) is from ");
}
}
else {
$channel->print("no such nick: $nick");
}
return 0;
}
Irssi::theme_register([
'join_linuxfire', '=> {hilight $2} {channick_hilight $0} {chanhost_hilight $1} has joined {channel $3}',
'part_linuxfire', '<= $2 {channick $0} {chanhost $1} has left {channel $3}',
'quit_linuxfire', '<= $2 {channick $0} {chanhost $1} has quit [$3]',
]);
#Irssi::expando_create('whois_decip', \&expando_decip, { 'event 311' => 'None' } );
#Irssi::signal_add_first('event 311', 'whois_signal');
Irssi::signal_add('message join', 'client_join');
Irssi::signal_add('message part', 'client_part');
Irssi::signal_add('message quit', 'client_quit');
Irssi::command_bind('wry', 'cmd_wry');