我见过像spypig.com这样的服务,在电子邮件中放置一个小图像,并跟踪它何时打开以及从哪里打开。他们跟踪城市,国家,IP地址等。这是怎么做到的?
发布于 2011-03-27 17:50:48
基本上,在电子邮件的HTML正文中,会有一个如下所示的<img>
标记:
<img src="http://www.yoursite.com/tracker.php?id=123456" alt="" />
当有人阅读他的邮件时,启用了图像,电子邮件客户端将发送一个请求到tracker.php
,以加载图像,并将id=123456
作为参数传递给它。
此tracker.php
脚本将位于您的服务器上,当被调用时,它将:
id
参数,id
。<id
>F216
tracker.php
脚本知道它是从哪个IP地址调用的--就像其他任何PHP脚本一样:
$ipAddress = $_SERVER['REMOTE_ADDR'];
而且,从这个IP地址开始,你可以使用地理定位服务来找出电子邮件是从世界的哪个地方打开的。
正如你所知道的,id=123456
对应于一个特定的电子邮件地址,这可以让你找出你的每个订阅者在哪里。
发布于 2016-07-21 12:09:07
邮件1.将跟踪器图像放在电子邮件中
<img src="http://www.yoursite.com/tracker.php?eid=123456&uid=123" alt="" width="1px" height="1px">
它的工作非常简单,一旦你的邮件打开,追踪器图像发送请求到服务器,从该请求中,我们可以通过使用userID创建图像地址来获取信息,也可以将该邮件视为由用户读取。
注意:不要使用display: none;属性来隐藏您的图像,它可能会根据垃圾邮件算法进行过滤。并且不要放置任何javascript代码,它还会阻止垃圾邮件过滤器
2.在tracker.php上
<?php
header("Content-Type: image/jpeg"); // it will return image
readfile("img.jpg");
dbfunction(); // place your db code
?>
3.通过以下函数获取ip地址。
function get_client_ip() {
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
$PublicIP = get_client_ip();
4.位置:
位置是由任何地理定位服务获得的,你可以使用开源的geolocation finder,如nekudo,freegeoip。
例如
<?php
$json = file_get_contents("http://ipinfo.io/$PublicIP/geo");
$json = json_decode($json ,true);
$country = $json['country_name'];
$region= $json['region_name'];
$city = $json['city'];
?>
发布于 2020-01-24 21:19:51
其他的答案都很好,但是,既然人类似乎确信“任何跟踪都是邪恶的跟踪”,我喜欢更进一步,通过保留.png
/.jpg
/.gif
等图像文件扩展名对用户“不可见”。
我不确定与所有类型的web服务器和主机的兼容性,但对我来说,这是对.htaccess
中已有的AddHandler指令的快速更改,例如:
AddHandler application/x-httpd-lsphp .png
...to允许处理扩展名为.png
的文件中的PHP代码。
您可能已经有一个允许在.htm
/.html
文件中使用AddHandler
的PHP行;如果是这样,只需将适当的图像文件扩展名添加到列表的末尾。
粗略地说,这是我的“跟踪图像”代码,文件另存为trackimage.png
或其他什么:
<?php //silently log user and return image
$ip=$_SERVER['REMOTE_ADDR'];
$uri=tidy($_SERVER['SCRIPT_URI']);
$querystring=tidy($_SERVER['QUERY_STRING']);
$useragent=tidy($_SERVER['HTTP_USER_AGENT']);
$json = file_get_contents("https://ipinfo.io/".$ip."/geo");
if(($json<>'')&&(strpos($json,"error")===false)){ extract(json_decode($json ,true)); }
$country=tidy($country);
$prov=tidy($region);
$city=tidy($city);
list($lat,$lon)=explode(',',$loc);
$lat=tidy($lat);
$lon=tidy($lon);
$sql = "INSERT INTO img_track_table set ip='$ip', useragent=$useragent, uri=$uri, "
."querystring=$querystring, country=$country, prov=$prov, city=$city, lat=$lat, lon=$lon;";
require 'connect.php'; $conn=new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) { /* couldn't connect, but do nothing about it */ }
}else{ //run insert query
if(!$conn->query($sql)) { /* query error, but do nothing about it */ }
$conn->close();
}
//return image
header("Content-Type: image/png");
readfile("myActualImageFile.png");
function tidy($str){ //remove quotes and backslashes from string
if(is_null($str)||($str=="")){return "null";}
$str=trim(str_replace('\\','',str_replace("'","",str_replace('"',"",$str))));
if(is_numeric($str)){return $str;}
return "'$str'";
}
请注意,如果代码在图像之前返回错误文本或任何其他内容,则图像将无法显示。这也可能值得研究可能适用于您的案例的可能的安全问题。例如,this。
https://stackoverflow.com/questions/5448381
复制相似问题