I can catch u..获取用户浏览器,ip,操作系统信息的image

August 27, 2007 – 2:47 am

上次朋友惊讶于论坛里面有人用的签名图片可以显示ip地址,操作系统等,我说这个很简单的,给他做了个demo。。用的是珊瑚虫的ip库,然后写了个操作系统判断和浏览器判断,然后利用php 的GD库编辑模版图片输出。。。。下面是个演示:

点此查看演示 (165 hits)

下面是代码:
总共有5个文件,为:

  1. CoralWry.dat    //ip库文件,此处用的是珊瑚虫的ip库
  2. template.jpg    //生成的图片的模版
  3. simhei.ttf       //写入信息的字体,可以自己定义,但是要记得在mysign.php文件中修改
  4. getip.php       //获取ip的物理地址的类
  5. mysign.php    //获取浏览器,操作系统,生成图片

mysign.php

  1. include("getip.php");
  2.  
  3. function browser(){
  4. global $agent;
  5. // initialize properties
  6. $bd['browser'] = "未知浏览器";
  7. $bd['version'] = "未知版本";
  8. //$this->UserAgent = $agent;
  9.  
  10. // find operating system
  11. if (eregi("win", $agent)) {
  12. if(eregi("NT 5.1",$agent)) {
  13. $bd['platform'] = "Windows XP";
  14. }
  15. elseif(eregi("NT 5.0",$agent)) {
  16. $bd['platform'] = "Windows 2000";
  17. }
  18. elseif(eregi("NT 5.2",$agent)) {
  19. $bd['platform'] = "Windows 2003";
  20. }
  21. else
  22. $bd['platform'] = "Windows";
  23. }
  24.  
  25. elseif (eregi("mac", $agent))
  26. $bd['platform'] = "MacIntosh";
  27. elseif (eregi("linux", $agent))
  28. $bd['platform'] = "Linux";
  29. elseif (eregi("OS/2", $agent))
  30. $bd['platform'] = "OS/2";
  31. elseif (eregi("BeOS", $agent))
  32. $bd['platform'] = "BeOS";
  33.  
  34. // test for Opera
  35. if (eregi("opera",$agent)){
  36. $val = stristr($agent, "opera");
  37. if (eregi("/", $val)){
  38. $val = explode("/",$val);
  39. $bd['browser'] = $val[0];
  40. $val = explode(" ",$val[1]);
  41. $bd['version'] = $val[0];
  42. }else{
  43. $val = explode(" ",stristr($val,"opera"));
  44. $bd['browser'] = $val[0];
  45. $bd['version'] = $val[1];
  46. }
  47.  
  48. // test for WebTV
  49. }elseif(eregi("webtv",$agent)){
  50. $val = explode("/",stristr($agent,"webtv"));
  51. $bd['browser'] = $val[0];
  52. $bd['version'] = $val[1];
  53.  
  54. // test for MS Internet Explorer version 1
  55. }elseif(eregi("microsoft internet explorer", $agent)){
  56. //$bd['browser'] = "MSIE";
  57. $bd['browser'] = "microsoft internet explorer";
  58. $bd['version'] = "1.0";
  59. $var = stristr($agent, "/");
  60. if (ereg("308|425|426|474|0b1", $var)){
  61. $bd['version'] = "1.5";
  62. }
  63.  
  64. // test for NetPositive
  65. }elseif(eregi("NetPositive", $agent)){
  66. $val = explode("/",stristr($agent,"NetPositive"));
  67. $bd['platform'] = "BeOS";
  68. $bd['browser'] = $val[0];
  69. $bd['version'] = $val[1];
  70.  
  71. // test for MS Internet Explorer
  72. }elseif(eregi("msie",$agent) && !eregi("opera",$agent)){
  73. $val = explode(" ",stristr($agent,"msie"));
  74. //$bd['browser'] = $val[0];
  75. $bd['browser'] = 'Microsoft Internet Explorer';
  76. $bd['version'] = $val[1];
  77.  
  78. // test for MS Pocket Internet Explorer
  79. }elseif(eregi("mspie",$agent) || eregi('pocket', $agent)){
  80. $val = explode(" ",stristr($agent,"mspie"));
  81. $bd['browser'] = "MSPIE";
  82. $bd['platform'] = "WindowsCE";
  83. if (eregi("mspie", $agent))
  84. $bd['version'] = $val[1];
  85. else {
  86. $val = explode("/",$agent);
  87. $bd['version'] = $val[1];
  88. }
  89.  
  90. // test for Galeon
  91. }elseif(eregi("galeon",$agent)){
  92. $val = explode(" ",stristr($agent,"galeon"));
  93. $val = explode("/",$val[0]);
  94. $bd['browser'] = $val[0];
  95. $bd['version'] = $val[1];
  96.  
  97. // test for Konqueror
  98. }elseif(eregi("Konqueror",$agent)){
  99. $val = explode(" ",stristr($agent,"Konqueror"));
  100. $val = explode("/",$val[0]);
  101. $bd['browser'] = $val[0];
  102. $bd['version'] = $val[1];
  103.  
  104. // test for iCab
  105. }elseif(eregi("icab",$agent)){
  106. $val = explode(" ",stristr($agent,"icab"));
  107. $bd['browser'] = $val[0];
  108. $bd['version'] = $val[1];
  109.  
  110. // test for OmniWeb
  111. }elseif(eregi("omniweb",$agent)){
  112. $val = explode("/",stristr($agent,"omniweb"));
  113. $bd['browser'] = $val[0];
  114. $bd['version'] = $val[1];
  115.  
  116. // test for Phoenix
  117. }elseif(eregi("Phoenix", $agent)){
  118. $bd['browser'] = "Phoenix";
  119. $val = explode("/", stristr($agent,"Phoenix/"));
  120. $bd['version'] = $val[1];
  121.  
  122. // test for Firebird
  123. }elseif(eregi("firebird", $agent)){
  124. $bd['browser']="Firebird";
  125. $val = stristr($agent, "Firebird");
  126. $val = explode("/",$val);
  127. $bd['version'] = $val[1];
  128.  
  129. // test for Firefox
  130. }elseif(eregi("Firefox", $agent)){
  131. $bd['browser']="Firefox";
  132. $val = stristr($agent, "Firefox");
  133. $val = explode("/",$val);
  134. $bd['version'] = $val[1];
  135.  
  136. // test for Mozilla Alpha/Beta Versions
  137. }elseif(eregi("mozilla",$agent) &&
  138. eregi("rv:[0-9].[0-9][a-b]",$agent) && !eregi("netscape",$agent)){
  139. $bd['browser'] = "Mozilla";
  140. $val = explode(" ",stristr($agent,"rv:"));
  141. eregi("rv:[0-9].[0-9][a-b]",$agent,$val);
  142. $bd['version'] = str_replace("rv:","",$val[0]);
  143.  
  144. // test for Mozilla Stable Versions
  145. }elseif(eregi("mozilla",$agent) &&
  146. eregi("rv:[0-9]\.[0-9]",$agent) && !eregi("netscape",$agent)){
  147. $bd['browser'] = "Mozilla";
  148. $val = explode(" ",stristr($agent,"rv:"));
  149. eregi("rv:[0-9]\.[0-9]\.[0-9]",$agent,$val);
  150. $bd['version'] = str_replace("rv:","",$val[0]);
  151.  
  152. // test for Lynx & Amaya
  153. }elseif(eregi("libwww", $agent)){
  154. if (eregi("amaya", $agent)){
  155. $val = explode("/",stristr($agent,"amaya"));
  156. $bd['browser'] = "Amaya";
  157. $val = explode(" ", $val[1]);
  158. $bd['version'] = $val[0];
  159. } else {
  160. $val = explode("/",$agent);
  161. $bd['browser'] = "Lynx";
  162. $bd['version'] = $val[1];
  163. }
  164.  
  165. // test for Safari
  166. }elseif(eregi("safari", $agent)){
  167. $bd['browser'] = "Safari";
  168. $bd['version'] = "";
  169.  
  170. // remaining two tests are for Netscape
  171. }elseif(eregi("netscape",$agent)){
  172. $val = explode(" ",stristr($agent,"netscape"));
  173. $val = explode("/",$val[0]);
  174. $bd['browser'] = $val[0];
  175. $bd['version'] = $val[1];
  176. }elseif(eregi("mozilla",$agent) && !eregi("rv:[0-9]\.[0-9]\.[0-9]",$agent)){
  177. $val = explode(" ",stristr($agent,"mozilla"));
  178. $val = explode("/",$val[0]);
  179. $bd['browser'] = "Netscape";
  180. $bd['version'] = $val[1];
  181. }
  182.  
  183. // clean up extraneous garbage that may be in the name
  184. //$bd['browser'] = ereg_replace("[^a-z,A-Z]", "", $bd['browser']);
  185. // clean up extraneous garbage that may be in the version
  186. $bd['version'] = ereg_replace("[^0-9,.,a-z,A-Z]", "", $bd['version']);
  187. // finally assign our properties
  188. return $bd['browser'].$bd['version'];
  189.  
  190. }
  191.  
  192. function getUserOS() {
  193. global $agent;
  194. $os = "未知操作系统";
  195. if (strpos($agent, 'Win') && strpos($agent, '95')) {
  196. $os = "Windows 95";
  197. }
  198. elseif (strpos($agent,'Win 9') && strpos($agent, '4.90')) {
  199. $os = "Windows 9";
  200. }
  201. elseif (strpos($agent,'Win') && strpos($agent, '98')) {
  202. $os = "Windows 98";
  203. }
  204. elseif (strpos($agent,'Win') && strpos($agent, 'NT 5.0')) {
  205. $os = "Windows 2000";
  206. }
  207. elseif (strpos($agent, 'Win') && strpos($agent, 'NT 5.1')) {
  208. $os = "Windows XP";
  209. }
  210. elseif (strpos($agent, 'Win') && strpos($agent, 'NT 5.2')) {
  211. $os = "Windows 2003";
  212. }
  213. elseif (strpos($agent, 'Win') && strpos($agent, 'NT')) {
  214. $os = "Windows NT";
  215. }
  216. elseif (strpos($agent, 'Win') && strpos($agent, '32')) {
  217. $os = "Windows 32";
  218. }
  219. elseif (strpos($agent, 'Win')) {
  220. $os = "Windows";
  221. }
  222. elseif (strpos($agent, 'Linux')) {
  223. $os = "LInux";
  224. }
  225. elseif (strpos($agent, 'Unix')) {
  226. $os = "Unix";
  227. }
  228. elseif (strpos($agent, 'sun') && strpos($agent, 'OS')) {
  229. $os = "Sun OS";
  230. }
  231. elseif (strpos($agent, 'IBM') && strpos($agent, 'OS')) {
  232. $os = "IBM";
  233. }
  234. elseif (strpos($agent, 'Mac') && strpos($agent, 'PC')) {
  235. $os = "Mac pc";
  236. }
  237. elseif (strpos($agent, 'PowerPC')) {
  238. $os = "PowerPC";
  239. }
  240. elseif (strpos($agent, 'AIX')) {
  241. $os = "AIX";
  242. }
  243. elseif (strpos($agent, 'HPUX')) {
  244. $os = "HPUX";
  245. }
  246. elseif (strpos($agent, 'NetBSD')) {
  247. $os = "NetBSD";
  248. }
  249. elseif (strpos($agent, 'BSD')) {
  250. $os = "BSD";
  251. }
  252. elseif (strpos($agent, 'OSF1')) {
  253. $os = "OSFI";
  254. }
  255. elseif (strpos($agent, 'IRIX')) {
  256. $os = "IRIX";
  257. }
  258. elseif (strpos($agent, 'FreeBSD')) {
  259. $os = "FreeBSD";
  260. }
  261. return $os;
  262. }
  263.  
  264. //获取ip地址
  265. $agent = $_SERVER['HTTP_USER_AGENT'];
  266. $ip = $_SERVER["REMOTE_ADDR"];
  267. $iploca = new IpLocation;
  268. $iploca->getiplocation($ip);
  269. $from1 = $iploca->get('country');
  270. $from2 = $iploca->get('area');
  271. $from = $from1 . $from2;
  272. //获取物理地址
  273. $from1 = iconv("GB2312","UTF-8",$iploca->get('country'));
  274. $from2 = $iploca->get('area');
  275. $from = $from1 . $from2;
  276. //判断浏览器,操作系统
  277. //$browser = getUserBrowser();
  278. $browser = browser();
  279. $os = getUserOS();
  280. //定义图像输出变量
  281. $pngFile = "template.jpg";
  282. $font = "simhei.ttf";
  283. $font_size = 12;
  284. $x['os'] = 130;
  285. $y['os'] = 100;
  286. $x['browser'] = 140;
  287. $y['browser'] = 120;
  288. $x['ip'] = 120;
  289. $y['ip'] = 140;
  290. $x['from'] = 120;
  291. $y['from'] = 165;
  292.  
  293. $image    = imagecreatefromjpeg($pngFile) or die('不能创建图像');
  294. $text_color = imagecolorallocate($image, 255, 0, 0) or die('不能创建颜色');
  295. //写入文字
  296. imagettftext($image, $font_size, 0, $x['os'], $y['os'], $text_color, $font, $os) or die('没能输出文字');
  297. imagettftext($image, $font_size, 0, $x['browser'], $y['browser'], $text_color, $font, $browser);
  298. imagettftext($image, $font_size, 0, $x['ip'], $y['ip'], $text_color, $font, $ip);
  299. imagettftext($image, $font_size, 0, $x['from'], $y['from'], $text_color, $font, $from);
  300. header("Content-type: image/jpeg");
  301. imagejpeg($image,'',80);
  302. imagedestroy($image);
  303.  
  304. ?>

