#!/usr/bin/perl -w # Waxy Backlinks v0.07, released August 21, 2003 # Copyright 2003 Andrew Baio, http://www.waxy.org/ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. use strict; # The directory where you want to store the backlink files. # Note: must be writable by your web server my $backlinkdir = '/usr/local/apache/htdocs/backlink_cache'; # The total number of links you want to display for a single entry my $max_links = 10; # The minimum number of hits before a link is displayed my $min_hits = 3; # PHP users should change this to 1 my $php = 0; # get the local host, for exclusion from referers my $localhost = $ENV{HTTP_HOST} ? lc($ENV{HTTP_HOST}) : lc($ARGV[0]); $localhost =~ s/^www\.//i; # Optional: the name of your website and any additional domains # that you don't want counted (e.g. search engines, Hotmail, spammers). # Partial hostnames are fine. my @blacklist = ( $localhost, 'google.', 'lycos.com', 'alltheweb.com', 'srd.yahoo.com', 'mail.yahoo.com', 'search.', 'sitemeter.com', 'ureach.com', 'netscape.com', 'surfnomore.com', 'mastodonte.com', 'latznewmedia.de', 'besttrends.de', 'best-trend.de', 'best-trends.de', 'stone-by-stone.de', 'deutschland-adressen.de', 'spamdexing.org', 'toysexpress.de', 'computer-home-office.us', 'altavista.com', 'webcrawler.com', 'xupiter.com', 'hotbot.com' ); my %blacklist_hash = map { $_ => 1 } @blacklist; my $document = ($php == 1) ? $ARGV[1] : $ENV{DOCUMENT_URI}; $document =~ s|/|\#|g; if (!$document) { exit; } my $referer; if ($php == 1) { $referer = $ARGV[2]; } else { $referer = $ENV{HTTP_REFERER} ? $ENV{HTTP_REFERER} : $ARGV[2]; } &start(); sub start { my %referers = get_referers(); if ($referer) { %referers = save_referer(%referers); } display_referer(%referers); } sub display_referer { my (%referers) = @_; # don't print the header if called from the shell (PHP doesn't need it) unless ($php) { print "Content-type:text/html\n\n"; } unless (scalar(keys %referers) > 0) { return; } # Displayed before the list of backlinks print qq[ Recent Links
]; my %hosts = (); my $i = 0; foreach my $url (sort {$referers{$b} <=> $referers{$a}} keys %referers) { my ($scheme, $host, $rest) = split('//?', $url, 3); $host =~ s/^www\.//i; my $hits = $referers{$url}; next if ($hits < $min_hits); next if (exists $blacklist_hash{$host}); my $visitor = $hits == 1 ? 'visitor' : 'visitors'; # Controls the formatting of the backlinks print qq[ $host ($hits $visitor)
]; $i++; last if ($i >= $max_links); } # Displayed after the list of backlinks print qq[
]; } sub save_referer { my (%referers) = @_; my ($scheme, $host, $rest) = split('//?', $referer, 3); $host = lc($host); unless ($scheme =~ m/^http/i ) { return %referers; } foreach (@blacklist) { if ( $host =~ m/$_/i ) { return %referers; } } if ($rest eq '' or !$rest) { unless ($referer =~ m|/$|) { $referer .= '/'; # add trailing slash } } if ( exists($referers{"$scheme//www.$host/$rest"}) ) { $referers{"$scheme//www.$host/$rest"} += 1; } else { $referers{$referer} += 1; } open (OUT, "> $backlinkdir/$document") or die "Couldn't write file: $!"; foreach my $url (sort {$referers{$b} <=> $referers{$a} } keys %referers) { print OUT "$url\t$referers{$url}\n"; } close (OUT); return %referers; } sub get_referers { my %referers = (); if (-e "$backlinkdir/$document") { open (IN, "< $backlinkdir/$document") or die "Couldn't read file: $!"; while () { chomp; my ($url, $tally) = split(/\t/, $_); $referers{$url} = $tally; } close (IN); } return %referers; }