#!/usr/bin/perl ################################################## # # # ARCS :: AdvertPro v3.4 :: DBI/MySQL # # Copyright 1999,2000 by ARCS # # Email - support@advertpro.com # # # ################################################## ########################################################################### ###CHANGES LOG: ###DATED: 26-04-2002 ###BY: VIKAS ,SAMEER & RAJ ###Added IF statement on line 138 for calling the functions again when none of banner ios choosen. added new Variable $excludeAcc for storing the Account name which has to be excluded from fetching because that account dont have banner for this region (or not has to be shown for this IP ). changes in (Functions) chosenAccount,getBannersfixAccountsWeight. ########################################################################### # Program Variables $domain = 'http://ads.webulagam.com'; $admin_script = 'http://ads.webulagam.com/cgi-bin/advertpro/admin/admin.pl'; $ads_script = 'http://ads.webulagam.com/cgi-bin/advertpro/banners.pl'; $ads_script_path = '/cgi-bin/advertpro/banners.pl'; $log_script = 'http://ads.webulagam.com/cgi-bin/advertpro/admin/log.pl'; $stats_script = 'http://ads.webulagam.com/cgi-bin/advertpro/stats.pl'; $blink_script = 'http://ads.webulagam.com/cgi-bin/advertpro/blink.pl'; $bimg_script = 'http://ads.webulagam.com/cgi-bin/advertpro/bimg.pl'; $archive_script = 'http://ads.webulagam.com/cgi-bin/advertpro/admin/archive.pl'; $remote_script = 'http://ads.webulagam.com/cgi-bin/advertpro/remote.pl'; $plugin_url = 'http://ads.webulagam.com/cgi-bin/advertpro/plugins'; $images_url = 'http://ads.webulagam.com/advertpro/admin_images'; $archive_dir = '/home/websites/webulagam/html/advertpro/archives'; $archive_url = 'http://ads.webulagam.com/advertpro/archives'; # MySQL Database $username = "root"; $password = "mysql788999r"; $database = "webulagam_prod"; $host = "localhost"; $port = "3306"; # System $mailprog = '/usr/lib/sendmail'; $admin_email = 'webmaster@epatra.com'; # Set this the FIRST TIME you install $install_date = "2000-09-13 00:00:00"; # Temporary database records timeout # 3000 = 30 minutes, 10000 = 1 Hour, 20000 = 2 hours $LOGGED_TIMEOUT = 10000; # Timeout to accept non-unique click-throughs # 3000 = 30 minutes, 10000 = 1 Hour, 20000 = 2 hours $CLICK_TIMEOUT = 20000; ################################################## # * DO NOT CHANGE ANYTHING BELOW THIS LINE * # ################################################## $VERSION = "3.4.0.0.0"; $DEMO = 0; ################################################## %tables = ( "accounts" => "advert_accounts", "banners" => "advert_banners", "daily" => "advert_daily", "logged" => "advert_logged", "logs" => "advert_logs", "regions" => "advert_regions" ); @browser = ( "AOL||AOL", "MSN||MSN", "WebTV||WebTV", "Lynx||Lynx", "NeoPlanet||NeoPlanet", "NetCaptor||NetCaptor", "NetPositive||NetPositive", "MSIE||Internet Explorer", "Opera||Opera", "Nav||Netscape", "Netscape||Netscape", "Mozilla||Netscape" ); %os = ( "AIX" => "AIX", "BSD" => "BSD", "IRIX" => "IRIX", "Linux" => "Linux", "Mac" => "Mac", "Sun" => "Sun", "Unix" => "Unix", "Win32" => "Windows 3.2", "Windows 95" => "Windows 95", "Win95" => "Windows 95", "Windows 98" => "Windows 98", "Win98" => "Windows 98", "Windows NT" => "Windows NT", "WinNT" => "Windows NT" ); ################################################## use DBI; ##### Resetting Varibles ($db, $forminfo, @key_value_pairs, $pair, $key, $value, %FORM, $argv, @ARGV, $dbc, @data, $UNIQUE, $KEYWORDS, @keywords, $keyword, $count, %accounts, %accountViews, %banners, %bannerAccounts, %bannerViews, %bannerLifeViews, %bannerMaxViews, %bannerStartDate, %bannerStopDate, %bannerOs, %bannerBrowser, %bannerDomain, $accountTotal, $accountViewTotal, $accountWeightTotal, @accounts, $accounts, $ratio, $diff, $chosenAccount, $valid, $startDate, $stopDate, $startTime, $stopTime, $totalDays, $partialDays, $totalHours, $partialHours, $browser, $os, $hostname, $iaddr, @domains, $domain, @banners, $banners, $bannerTotal, $bannerViewTotal, $bannerWeightTotal, $chosenBanner, $panic, $code, $imageurl, $redirect, $width, $height, $border, $alt, $target, $mouseover, $mouseout, $textlink, $check, $idnum, $referrer, @code, $x, $y, $string, $strings, @string, $form, $finalCode, $account, $groupid, $query, $sec, $min, $hour, $day, $mon, $yr, $weekday, $timestamp, $bust, $aDate, $bDate, $aYear, $aMonth, $aDay, $bYear, $bMonth, $bDay, $tDays, $error, $error_cause, %accountOffset, %bannerOffset, $offset,@excludeAccount,$excludeAcc,$RemoteIP) = ""; ################################################## &parse; &click unless $FORM{'mode'} ne "CLICK"; &rich unless $FORM{'mode'} ne "RICH"; &form unless $FORM{'mode'} ne "FORM"; ################################################## ($hour, $weekday) = (localtime(time))[2,6]; $hour = sprintf("%02d",$hour); $db = DBI->connect("DBI:mysql:$database:$host:$port", "$username", "$password") || &cgiError ("Connection Failed:", "$DBI::errstr"); &getUniqueBanners; &getAccounts; &fixAccountWeights; &chooseAccount; &getBanners; #PrintLogs("\n-----\nBANNTOTAL: $bannerTotal & CHOSEN ACCOUNT : $chosenAccount : TOTAL ACCOUNT: $accountTotal"); for($i=0;$i<$accountTotal;$i++) { if ($bannerTotal eq "" && $chosenAccount ne '') { push(@excludeAccount,$chosenAccount); $excludeAcc=''; $excludeAcc=join(',',@excludeAccount); $excludeAcc=~ s/^,//g; #PrintLogs("Exclude Account : $excludeAcc"); $weightTotal = 0; $accountViewTotal = 0; $accountTotal=0; &getAccounts; &fixAccountWeights; &chooseAccount; &getBanners; }else { last; } } &fixBannerWeights; &chooseBanner; &logInfo; $db->disconnect; &displayBanner; exit; ################ # sub routines # ################ sub parse { if ($ENV{'QUERY_STRING'} eq "") { $forminfo = ; } else { $forminfo = $ENV{'QUERY_STRING'}; } if ($forminfo ne "") { @key_value_pairs = split(/&/,$forminfo); foreach $pair (@key_value_pairs) { ($key,$value) = split(/=/,$pair); $value =~ s/\\+/ /g; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $FORM{$key} = $value; } } else { foreach $argv (@ARGV) { ($key, $value) = split(/\=/,$argv); $FORM{$key} = $value; } } $FORM{'refresh'}=""; } sub getAccounts { my $qry=""; if (($FORM{'keyword'} eq "NULL" || $FORM{'keyword'} eq "") && $FORM{'name'} eq "") { $qry="SELECT DISTINCT b.account,a.weight FROM $tables{'banners'} b, $tables{'accounts'} a, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND a.name=b.account AND a.status='1' AND b.status='1' AND r.name='$FORM{'region'}' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour'))$UNIQUE" ; } elsif ($FORM{'name'} eq "") { $FORM{'keyword'} =~ s/\%20/ /g; @keywords = split(/\s+/,$FORM{'keyword'}); foreach $keyword (@keywords) { $query .= " OR b.keywords LIKE '%$keyword%'"; } $qry="SELECT DISTINCT b.account,a.weight FROM $tables{'banners'} b, $tables{'accounts'} a, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND a.name=b.account AND a.status='1' AND b.status='1' AND r.name='$FORM{'region'}' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour')) AND (b.keywords LIKE '%$FORM{'keyword'}%'$query)$UNIQUE"; $dbc=$db->prepare($qry); $dbc->execute; while (@data = $dbc->fetchrow_array()) { $matches++; } $dbc->finish; if ($matches > 0) { $qry="SELECT DISTINCT b.account,a.weight FROM $tables{'banners'} b, $tables{'accounts'} a, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND a.name=b.account AND a.status='1' AND b.status='1' AND r.name='$FORM{'region'}' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour')) AND (b.keywords LIKE '%$FORM{'keyword'}%'$query)$UNIQUE"; } else { $qry="SELECT DISTINCT b.account,a.weight FROM $tables{'banners'} b, $tables{'accounts'} a, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND a.name=b.account AND a.status='1' AND b.status='1' AND r.name='$FORM{'region'}' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour'))$UNIQUE" ; } } else { $qry="SELECT DISTINCT b.account,a.weight FROM $tables{'banners'} b, $tables{'accounts'} a WHERE b.name='$FORM{'name'}' AND a.name=b.account"; } $dbc=$db->prepare($qry); $dbc->execute; ###PrintLogs("QUERY : $qry \n"); while (@data = $dbc->fetchrow_array()) { if (!grep(/$data[0]/,$excludeAcc) ) { #PrintLogs("GETACCOUNTS: $data[0] "); $accounts{$data[0]} = "$data[1]||0"; $weightTotal += $data[1]; $accountTotal++; } } $dbc->finish; $dbc = $db->prepare("SELECT a.name,SUM(d.views) FROM $tables{'accounts'} a, $tables{'daily'} d WHERE a.status='1' AND a.name=d.account AND d.region='$FORM{'region'}' AND d.date=NOW() GROUP BY a.name") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { if (!grep(/\b$data[0]\b/,$excludeAcc) ) { if ($accounts{$data[0]} ne "") { $accounts{$data[0]} =~ s/\|\|0/\|\|$data[1]/g; $accountViewTotal += $data[1]; } } } $dbc->finish; $dbc = $db->prepare("select a.name,sum(b.views),sum(b.clicks),a.views,a.clicks from $tables{'banners'} b,$tables{'accounts'} a where a.name=b.account and a.status='1' and (a.views<>0 or a.clicks<>0) group by b.account"); # $dbc->execute(); # # while(@data = $dbc->fetchrow_array()) # { # if(($data[3] ne 0 && $data[1]>=$data[3]) || ($data[4] ne 0 && $data[2]>=$data[4])) # { # delete $accounts{$data[0]}; # } # } # $dbc->finish; } sub fixAccountWeights { if ($accountTotal > 0) { if ($weightTotal < 100) { $add = ((100 - $weightTotal) / $weightTotal); foreach $key (keys %accounts) { if (!grep(/\b$key\b/,$excludeAcc) ) { ($weight, $views) = split(/\|\|/,$accounts{$key}); $weight += ($weight * $add); $accounts{$key} = "$weight||$views"; } } } if ($weightTotal > 100) { $subtract = (($weightTotal - 100) / $weightTotal); foreach $key (keys %accounts) { if (!grep(/\b$key\b/,$excludeAcc) ) { ($weight, $views) = split(/\|\|/,$accounts{$key}); $weight -= ($weight * $subtract); $accounts{$key} = "$weight||$views"; } } } } } sub chooseAccount { if ($accountViewTotal > 0 && $accountViewTotal ne "" && $accountTotal > 0 && $accountTotal ne "") { $accountViewAverage = (($accountViewTotal / $accountTotal) / $weightTotal); $accountNewFactor = int(rand(3)); } foreach $key (keys %accounts) { if (!grep(/\b$key\b/,$excludeAcc) ) { ###PrintLogs("Accounts HASH KEY: $key VALUE: $accounts{$key} "); ($weight, $views) = split(/\|\|/, $accounts{$key}); if ($accountViewAverage > 0 && $views > 0 && $accountNewFactor != 1 && ($views / ($accountViewAverage * $weight)) < .50) { $views += ($accountViewAverage * ($weightTotal / $accountTotal)); } if ($accountViewTotal > 0 && $accountViewTotal ne "") { $ratio = (($views / $accountViewTotal) * 100); $diff = ($weight - $ratio); } else { $diff = 0; $ratio = 0; } #PrintLogs("WEIGHT: $weight RATIO: $ratio"); #PrintLogs("MAGICDIFF: $magicDiff DIFF: $diff"); if ($diff >= $magicDiff || $accountTotal <= 1 || $magicDiff eq "") { $magicDiff = $diff; $chosenAccount = $key; #PrintLogs("Chosen Acount : $chosenAccount"); } } } #undef $weightTotal; undef $magicDiff; } sub getBanners { if (($FORM{'keyword'} eq "NULL" || $FORM{'keyword'} eq "") && $FORM{'name'} eq "") { $dbc = $db->prepare("SELECT DISTINCT b.name,b.type,b.imageurl,b.code,b.width,b.height,b.border,b.alt,b.weight,b.target,b.textlink,b.domain,b.browser,b.os,b.mouseover,b.mouseout FROM $tables{'banners'} b, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND b.account='$chosenAccount' AND b.status='1' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour'))$UNIQUE") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); } elsif ($FORM{'name'} eq "") { if ($matches > 0) { $dbc = $db->prepare("SELECT DISTINCT b.name,b.type,b.imageurl,b.code,b.width,b.height,b.border,b.alt,b.weight,b.target,b.textlink,b.domain,b.browser,b.os,b.mouseover,b.mouseout FROM $tables{'banners'} b, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND b.account='$chosenAccount' AND b.status='1' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour')) AND (b.keywords LIKE '%$FORM{'keyword'}%'$query)$UNIQUE") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); } else { $dbc = $db->prepare("SELECT DISTINCT b.name,b.type,b.imageurl,b.code,b.width,b.height,b.border,b.alt,b.weight,b.target,b.textlink,b.domain,b.browser,b.os,b.mouseover,b.mouseout FROM $tables{'banners'} b, $tables{'regions'} r WHERE (b.region LIKE '$FORM{'region'}' OR b.region LIKE '$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'},%' OR b.region LIKE '%,$FORM{'region'}') AND b.account='$chosenAccount' AND b.status='1' AND (b.maxviews = '0' OR b.views < b.maxviews) AND (b.maxclicks = '0' OR b.clicks < b.maxclicks) AND (NOW()-b.startdate=NOW() OR NOW()-b.startdate >= 0) AND (NOW()-b.stopdate=NOW() OR NOW()-b.stopdate <= 0) AND (b.weekdays='' OR b.weekdays LIKE '%$weekday%') AND (b.hours='' OR (b.hours LIKE '$hour' OR b.hours LIKE '$hour.%' OR b.hours LIKE '%.$hour.%' OR b.hours LIKE '%.$hour'))$UNIQUE") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); } } else { $dbc = $db->prepare("SELECT name,type,imageurl,code,width,height,border,alt,weight,target,textlink,domain,browser,os,mouseover,mouseout FROM $tables{'banners'} WHERE name='$FORM{'name'}'") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); } $dbc->execute; while (@data = $dbc->fetchrow_array()) { ($banner, $type, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout) = @data; $valid = 1; if ($valid == 1 && $domain ne "") { use Socket; $iaddr = inet_aton("$ENV{REMOTE_ADDR}"); $hostname = gethostbyaddr($iaddr, AF_INET); $flag="0"; if(grep(/City/,$domain)) { ($temp,$domain) = split(/:/,$domain); $flag="1"; } $iaddr = $ENV{REMOTE_ADDR}; $hostname1 = GetCountry($iaddr,$flag); @domains = split(/\,/,$domain); #PrintLogs("Country : $hostname1"); if ($hostname1 eq "") { $valid = 1; } else { foreach $ext (@domains) { if(grep(/Not/,@domains)) { if(grep(/$hostname1/,$ext)) { $valid = 0; } else { $valid = 1; last; } } else { if ($hostname1 =~ /$ext$/i) { $valid = 1; last; } else { $valid = 0; } } } } } if ($valid == 1 && $os ne "") { $valid = 0; $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent eq "") { $valid = 1; } else { @os = split(/\,|\./,$os); foreach $system (@os) { if ($agent =~ /$system/i) { $valid = 1; last; } } } } if ($valid == 1 && $browser ne "") { $valid = 0; $agent = $ENV{'HTTP_USER_AGENT'}; if ($agent eq "") { $valid = 1; } else { @browser = split(/\,|\./,$browser); foreach $browse (@browser) { if ($agent =~ /$browse/i) { $valid = 1; last; } } } } if ($valid == 1) { $banners{$banner} = "$type||$imageurl||$code||$width||$height||$border||$alt||$weight||$target||$textlink||$domain||$browser||$os||$mouseover||$mouseout||"; $bannerTotal++; $weightTotal += $weight; } } $dbc->finish; $dbc = $db->prepare("SELECT b.name,SUM(d.views) FROM $tables{'banners'} b, $tables{'daily'} d WHERE b.status='1' AND b.name=d.banner AND b.account='$chosenAccount' AND d.region='$FORM{'region'}' AND d.date=NOW() GROUP BY b.name") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { if ($data[1] ne "" && $data[1] > 0 && $banners{$data[0]} ne "") { $banners{$data[0]} .= "$data[1]"; $bannerViewTotal += $data[1]; } } $dbc->finish; } sub getUniqueBanners { if ($FORM{'unique'} > 0) { $ENV{HTTP_REFERER} ||= "Unresolved..."; $true_unique = ($FORM{'unique'} - 1); $db->do("LOCK TABLES $tables{'logged'} WRITE"); $dbc = $db->prepare("SELECT name FROM $tables{'logged'} WHERE region='$FORM{'region'}' AND referrer='$ENV{HTTP_REFERER}' AND ip='$ENV{REMOTE_ADDR}' ORDER BY imgtime DESC LIMIT 0,$true_unique") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { $UNIQUE .= " AND b.name NOT LIKE '$data[0]'"; } $dbc->finish; $db->do("UNLOCK TABLES"); } } sub fixBannerWeights { if ($bannerTotal > 0) { if ($weightTotal < 100) { $add = ((100 - $weightTotal) / $weightTotal); foreach $key (keys %banners) { ($type, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout, $views) = split(/\|\|/,$banners{$key}); $weight += ($weight * $add); $views ||= 0; $banners{$key} = "$type||$imageurl||$code||$width||$height||$border||$alt||$weight||$target||$textlink||$domain||$browser||$os||$mouseover||$mouseout||$views"; } } if ($weightTotal > 100) { $subtract = (($weightTotal - 100) / $weightTotal); foreach $key (keys %banners) { ($type, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout, $views) = split(/\|\|/,$banners{$key}); $weight -= ($weight * $subtract); $views ||= 0; $banners{$key} = "$type||$imageurl||$code||$width||$height||$border||$alt||$weight||$target||$textlink||$domain||$browser||$os||$mouseover||$mouseout||$views"; } } } } sub chooseBanner { if ($bannerViewTotal > 0 && $bannerViewTotal ne "" && $bannerTotal > 0 && $bannerTotal ne "") { $bannerViewAverage = (($bannerViewTotal / $bannerTotal) / $weightTotal); $bannerNewFactor = int(rand(3)); } foreach $key (keys %banners) { ($type, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout, $views) = split(/\|\|/,$banners{$key}); if ($bannerViewAverage > 0 && $views > 0 && $bannerNewFactor != 1 && ($views / ($bannerViewAverage * $weight)) < .50) { $views += ($bannerViewAverage * ($weightTotal / $bannerTotal)); } if ($bannerViewTotal > 0 && $bannerViewTotal ne "") { $ratio = (($views / $bannerViewTotal) * 100); $diff = ($weight - $ratio); } else { $diff = 0; $ratio = 0; } if ($diff >= $magicDiff || $bannerTotal <= 1 || $magicDiff eq "") { $magicDiff = $diff; $chosenBanner = $key; #PrintLogs("Choosen Banner: $chosenBanner"); } } ($type, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout, $views) = split(/\|\|/,$banners{$chosenBanner}); #PrintLogs("Selected Banner: $chosenBanner"); if ($bannerTotal == 0 || $chosenBanner eq "") { $dbc = $db->prepare("SELECT b.name,b.type,b.account,b.imageurl,b.code,b.width,b.height,b.border,b.alt,b.weight,b.target,b.textlink,b.domain,b.browser,b.os,b.mouseover,b.mouseout FROM $tables{'banners'} b, $tables{'regions'} r WHERE r.name='$FORM{'region'}' AND b.name=r.banner") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; @data = $dbc->fetchrow_array(); $dbc->finish; ($chosenBanner, $type, $chosenAccount, $imageurl, $code, $width, $height, $border, $alt, $weight, $target, $textlink, $domain, $browser, $os, $mouseover, $mouseout) = @data; #PrintLogs("PANIC BANNER:$chosenBanner"); } } sub logInfo { if ($chosenBanner ne "") { $db->do("UPDATE $tables{'banners'} SET views=views+1 WHERE name='$chosenBanner'"); $check = $db->do("UPDATE $tables{'daily'} SET views=views+1 WHERE banner='$chosenBanner' AND region='$FORM{'region'}' AND account='$chosenAccount' AND date=NOW()"); if ($check == 0 && $chosenBanner ne "") { $db->do("LOCK TABLES $tables{'daily'} WRITE"); $dbc = $db->prepare("SELECT COUNT(*) FROM $tables{'daily'} WHERE date=NOW() AND banner='$chosenBanner' AND region='$FORM{'region'}' AND account='$chosenAccount'") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; $check = $dbc->fetchrow_array(); $dbc->finish; if ($check == 0) { $db->do("INSERT INTO $tables{'daily'} (date, banner, account, region, views, clicks) VALUES (NOW(), '$chosenBanner', '$chosenAccount', '$FORM{'region'}', '1', '0')"); } else { $db->do("UPDATE $tables{'daily'} SET views=views+1 WHERE banner='$chosenBanner' AND region='$FORM{'region'}' AND account='$chosenAccount' AND date=NOW()"); } $db->do("UNLOCK TABLES"); } if ($FORM{'unique'} > 0 && $bannerTotal >= 1 && $chosenBanner ne "") { $ENV{HTTP_REFERER} ||= "Unresolved..."; $db->do("LOCK TABLES $tables{'logged'} WRITE"); $dbc = $db->prepare("SELECT id FROM $tables{'logged'} WHERE NOW()-imgtime > $LOGGED_TIMEOUT LIMIT 0,1") || &cgiError ("Couldn't prepare statement:", "$db->errstr"); $dbc->execute; $idnum = $dbc->fetchrow_array(); $dbc->finish; if ($idnum eq "") { $db->do("INSERT INTO $tables{'logged'} (name, ip, referrer, host, imgtime, slot, bust, region) VALUES ('$chosenBanner', '$ENV{REMOTE_ADDR}', '$ENV{HTTP_REFERER}', '$hostname', NOW(), '$FORM{'slot'}', '$FORM{'bust'}', '$FORM{'region'}')"); } else { $db->do("UPDATE $tables{'logged'} SET name='$chosenBanner', ip='$ENV{REMOTE_ADDR}', referrer='$ENV{HTTP_REFERER}', host='$hostname', imgtime=NOW(), slot='$FORM{'slot'}', bust='$FORM{'bust'}', region='$FORM{'region'}' WHERE id='$idnum'"); } $db->do("UNLOCK TABLES"); } } } sub displayBanner { if ($ARGV[0] eq "" && $ARGV[1] eq "") { print "Content-type: text/html\n\n"; } if ($type == 0 || $code eq "") { if ($imageurl =~ /\<\%BUST\%\>/i) { $bust = $FORM{'bust'}; $bust ||= int(rand(999999)); $imageurl =~ s/\<\%BUST\%\>/$bust/ig; } if ($FORM{'mode'} eq "SSI" && $textlink ne "") { $referrer = ""; print qq|$alt
$textlink
|; } else { if ($FORM{'mode'} eq "SSI") { $referrer = ""; } else { $referrer = $ENV{"HTTP_REFERER"}; $referrer =~ s/\?/\%3F/g; $referrer =~ s/\&/\%26/g; $referrer =~ s/\=/\%3D/g; $referrer =~ s/\;/%3B/g; } if ($FORM{'refresh'} eq "") { print qq|$alt|; } else { print qq|Ad Banner Frame$alt|; } } } else { $referrer = $ENV{'HTTP_REFERER'}; $referrer ||= "http://$ENV{'HTTP_HOST'}$ENV{'DOCUMENT_URI'}"; $referrer =~ s/\?/\%3F/g; $referrer =~ s/\&/\%26/g; $referrer =~ s/\=/\%3D/g; $referrer =~ s/\;/%3B/g; $bust = $FORM{'bust'}; $bust ||= int(rand(999999)); @code = split(/ /,$code); $newCode = join(" ",@code); $newCode =~ s/\<\%BUST\%\>/$bust/ig; if ($FORM{'refresh'} eq "") { print "$newCode"; } else { print qq|Ad Banner Frame$newCode|; } } } sub click { $FORM{'referrer'} =~ s/\%3F/\?/g; $FORM{'referrer'} =~ s/\%26/\&/g; $FORM{'referrer'} =~ s/\%3D/\=/g; $FORM{'referrer'} =~ s/\%3B/\;/g; $FORM{'referrer'} ||= $ENV{"HTTP_REFERER"}; $FORM{'referrer'} ||= "Unresolved..."; if($FORM{'remoteip'} ne '') { $ENV{REMOTE_ADDR} = $FORM{'remoteip'}; } use Socket; $iaddr = inet_aton("$ENV{REMOTE_ADDR}"); $hostname = gethostbyaddr($iaddr, AF_INET); $hostname ||= "Unresolved..."; $db = DBI->connect("DBI:mysql:$database:$host:$port", "$username", "$password") || &cgiError ("Connection Failed:", "$DBI::errstr"); $dbc = $db->prepare("SELECT account,redirect FROM $tables{'banners'} WHERE name='$FORM{'name'}'") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { ($account, $redirect) = @data; } $dbc->finish; $dbc = $db->prepare("SELECT DISTINCT COUNT(*) FROM $tables{'logs'} WHERE ip='$ENV{REMOTE_ADDR}' AND name='$FORM{'name'}' AND NOW()-imgtime <= $CLICK_TIMEOUT") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; $totalnum = $dbc->fetchrow_array(); $dbc->finish; if ($totalnum == 0) { $agent = $ENV{'HTTP_USER_AGENT'}; foreach $meta (@browser) { ($identifier, $browser) = split(/\|\|/,$meta); if ($agent =~ /$identifier/i) { last; } } foreach $key (sort (keys %os)) { if ($agent =~ /$key/i) { $os = $os{"$key"}; last; } } $browser ||= "Unresolved..."; $os ||= "Unresolved..."; $db->do("LOCK TABLES $tables{'banners'} WRITE, $tables{'daily'} WRITE, $tables{'logs'} WRITE"); $db->do("UPDATE $tables{'banners'} SET clicks=clicks+1 WHERE name='$FORM{'name'}'"); $test = $db->do("UPDATE $tables{'daily'} SET clicks=clicks+1 WHERE banner='$FORM{'name'}' AND region='$FORM{'region'}' AND account='$account' AND date=NOW()"); # $test = $db->do("INSERT INTO $tables{'logs'} (name, account, ip, referrer, host, imgtime, region, browser, os) VALUES ('$FORM{'name'}', '$account', '$ENV{REMOTE_ADDR}', '$FORM{'referrer'}', '$hostname', NOW(), '$FORM{'region'}', '$browser', '$os')"); $db->do("UNLOCK TABLES"); } $db->disconnect; if ($redirect =~ /\<\%BUST\%\>/i) { srand(time*time*time*time*time*time*time*time*time*time); $bust = $FORM{'bust'}; $bust ||= int(rand(999999)); $redirect =~ s/\<\%BUST\%\>/$bust/ig; } print "Location: $redirect\n\n"; exit; } sub rich { $FORM{'referrer'} = $ENV{'HTTP_REFERER'}; $FORM{'referrer'} ||= "Unresolved..."; $linenumber = $FORM{"linenumber"}; $bust = $FORM{"bust"}; use Socket; $iaddr = inet_aton("$ENV{REMOTE_ADDR}"); $hostname = gethostbyaddr($iaddr, AF_INET); $hostname ||= "Unresolved..."; $db = DBI->connect("DBI:mysql:$database:$host:$port", "$username", "$password") || &cgiError ("Connection Failed:", "$DBI::errstr"); $dbc = $db->prepare("SELECT account,code FROM $tables{'banners'} WHERE name='$FORM{'name'}'") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { ($account, $code) = @data; } $dbc->finish; $dbc = $db->prepare("SELECT DISTINCT COUNT(*) FROM $tables{'logs'} WHERE ip='$ENV{REMOTE_ADDR}' AND name='$FORM{'name'}' AND NOW()-imgtime <= $CLICK_TIMEOUT") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; $totalnum = $dbc->fetchrow_array(); $dbc->finish; if ($totalnum == 0) { $agent = $ENV{'HTTP_USER_AGENT'}; foreach $meta (@browser) { ($identifier, $browser) = split(/\|\|/,$meta); if ($agent =~ /$identifier/i) { last; } } foreach $key (sort (keys %os)) { if ($agent =~ /$key/i) { $os = $os{"$key"}; last; } } $browser ||= "Unresolved..."; $os ||= "Unresolved..."; if($FORM{'name'} eq "zmn9xcv") { } $db->do("LOCK TABLES $tables{'banners'} WRITE, $tables{'daily'} WRITE, $tables{'logs'} WRITE"); $db->do("UPDATE $tables{'banners'} SET clicks=clicks+1 WHERE name='$FORM{'name'}'"); $db->do("UPDATE $tables{'daily'} SET clicks=clicks+1 WHERE banner='$FORM{'name'}' AND region='$FORM{'region'}' AND account='$account' AND date=NOW()"); $db->do("INSERT INTO $tables{'logs'} (name, account, ip, referrer, host, imgtime, region, browser, os) VALUES ('$FORM{'name'}', '$account', '$ENV{REMOTE_ADDR}', '$FORM{'referrer'}', '$hostname', NOW(), '$FORM{'region'}', '$browser', '$os')"); $db->do("UNLOCK TABLES"); } $db->disconnect; @code = split(/ /,$code); if ($code[$linenumber] =~ /href="(.*)"/i) { $redirect = $1; } if ($code[$linenumber] =~ /value="http\:\/\/(.*)"/i) { $redirect = "http://$1"; } $redirect =~ s/\<\%BUST\%\>/$bust/ig; print "Location: $redirect\n\n"; exit; } sub form { $FORM{'referrer'} = $ENV{'HTTP_REFERER'}; $FORM{'referrer'} ||= "Unresolved..."; $linenumber = $FORM{"linenumber"}; $bust = $FORM{"bust"}; use Socket; $iaddr = inet_aton("$ENV{REMOTE_ADDR}"); $hostname = gethostbyaddr($iaddr, AF_INET); $hostname ||= "Unresolved..."; $db = DBI->connect("DBI:mysql:$database:$host:$port", "$username", "$password") || &cgiError ("Connection Failed:", "$DBI::errstr"); $dbc = $db->prepare("SELECT account,code FROM $tables{'banners'} WHERE name='$FORM{'name'}'") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; while (@data = $dbc->fetchrow_array()) { ($account, $code) = @data; } $dbc->finish; $dbc = $db->prepare("SELECT DISTINCT COUNT(*) FROM $tables{'logs'} WHERE ip='$ENV{REMOTE_ADDR}' AND name='$FORM{'name'}' AND NOW()-imgtime <= $CLICK_TIMEOUT") || &cgiError ("Couldn't Prepare Statement:", "$DBI::errstr"); $dbc->execute; $totalnum = $dbc->fetchrow_array(); $dbc->finish; if ($totalnum == 0) { $agent = $ENV{'HTTP_USER_AGENT'}; foreach $meta (@browser) { ($identifier, $browser) = split(/\|\|/,$meta); if ($agent =~ /$identifier/i) { last; } } foreach $key (sort (keys %os)) { if ($agent =~ /$key/i) { $os = $os{"$key"}; last; } } $browser ||= "Unresolved..."; $os ||= "Unresolved..."; $db->do("LOCK TABLES $tables{'banners'} WRITE, $tables{'daily'} WRITE, $tables{'logs'} WRITE"); $db->do("UPDATE $tables{'banners'} SET clicks=clicks+1 WHERE name='$FORM{'name'}'"); $db->do("UPDATE $tables{'daily'} SET clicks=clicks+1 WHERE banner='$FORM{'name'}' AND region='$FORM{'region'}' AND account='$account' AND date=NOW()"); $db->do("INSERT INTO $tables{'logs'} (name, account, ip, referrer, host, imgtime, region, browser, os) VALUES ('$FORM{'name'}', '$account', '$ENV{REMOTE_ADDR}', '$FORM{'referrer'}', '$hostname', NOW(), '$FORM{'region'}', '$browser', '$os')"); $db->do("UNLOCK TABLES"); } $db->disconnect; @code = split(/ /,$code); if ($code[$linenumber] =~ /action="(.*)"/i) { $redirect = $1; foreach $key (keys %FORM) { if ($key !~ /^mode$|^name$|^linenumber$|^referrer$|^bust$/i) { $query .= "$key=$FORM{$key}&"; } } $query =~ s/\&$//g; $redirect = "$redirect?$query"; } $redirect =~ s/\<\%BUST\%\>/$bust/ig; print "Location: $redirect\n\n"; exit; } sub cgiError { my ($error_cause,$error) = @_; if ($error_cause eq "") { $error_cause = "Error:"; } if ($error eq "") { $error = "The script encountered problems and terminated"; } print "Content-type: text/html\n\n"; print qq|$error_cause
$error|; exit; } sub GetCountry { use Geo::IP; $what=""; $country=""; $what = $_[0]; $chec = $_[1]; #my $gi = new Geo::IP('/home/websites/geomodule/Geo-IP_20011201.db'); # look up IP address '65.15.30.247' # returns undef if country is unallocated, or not defined in our database #my $country = $gi->lookup_country($what); #my $gi = new Geo::IP('/home/websites/geomodule/Geo-IP_20011201.db'); my $gi = Geo::IP->new(GEOIP_STANDARD); # look up IP address '65.15.30.247' # returns undef if country is unallocated, or not defined in our database #my $country = $gi->lookup_country($what); my $country = $gi->country_code_by_addr($what); return $country; } sub GetIPDetail { $ip = $_[0]; $addr = &apnic; if ($country eq "Unknown") { $addr = &ripe; } if ($country eq "Unknown") { $addr = &arin; if ($addr ne "Unknown") { $country = "US"; } } return $country; } sub arin { $res = `whois =$ip\@whois.arin.net`; $desc = "Unknown"; foreach (split /\n/, $res) { chomp; if (/^$/) { return $desc; exit; } if (/^ .+/) { s/^\s+//; if ($desc eq "Unknown") { $desc = $ARG; } else { $desc .= ", $ARG"; } } } return "Unknown"; } sub ripe { $res = `whois "-a $ip\@whois.ripe.net"`; $desc = "Unknown"; $country = "Unknown"; foreach (split /\n/, $res) { chomp; if (/^descr:\s+(.+)$/) { if ($desc eq "Unknown") { $desc = $1; } else { $desc .= ", $1"; } } if (/^country:\s+(.+)$/) { $country = $1; } } return $desc; } sub apnic { $res = `whois $ip\@whois.apnic.net`; $desc = "Unknown"; $country = "Unknown"; foreach (split /\n/, $res) { chomp; if (/^descr:\s+(.+)$/) { if ($desc eq "Unknown") { $desc = $1; } else { $desc .= ", $1"; } } if (/^country:\s+(.+)$/) { $country = $1; } } return $desc; } sub PrintLogs { if($FORM{'region'} eq 'wd_homepage_468_60') { open FL,">>my.log"; print FL $_[0]."\n"; close FL; } }