Try   HackMD

PHP 彈窗訊息轉址、跨網域存取Cookie

客戶反映有台灣用戶向他問東問西,最後也沒向他購買浪費他的時間,經發現是有台灣的業者盜用他的圖庫進行販售,沒關係就繼續用順便幫我打廣告吧~

確認用戶訊息

首先我們要來確認使用者的資訊,客戶只在中國販售,不希望其他地區使用圖庫,畢竟數據流量不是免費的,我們可以從裝置的語系及IP位置來判斷用戶是哪裡人,將不符合資格的客戶轉址到我的圖庫。

PHP判斷語系

這部分比較簡單,通過內建的指令就可以知道用戶的語言

<?php
$LANGUAGE = strtok($_SERVER['HTTP_ACCEPT_LANGUAGE'], ','); 
echo $LANGUAGE; //繁體中文為"zh-TW",簡體中文為"zh-c"
?>

IP位置判斷國籍

這部分比較複雜我們找到IP位置後須使用API來判定國籍,所以分成兩個檔案。

首先創建Request.php並在其寫入會用到的方法,取得IP和、取得國籍,在到主程式中呼叫使用,就不會這麼混亂。

//Request.php <?php class Request { public function getIpAddress() { $ipAddress = ''; if (! empty($_SERVER['HTTP_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_CLIENT_IP'])) { // check for shared ISP IP $ipAddress = $_SERVER['HTTP_CLIENT_IP']; } else if (! empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { // check for IPs passing through proxy servers // check if multiple IP addresses are set and take the first one $ipAddressList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); foreach ($ipAddressList as $ip) { if ($this->isValidIpAddress($ip)) { $ipAddress = $ip; break; } } } else if (! empty($_SERVER['HTTP_X_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_X_FORWARDED'])) { $ipAddress = $_SERVER['HTTP_X_FORWARDED']; } else if (! empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && $this->isValidIpAddress($_SERVER['HTTP_X_CLUSTER_CLIENT_IP'])) { $ipAddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP']; } else if (! empty($_SERVER['HTTP_FORWARDED_FOR']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED_FOR'])) { $ipAddress = $_SERVER['HTTP_FORWARDED_FOR']; } else if (! empty($_SERVER['HTTP_FORWARDED']) && $this->isValidIpAddress($_SERVER['HTTP_FORWARDED'])) { $ipAddress = $_SERVER['HTTP_FORWARDED']; } else if (! empty($_SERVER['REMOTE_ADDR']) && $this->isValidIpAddress($_SERVER['REMOTE_ADDR'])) { $ipAddress = $_SERVER['REMOTE_ADDR']; } return $ipAddress; } public function isValidIpAddress($ip) { if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) { return false; } return true; } public function getLocation($ip) { $ch = curl_init('http://ipwhois.app/json/' . $ip); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $json = curl_exec($ch); curl_close($ch); // Decode JSON response $ipWhoIsResponse = json_decode($json, true); // Country code output, field "country_code" return $ipWhoIsResponse; } }

主程式的部分,直接呼叫,就不用每次判定都寫長長的一串程式碼

require_once 'Request.php'; //讀取之前的檔案 $requestModel = new Request(); $ip = $requestModel->getIpAddress(); //取的IP $isValidIpAddress = $requestModel->isValidIpAddress($ip); //透過IP取得用戶資料 $jdata = json_encode($requestModel->getLocation($ip)); //將資料進行轉換 $country = json_decode($jdata, true)["country"]; echo $country; //中國為"China",香港"Hong Kong",台灣"Taiwan"

其實$jdata中有許多數據,這邊為了方便只取用 country 若需要都可再調用。

{"ip":"207.46.13.113","success":true,"type":"IPv4","continent":"North America","continent_code":"NA","country":"United States","country_code":"US","country_flag":"https:\/\/cdn.ipwhois.io\/flags\/us.svg","country_capital":"Washington D.C.","country_phone":"+1","country_neighbours":"CA,MX","region":"Massachusetts","city":"Quincy","latitude":42.25287720000000035724951885640621185302734375,"longitude":-71.0022704999999945130184642039239406585693359375,"asn":"AS8075","org":"Microsoft Corporation","isp":"Microsoft Corporation","timezone":"America\/New_York","timezone_name":"EDT","timezone_dstOffset":3600,"timezone_gmtOffset":-14400,"timezone_gmt":"-04:00","currency":"US Dollar","currency_code":"USD","currency_symbol":"$","currency_rates":1,"currency_plural":"US dollars"}

提示框轉址、跨域存取Cookie

上面的方法可以知道使用者的語系及國家,盜用者在台灣、客戶只在中國販賣,所以只要語系為台灣或者國家不在中國或香港,只要成立其中一個條件就轉址到我的圖庫。

轉址與提示框

<?php echo "<script> alert('即將轉址到Google');parent.location.href='https://www.google.com/'; </script>"; // ?>

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

呈現效果會向上圖,可簡短描述文字,當用戶點選確認後就會跳到Google搜尋畫面