getip.php

  1. class IpLocation{
  2. private $fp;
  3. private $wrydat;
  4. private $wrydat_version;
  5. private $ipnumber;
  6. private $firstip;
  7. private $lastip;
  8. private $ip_range_begin;
  9. private $ip_range_end;
  10. private $country;
  11. private $area;
  12. const REDIRECT_MODE_0 = 0;
  13. const REDIRECT_MODE_1 = 1;
  14. const REDIRECT_MODE_2 = 2;
  15. function __construct(){
  16. $args = func_get_args();
  17. $this->wrydat = func_num_args()>0?$args[0]:'CoralWry.dat';
  18. $this->initialize();
  19. }
  20. function __destruct(){
  21. fclose($this->fp);
  22. }
  23. private function initialize(){
  24. if(file_exists($this->wrydat))
  25. $this->fp = fopen($this->wrydat,'rb');
  26. $this->getipnumber();
  27. $this->getwryversion();
  28. }
  29. public function get($str){
  30. return $this->$str;
  31. }
  32. public function set($str,$val){
  33. $this->$str = $val;
  34. }
  35. private function getbyte($length,$offset=null){
  36. if(!is_null($offset)){
  37. fseek($this->fp,$offset,SEEK_SET);
  38. }
  39. $b = fread($this->fp,$length);
  40. return $b;
  41. }
  42. /**
  43. * 把IP地址打包成二进制数据,以big endian(高位在前)格式打包
  44. * 数据存储格式为 little endian(低位在前) 如:
  45. * 00 28 C6 DA    218.198.40.0    little endian
  46. * 3F 28 C6 DA    218.198.40.0    little endian
  47. * 这样的数据无法作二分搜索查找的比较,所以必须先把获得的IP数据使用strrev转换为big endian
  48. * @param $ip
  49. * @return big endian格式的二进制数据
  50. */
  51. private function packip($ip){
  52. return pack( "N", intval( ip2long( $ip)));
  53. }
  54.  
  55. private function getlong($length=4, $offset=null){
  56. $chr=null;
  57. for($c=0;$length%4!=0&&$c<(4-$length%4);$c++){
  58. $chr .= chr(0);
  59. }
  60. $var = unpack( "Vlong", $this->getbyte($length, $offset).$chr);
  61. return $var['long'];
  62. }
  63.  
  64. private function getwryversion(){
  65. $length = preg_match("/coral/i",$this->wrydat)?26:30;
  66. $this->wrydat_version = $this->getbyte($length, $this->firstip-$length);
  67. }
  68.  
  69. private function getipnumber(){
  70. $this->firstip = $this->getlong();
  71. $this->lastip = $this->getlong();
  72. $this-&gt;ipnumber = ($this-&gt;lastip-$this-&gt;firstip)/<