我修改了脚本以使用 php 7.1 将 eregi 更改为 preg_match,脚本在 wamp 上工作了几分钟,然后突然停止工作
I modified script to work with php 7.1 changing eregi to preg_match, script worked for a a few minutes on wamp, and suddenly it stopped working
下面的脚本为所有机器人访问创建了一个日志文件,给我发了一封电子邮件,并在 ip2location 验证了 IP。它与 PHP5.2 和 eregi 函数一起工作得很好,所以我将 eregi 行修改为 preg_match 并在我的 wamp 测试服务器上工作了几分钟后向每个 bot 变量添加正斜杠,因为我收到 "reg_match(): Delimiter must not be alphanumeric or backslash" 警告,但现在它不起作用,也不会在 visits.log 文件中记录任何机器人。
脚本仍然给我以下三个警告,但由于它们是警告并且它已经开始工作,所以我没有太在意它们:
- 注意:C:\wamp\www\visits.php 第 28
行未定义偏移量:5
- 警告:preg_match():第 28
行 C:\wamp\www\visits.php 中的空正则表达式
- 注意:未定义索引:js in C:\wamp\www\visits.php on line 62
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$to = "email@here.com";
$log = "./visits.log";
$dateTime = date("r");
$agents[] = "/googlebot/";
$spiders[] = "/Google/";
$spiders[] = "/Googlebot/";
$agents[] = "/slurp/";
$spiders[] = "/Slurp (Inktomi's robot, HotBot)/";
$agents[] = "/msnbot/";
$spiders[] = "/MSN Robot (MSN Search, search\.msn\.com)/";
$agents[] = "/yahoo\! slurp/";
$spiders[] = "/Yahoo! Slurp/";
$agents[] = "/bingbot/";
$spiders[] = "/Bing\.com/";
$ip= $_SERVER['REMOTE_ADDR'];
$found = false;
for ($spi = 0; $spi < count($spiders); $spi++)
if ($found = preg_match($agents[$spi], $_SERVER['HTTP_USER_AGENT']))
break;
if ($found) {
$url = "http://" . $_SERVER['SERVER_NAME']. $_SERVER['PHP_SELF'];
if ($_SERVER['QUERY_STRING'] != "") {
$url .= '?' . $_SERVER['QUERY_STRING'];
}
$line = $dateTime . " " . $spiders[$spi] . " " . $ip." @ " . $url;
$ip2location = "https://www.ip2location.com/".$_SERVER['REMOTE_ADDR'];
if ($log != "") {
if (@file_exists($log)) {
$mode = "a";
} else {
$mode = "w";
}
if ($f = @fopen($log, $mode)) {
@fwrite($f, $line . "\n");
@fclose($f);
}
}
if ($to != "") {
$to = "email@here.com";
$subject = $spiders[$spi]. " crawled your site";
$body = "$line". "\xA\xA" ."Whois verification available at: $ip2location";
mail($to, $subject, $body);
}
}
if ($_REQUEST["js"]) {
header("Content-Type: image/gif\r\n");
header("Cache-Control: no-cache, must-revalidate\r\n");
header("Pragma: no-cache\r\n");
@readfile("visits.gif");
}
?>
括号在 php 7 preg_match 的正则表达式中有特殊含义。逃避它们应该可以正常工作。至于第一个警告,而不仅仅是 coint($agents)
使用 count($agents) - 1
正弦数组索引从零开始或只使用 foreach
。
第二次警告使用 if(isset($_REQUEST ["js"])
祝你好运
a) 你在 $spiders 中有 6 个元素而在 $agents 中只有 5 个元素,这会导致关于偏移量 5 和空正则表达式的警告。 Googlebot 翻倍:
$spiders[] = "/Google/";
$spiders[] = "/Googlebot/";
删除一个条目
b) if ($_REQUEST["js"]) {
应替换为:
if (isset($_REQUEST["js"])) {
并根据您期望之后的值来检查 isset 值 - 例如,如果您根据 true
:
进行验证
if (isset($_REQUEST["js"]) && $_REQUEST['js'] === true) {
下面的脚本为所有机器人访问创建了一个日志文件,给我发了一封电子邮件,并在 ip2location 验证了 IP。它与 PHP5.2 和 eregi 函数一起工作得很好,所以我将 eregi 行修改为 preg_match 并在我的 wamp 测试服务器上工作了几分钟后向每个 bot 变量添加正斜杠,因为我收到 "reg_match(): Delimiter must not be alphanumeric or backslash" 警告,但现在它不起作用,也不会在 visits.log 文件中记录任何机器人。
脚本仍然给我以下三个警告,但由于它们是警告并且它已经开始工作,所以我没有太在意它们:
- 注意:C:\wamp\www\visits.php 第 28 行未定义偏移量:5
- 警告:preg_match():第 28 行 C:\wamp\www\visits.php 中的空正则表达式
- 注意:未定义索引:js in C:\wamp\www\visits.php on line 62
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$to = "email@here.com";
$log = "./visits.log";
$dateTime = date("r");
$agents[] = "/googlebot/";
$spiders[] = "/Google/";
$spiders[] = "/Googlebot/";
$agents[] = "/slurp/";
$spiders[] = "/Slurp (Inktomi's robot, HotBot)/";
$agents[] = "/msnbot/";
$spiders[] = "/MSN Robot (MSN Search, search\.msn\.com)/";
$agents[] = "/yahoo\! slurp/";
$spiders[] = "/Yahoo! Slurp/";
$agents[] = "/bingbot/";
$spiders[] = "/Bing\.com/";
$ip= $_SERVER['REMOTE_ADDR'];
$found = false;
for ($spi = 0; $spi < count($spiders); $spi++)
if ($found = preg_match($agents[$spi], $_SERVER['HTTP_USER_AGENT']))
break;
if ($found) {
$url = "http://" . $_SERVER['SERVER_NAME']. $_SERVER['PHP_SELF'];
if ($_SERVER['QUERY_STRING'] != "") {
$url .= '?' . $_SERVER['QUERY_STRING'];
}
$line = $dateTime . " " . $spiders[$spi] . " " . $ip." @ " . $url;
$ip2location = "https://www.ip2location.com/".$_SERVER['REMOTE_ADDR'];
if ($log != "") {
if (@file_exists($log)) {
$mode = "a";
} else {
$mode = "w";
}
if ($f = @fopen($log, $mode)) {
@fwrite($f, $line . "\n");
@fclose($f);
}
}
if ($to != "") {
$to = "email@here.com";
$subject = $spiders[$spi]. " crawled your site";
$body = "$line". "\xA\xA" ."Whois verification available at: $ip2location";
mail($to, $subject, $body);
}
}
if ($_REQUEST["js"]) {
header("Content-Type: image/gif\r\n");
header("Cache-Control: no-cache, must-revalidate\r\n");
header("Pragma: no-cache\r\n");
@readfile("visits.gif");
}
?>
括号在 php 7 preg_match 的正则表达式中有特殊含义。逃避它们应该可以正常工作。至于第一个警告,而不仅仅是 coint($agents)
使用 count($agents) - 1
正弦数组索引从零开始或只使用 foreach
。
第二次警告使用 if(isset($_REQUEST ["js"])
祝你好运
a) 你在 $spiders 中有 6 个元素而在 $agents 中只有 5 个元素,这会导致关于偏移量 5 和空正则表达式的警告。 Googlebot 翻倍:
$spiders[] = "/Google/";
$spiders[] = "/Googlebot/";
删除一个条目
b) if ($_REQUEST["js"]) {
应替换为:
if (isset($_REQUEST["js"])) {
并根据您期望之后的值来检查 isset 值 - 例如,如果您根据 true
:
if (isset($_REQUEST["js"]) && $_REQUEST['js'] === true) {