Cookie是好吃的餅乾,我們常用的網頁是很多個檔案組成的,Cookie的可以在網頁中暫時儲存資料,
舉例:我們只需要登入一次蝦皮帳號,網頁就會記住我們的帳號資料,不需要切換個頁面就重新登入。

<?php //建立cookie變數test,數值為123,存活時間30秒 setcookie( "test", "123", time()+30); //讀取cookie,這邊會印出123 echo $_COOKIE["test"]; //刪除cookie,將數值改為空或存活時間砍光都可移除cookie setcookie( "test", "", time()-30); ?>

主跨域Cookie

一般Cookie只能存在同域中,只要頁面有跳動Cookie就會消失,我有多個圖庫希望都可以記住,這時候就需要建立跨域Cookie,不過在這之前先介紹一下網域。

www.google.com 是我們常用的搜尋引擎
mail.google.com 為Google的信箱
translate.google.com 為Google翻譯的網址

我們會發現Google旗下的服務,除了Youtube是後來併購的外,其他均為google.com結尾,而www為主網域、mail和translate就是子網域,一般的Cookie無法再子網域間通用,所以我們要建立跨域的Cookie,這樣只要在旗下的網頁都可讀取到,但這邊有個限制,主網域必須相同。

<?php //建立cookie變數msg,數值:true,時間:300秒,路徑:"/"為不限制,使用範圍:輸入主網域子網域也讀取的到 setcookie("msg",true,time()+300,"/","nephidog.com"); //讀取cookie,這邊會印出true echo $_COOKIE["test"]; //刪除cookie,將數值改為空或存活時間砍光都可移除cookie setcookie("msg","",time()-99999,"/","nephidog.com"); ?>

實際使用

剩下就是把上述的資料整合再一起,這也是寫程式最有趣的地方,將不符合的人導入到我的網站,我也有被盜圖的風險,所以這邊使用全域cookie,每五分鐘就宣告一次訊息,我們只需要將程式碼加入到入口網站也就是index.php就可以正常起作用拉。

首先是客戶的位置,加入轉址功能,跳轉到我的圖庫

require_once 'Request.php'; $requestModel = new Request(); $ip = $requestModel->getIpAddress(); $isValidIpAddress = $requestModel->isValidIpAddress($ip); $jdata = json_encode($requestModel->getLocation($ip)); $country = json_decode($jdata, true)["country"]; if(strtok($_SERVER['HTTP_ACCEPT_LANGUAGE'], ',')=='zh-TW' or !in_array($country, array("China","Hong Kong"))){ setcookie("msg",true,time()+300,"/","nephidog.com"); echo "<script> alert('近期有不良商家用本站縮圖製作劣質抱枕,♚尼腓工作室僅在蝦皮販售無任何分店,其餘管道購入無法保證其品質,請各位貴客知悉~!!!');parent.location.href='圖庫網址是秘密'; </script>"; }

再來是我自己圖庫的部分,只要讀取不到cookie,就會在跳一次宣告。

if ($_COOKIE['msg']==null){ setcookie("msg",true,time()+300,"/","nephidog.com"); echo "<script> alert('近期有不良商家用本站縮圖製作劣質抱枕,♚尼腓工作室僅在蝦皮販售無任何分店,其餘管道購入無法保證其品質,請各位貴客知悉~!!!'); </script>"; }

結語&工藝介紹

如果喜歡一件商品,建議還是向原作者購買,你們的支持是原作者的肯定,發展,仿品雖然價格便宜,材質用料以都無法與原品相比較,有很大的可能採雷。

尼腓工作室在繪圖、用料及印刷工藝上皆有嚴格把關,♚尼腓工作室 僅蝦皮一間店鋪無任何分店,其餘皆為復刻盜圖無法保證其品質,請各位主人們知悉~!!!

電子圖檔 (每公分至少需40up像素)

尼腓家 : 原創商品皆由專業繪師獨立繪製,原始檔案直接印刷,完美呈現細節。
盜圖仔 : 由縮圖放大,即使架構相似細節容易失真,可能有馬賽克的現象發生。

印刷工藝

尼腓家: 採用六色印刷,在色彩呈現上更加細緻接近原圖,可加價升級Hi-Fi 八色印刷。
仿間: 四色印刷,如遇敏感色時無法完美呈現,容易有跑色的問題。

材質包裝

可參照圖檔詳細介紹,在用料上絕不馬虎,給您最好的體驗。

材質用料










關於我們 ♚尼腓工作室

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

▼保證金賣家安心可靠

主要業務 :

  • 代儲專區 : 多款日韓手遊優惠代儲。
  • 動漫周邊 : 客製化動漫周邊 (抱枕、掛軸、床單、壓克力立牌吊飾),可來圖訂製。
  • 點卡專區 : GASH、Mycard、貝殼幣等點卡95折起。
  • 程式課程 : 零基礎Python入門 ( 團體/1對1 ) 線上課程、專案製作 。

優惠專區 :
代儲系列商品可轉帳付款,免去平台抽成享優惠價格,可至下方聯絡方式詢問。

聯絡方式