OSDN Git Service

914d2eeb4ec41188d0d63aa26972222f0c2b42b7
[magic3/magic3.git] / include / manager / analyzeManager.php
1 <?php
2 /**
3  * アクセス解析マネージャー
4  *
5  * PHP versions 5
6  *
7  * LICENSE: This source file is licensed under the terms of the GNU General Public License.
8  *
9  * @package    Magic3 Framework
10  * @author     平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
11  * @copyright  Copyright 2006-2018 Magic3 Project.
12  * @license    http://www.gnu.org/copyleft/gpl.html  GPL License
13  * @version    SVN: $Id$
14  * @link       http://www.magic3.org
15  */
16 require_once(M3_SYSTEM_INCLUDE_PATH . '/common/core.php');
17 require_once(M3_SYSTEM_INCLUDE_PATH . '/db/analyticsDb.php');
18
19 class AnalyzeManager extends Core
20 {
21         private $db;                                            // DBオブジェクト
22         private $analyticsDb;
23         const NOT_FOUND_BROWSER_IMAGE = 'noimage.png';                  // ブラウザアイコンが見つからなかった場合のアイコン
24         const CF_LAST_DATE_CALC_PV      = 'last_date_calc_pv';  // ページビュー集計の最終更新日
25         const MAX_CALC_DAYS = 30;                                       // 最大集計日数
26         const CRAWLER_DETECT_SCRIPT_DIR = '/Crawler-Detect-1.2.54/';            // クローラー解析スクリプトディレクトリ
27         const BROWSER_DETECT_SCRIPT = '/PhpUserAgent-0.7.0/UserAgentParser.php';                // ブラウザ判定スクリプト
28         const PLATFORM_DETECT_SCRIPT_DIR = '/php-browser-detector-6.1.2/';              // プラットフォーム判定スクリプト
29         
30         /**
31          * コンストラクタ
32          */
33         function __construct()
34         {
35                 // 親クラスを呼び出す
36                 parent::__construct();
37                 
38                 // システムDBオブジェクト取得
39                 $this->db = $this->gInstance->getSytemDbObject();
40                 $this->analyticsDb = new analyticsDb();
41         }
42         /**
43          * コンテンツのビューカウントを更新
44          *
45          * @param string    $typeId                             コンテンツタイプ
46          * @param int           $serial                         コンテンツシリアル番号(0のときはコンテンツIDを使用)
47          * @param string        $day                            日にち
48          * @param int           $hour                           時間
49          * @param string    $contentId                  コンテンツID
50          * @return bool                                                 true=成功, false=失敗
51          */
52         function updateContentViewCount($typeId, $serial, $day = null, $hour = null, $contentId = '')
53         {
54                 $ret = $this->db->updateViewCount($typeId, $serial, $contentId, $day, $hour);
55                 return $ret;
56         }
57         /**
58          * コンテンツのビューカウントを取得
59          *
60          * @param string    $typeId                             コンテンツタイプ
61          * @param int $serial                                   コンテンツシリアル番号(0のときはコンテンツIDを使用)
62          * @param string    $contentId                  コンテンツID
63          * @return int                                                  総参照数
64          */
65         function getTotalContentViewCount($typeId, $serial, $contentId = '')
66         {
67                 $count = $this->db->getTotalViewCount($typeId, $serial, $contentId);
68                 return $count;
69         }
70         /**
71          * コンテンツ参照を記録
72          *
73          * @param string    $typeId                             コンテンツタイプ
74          * @param int           $serial                         コンテンツシリアル番号
75          * @param string    $contentId                  コンテンツID
76          * @return bool                                                 true=記録、false=記録しない
77          */
78         function logContentView($typeId, $serial, $contentId = '')
79         {
80                 static $day;
81                 static $hour;
82                 
83                 // パラメータエラーチェック
84                 $serial = intval($serial);
85                 if ($serial <= 0) return false;
86                 
87                 // コンテンツ参照ない場合は終了
88                 if (!$this->canRegistContentView()) return false;
89
90                 if (!isset($day)) $day = date("Y/m/d");         // 日
91                 if (!isset($hour)) $hour = (int)date("H");              // 時間
92
93                 $ret = $this->db->updateViewCount($typeId, $serial, $contentId, $day, $hour);
94                 return $ret;
95         }
96         /**
97          * 検索キーワードログを記録
98          *
99          * @param string    $widgetId                   ウィジェットID
100          * @param string    $keyword                    検索キーワード
101          * @return bool                                                 true=記録、false=記録しない
102          */
103         function logSearchWord($widgetId, $keyword)
104         {
105                 // 引数エラーチェック
106                 if (empty($keyword)) return false;
107                 
108                 // 端末タイプを判定
109                 
110                 // クライアントIDを取得
111                 $cid = $this->gAccess->getClientId();// クッキー値のクライアントID
112                 
113                 // スペース区切りの場合はワードを分割
114                 // 全角英数を半角に、半角カナ全角ひらがなを全角カナに変換
115                 $basicWord = $keyword;
116                 if (function_exists('mb_convert_kana')) $basicWord = mb_convert_kana($basicWord, 'aKCV');
117                 $basicWord = strtolower($basicWord);            // 大文字を小文字に変換
118                 
119                 // アクセスパスを取得
120                 $path = $this->gEnv->getAccessPath();
121                 
122                 // 検索キーワードログ書き込み
123                 $this->db->writeSearchWordLog(0/*デバイスタイプ*/, $cid, $widgetId, $keyword, $basicWord, $path);
124                 return true;
125         }
126         /**
127          * コンテンツダウンロードログを記録
128          *
129          * @param string    $contentType                コンテンツタイプ
130          * @param string    $contentId                  コンテンツID
131          * @return bool                                                 true=記録、false=記録しない
132          */
133         function logContentDownload($contentType, $contentId)
134         {
135                 // ダウンロードログ書き込み
136                 $ret = $this->db->writeDownloadLog($contentType, $contentId);
137                 return $ret;
138         }
139         /**
140          * ブラウザのタイプを取得
141          *
142          * (注意)クローラーがシュミレートしている場合はクローラーと判定する
143          *
144          * @param string $agent         解析元の文字列。HTTP_USER_AGENTの値。
145          * @return array                        ブラウザ情報
146          */
147         public function getBrowserType($agent)
148         {
149 /*
150 //$agent = 'DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)';              // google 携帯シュミレート
151 $agent = 'Mozilla/5.0 (compatible; Steeler/3.5; http://www.tkl.iis.u-tokyo.ac.jp/~crawler/)';           // クローラー
152 //
153 //$agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)';
154 $agent = 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko';
155 $agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393';            // edge
156 $agent = 'Mozilla/5.0 (iPad; CPU OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1';            // ipad
157 $agent = 'Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1';   // android
158 $agent = 'SoftBank/1.0/831SH/SHJ003/SN123456789012345 Browser/NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1';    // SoftBank携帯
159
160 $agent = 'Mozilla/5.0 (PlayStation Vita 3.01) AppleWebKit/536.26 (KHTML, like Gecko) Silk/3.2';
161 $agent = 'SAMSUNG-GT-C3303/C3303DDJG4 NetFront/3.5 Profile/MIDP-2.0 Configuration/CLDC-1.1';
162 //$agent = 'Mozilla/5.0 (Linux; U; Android 4.0.3; ja-jp; SC-02C Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30';         // Android標準
163 //$agent = 'Mozilla/5.0 (Linux; Android 4.0.3; SC-02C Build/IML74K) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.58 Mobile Safari/537.31';           // Android Chrome
164 $agent = 'Mozilla/4.0 (PS2; PlayStation BB Navigator 1.0) NetFront/3.0';
165 $agent = 'Opera/9.80 (Android; Opera Mini/6.5.27452/27.1324; U; ja) Presto/2.8.119 Version/11.10';
166 $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.122 Safari/537.36 Vivaldi/1.4.589.29';           // Vivaldi
167 $agent = 'Mozilla/5.0 (PlayStation 4 1.70) AppleWebKit/536.26 (KHTML, like Gecko)';                     // Playstation4
168 $agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36';
169 $agent = 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 1320) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537';        // Windows Phone(new) -> NG
170 $agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; FujitsuToshibaMobileCommun; IS12T; KDDI)';        // Windows Phone(old)
171 $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 OPR/42.0.2393.94';              // Opera Next
172 // ***** 検出失敗(2016/10/19) *****
173 $agent = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; WOW64; Trident/7.0; Sleipnir6/6.2.1; SleipnirSiteUpdates/6.2.1)';                // Sleipnir RSS取得用
174 $agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 Sleipnir/6.2.1';               // Sleipnir
175 */
176                 $resultObj = array();
177
178                 // クローラーかどうかのチェック
179                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'CrawlerDetect.php');
180                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/AbstractProvider.php');
181                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Crawlers.php');
182                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Exclusions.php');
183                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Headers.php');
184                 
185                 $crawlerDetect = new Jaybizzle\CrawlerDetect\CrawlerDetect;
186                 if ($crawlerDetect->isCrawler($agent)){         // クローラー検出の場合
187                         $crawlerName = $crawlerDetect->getMatches();
188                         $resultObj['name'] = strval($crawlerName);
189                         $resultObj['browser'] = strtolower($crawlerName);
190 //                              $resultObj['version'] = strtolower($infoObj['version']);
191                         $crawlerIcon = $this->_getBrowserIconFile($resultObj['browser']);
192                         if (empty($crawlerIcon)) $crawlerIcon = $this->_getBrowserIconFile('crawler');          // クローラーデフォルトアイコン
193                         $resultObj['icon'] = $crawlerIcon;
194                 } else {
195                         // ブラウザを解析
196                         require_once(M3_SYSTEM_LIB_PATH . self::BROWSER_DETECT_SCRIPT);
197                         
198                         $infoObj = parse_user_agent($agent);
199                         $resultObj['name'] = strval($infoObj['browser']);
200                         $resultObj['platform'] = strtolower($infoObj['platform']);
201                         $resultObj['browser'] = strtolower($infoObj['browser']);
202                         $resultObj['version'] = strtolower($infoObj['version']);
203                         $resultObj['icon'] = $this->_getBrowserIconFile($resultObj['browser']);
204                         if (empty($resultObj['icon'])) $resultObj['icon'] = self::NOT_FOUND_BROWSER_IMAGE;                      // ブラウザアイコンが見つからなかった場合
205                 }
206                 return $resultObj;
207         }
208         /**
209          * プラットフォーム(OSまたは携帯機種)のタイプを取得
210          *
211          * @param string $agent         解析元の文字列。HTTP_USER_AGENTの値。
212          * @return array                        プラットフォーム情報
213          */
214         public function getPlatformType($agent)
215         {
216                 $resultObj = array();
217                 
218                 require_once(M3_SYSTEM_LIB_PATH . self::PLATFORM_DETECT_SCRIPT_DIR . 'DetectorInterface.php');
219                 require_once(M3_SYSTEM_LIB_PATH . self::PLATFORM_DETECT_SCRIPT_DIR . 'BrowserDetector.php');
220                 require_once(M3_SYSTEM_LIB_PATH . self::PLATFORM_DETECT_SCRIPT_DIR . 'UserAgent.php');
221                 require_once(M3_SYSTEM_LIB_PATH . self::PLATFORM_DETECT_SCRIPT_DIR . 'OsDetector.php');
222                 require_once(M3_SYSTEM_LIB_PATH . self::PLATFORM_DETECT_SCRIPT_DIR . 'Os.php');
223
224                 $osInfo = new Sinergi\BrowserDetector\Os($agent);
225                 $resultObj['name'] = strval($osInfo->getName());
226                 $resultObj['platform'] = strtolower($resultObj['name']);
227                 $resultObj['version_name'] = strval($osInfo->getVersion());
228                 $resultObj['version'] = strtolower($resultObj['version_name']);
229                 $resultObj['icon'] = $this->_getOsIconFile($resultObj['platform']);
230                 return $resultObj;
231         }
232         /**
233          * ブラウザの言語から国コードを取得
234          *
235          * @param string $lang          解析元の文字列。HTTP_ACCEPT_LANGUAGEの値
236          * @return string                       国コード
237          */
238         public function getBrowserCountryCode($lang)
239         {
240                 $lang = $this->parseBrowserLanguage($lang);
241                 $tmpLang = explode(',', $lang);
242                 return $this->getCountryCodeFromBrowserLanguage($tmpLang[0]);
243         }
244         /**
245          * ブラウザの言語を取得
246          *
247          * @param string $lang          解析元の文字列。HTTP_ACCEPT_LANGUAGEの値 例)ja,en-us;q=0.7,en;q=0.3
248          * @return string                       言語(カンマ区切り) 例)ja,en-us,en
249          */
250         public function parseBrowserLanguage($lang)
251         {
252                 $replacementPatterns = array(
253                                 '/(\\\\.)/',     // quoted-pairs (RFC 3282)
254                                 '/(\s+)/',       // CFWS white space
255                                 '/(\([^)]*\))/', // CFWS comments
256                                 '/(;q=[0-9.]+)/' // quality
257                         );
258
259                 $browserLang = strtolower(trim($lang));
260
261                 // language tags are case-insensitive per HTTP/1.1 s3.10 but the region may be capitalized per ISO3166-1;
262                 // underscores are not permitted per RFC 4646 or 4647 (which obsolete RFC 1766 and 3066),
263                 // but we guard against a bad user agent which naively uses its locale
264                 $browserLang = strtolower(str_replace('_', '-', $browserLang));
265
266                 // filters
267                 $browserLang = preg_replace($replacementPatterns, '', $browserLang);
268
269                 $browserLang = preg_replace('/((^|,)chrome:.*)/', '', $browserLang, 1); // Firefox bug
270                 $browserLang = preg_replace('/(,)(?:en-securid,)|(?:(^|,)en-securid(,|$))/', '\\1',     $browserLang, 1); // unregistered language tag
271
272                 $browserLang = str_replace('sr-sp', 'sr-rs', $browserLang); // unofficial (proposed) code in the wild
273                 return $browserLang;
274         }
275         /**
276          * ブラウザの言語から国コードを取得
277          *
278          * @param string $lang          解析元の文字列。HTTP_ACCEPT_LANGUAGEの値
279          * @return string                       国コード
280          */
281         public function getCountryCodeFromBrowserLanguage($browserLanguage)
282         {
283                 global $COUNTRY_LIST, $LANGUAGE_TO_COUNTRY;
284
285                 require_once(M3_SYSTEM_INCLUDE_PATH . '/data/analyzeMap.php');// アクセス解析用マップ情報
286                 $validCountries = array_keys($COUNTRY_LIST);
287                 $langToCountry = array_keys($LANGUAGE_TO_COUNTRY);
288
289                 if (preg_match('/^([a-z]{2,3})(?:,|;|$)/', $browserLanguage, $matches)){
290                         // match language (without region) to infer the country of origin
291                         if(in_array($matches[1], $langToCountry)) return $LANGUAGE_TO_COUNTRY[$matches[1]];
292                 }
293                 if (!empty($validCountries) && preg_match_all("/[-]([a-z]{2})/", $browserLanguage, $matches, PREG_SET_ORDER)){
294                         foreach($matches as $parts){
295                                 // match location; we don't make any inferences from the language
296                                 if(in_array($parts[1], $validCountries)) return $parts[1];
297                         }
298                 }       
299                 return 'xx';
300         }
301         /**
302          * アクセスログからアクセス解析用のデータを作成
303          *
304          * @param array         $message        エラーメッセージ
305          * @param int           $maxDay         最大集計日数
306          * @return bool                                 true=正常終了、false=異常終了
307          */
308         function updateAnalyticsData(&$message = null, $maxDay = self::MAX_CALC_DAYS)
309         {
310                 $ret = $this->analyticsDb->getOldAccessLog($row);
311                 if ($ret){              // 集計対象のデータが存在するとき
312                         $startDate = date("Y/m/d", strtotime($row['al_dt']));
313                         $lastDate = $this->analyticsDb->getStatus(self::CF_LAST_DATE_CALC_PV);
314
315                         // 集計開始日を求める
316                         if (!empty($lastDate)){
317                                 $startDate = date("Y/m/d", strtotime("$lastDate 1 day"));               // 翌日
318                         }
319                         // 集計終了日を求める
320                         $endDate = date("Y/m/d", strtotime("-1 day"));  // 前日
321                         $endTime = strtotime($endDate);
322                 
323                         // 集計処理を行う
324                         $dayCount = 0;          // 集計日数
325                         $date = $startDate;
326                         while (true){
327                                 if (strtotime($date) > $endTime){
328                                         if (!is_null($message)) $message[] = '集計完了しました';
329                                         break;
330                                 }
331                                 // トランザクションスタート
332                                 $this->analyticsDb->startTransaction();
333
334                                 $ret = $this->analyticsDb->calcDatePv($date);
335                                 
336                                 // 集計日付を更新
337                                 if ($ret) $ret = $this->analyticsDb->updateStatus(self::CF_LAST_DATE_CALC_PV, $date);
338                                 
339                                 // トランザクション終了
340                                 $this->analyticsDb->endTransaction();
341
342                                 // エラーの場合は終了
343                                 if (!$ret){
344                                         if (!is_null($message)) $message[] = 'エラーが発生しました';
345                                         break;
346                                 }
347                                 
348                                 // 集計日数を更新
349                                 $dayCount++;
350                                 if ($dayCount >= $maxDay){
351                                         if (!is_null($message)) $message[] = $maxDay . '日分の集計完了しました';
352                                         break;
353                                 }
354                                 
355                                 $date = date("Y/m/d", strtotime("$date 1 day"));
356                         }
357                 } else {                                // 集計データがないとき
358                         if (!is_null($message)) $message[] = '集計対象のアクセスログがありません';
359                         
360                         $ret = true;            // 正常終了
361                 }
362                 return $ret;
363         }
364         /**
365          * アクセスログの即時アクセス解析
366          *
367          * @param int $logSerial                アクセスログシリアル番号
368          * @param string $cookieValue   アクセス管理用クッキー値
369          * @return bool                                 true=成功、false=失敗
370          */
371         function realtimeAnalytics($logSerial, $cookieValue)
372         {
373                 global $gRequestManager;
374 //              global $gEnvManager;
375                 
376                 $uri            = $gRequestManager->trimServerValueOf('REQUEST_URI');
377                 $referer        = $gRequestManager->trimServerValueOf('HTTP_REFERER');
378                 $agent          = $gRequestManager->trimServerValueOf('HTTP_USER_AGENT');               // ユーザエージェント
379                 $language       = $gRequestManager->trimServerValueOf('HTTP_ACCEPT_LANGUAGE');  // クライアント認識可能言語
380                 
381                 // 最初のアクセスかどうか確認(アクセス管理用クッキー値が存在するかどうか)
382                 $isFirstAccess = false;         // 最初のアクセスかどうか
383                 $ret = $this->analyticsDb->isExistsCookieValueInAccessLog($cookieValue, $logSerial);
384                 if (!$ret) $isFirstAccess = true;
385                 
386                 // クローラーかどうかをチェック
387 /*              $isCrawler = false;
388                 if (empty($agent)){             // ユーザエージェントが設定されていないものはクローラーと見なす
389                         $isCrawler = true;
390                 } else {
391                         $crawlerArray = array('bot', 'crawl');
392                         foreach ($crawlerArray as $value){
393                                 if (preg_match('/' . preg_quote($value, '/') . '/i', $agent)){
394                                         $isCrawler = true;
395                                         break;
396                                 }
397                         }
398                 }*/
399                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'CrawlerDetect.php');
400                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/AbstractProvider.php');
401                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Crawlers.php');
402                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Exclusions.php');
403                 require_once(M3_SYSTEM_LIB_PATH . self::CRAWLER_DETECT_SCRIPT_DIR . 'Fixtures/Headers.php');
404                 
405                 $crawlerDetect = new Jaybizzle\CrawlerDetect\CrawlerDetect;
406                 $isCrawler = false;
407                 if ($crawlerDetect->isCrawler()) $isCrawler = true;
408                 
409                 // アクセスログを更新
410                 $ret = $this->analyticsDb->updateAccessLog($logSerial, $isFirstAccess, $isCrawler);
411                 
412                 return $ret;
413         }
414         /**
415          * コンテンツのアクセスログを記録するかどうかを取得
416          *
417          * @return bool                 true=記録する、false=記録しない
418          */
419         public function canRegistContentView()
420         {
421                 global $gRequestManager;
422                 
423                 static $canRegist;
424                 
425                 if (!isset($canRegist)){
426                         if (!$this->gEnv->isSystemManageUser() &&                       // システム運用者以上の場合はカウントしない
427                                 !$gRequestManager->isCmdAccess()){                              // cmd付きアクセスでない
428                                 $canRegist = true;
429                         } else {
430                                 $canRegist = false;
431                         }
432                 }
433                 return $canRegist;
434         }
435         /**
436          * ブラウザアイコンファイル名を取得
437          *
438          * @param string  $type         ブラウザ種別
439          * @return string                       ファイル名(該当なしの場合は空文字列)
440          */
441         public function _getBrowserIconFile($type)
442         {
443                 // ブラウザアイコンファイル名
444                 static $browserIconFile = array(
445                         'opera'                                                 => 'opera.png',
446                         'opera next'                                    => 'operanext.png',
447                         'silk'                                                  => 'silk.png',
448                         'msie'                                                  => 'ie.png',
449                         'microsoft internet explorer'   => 'ie.png',
450                         'internet explorer'                             => 'ie.png',
451                         'edge'                                                  => 'edge.png',
452                         'android browser'                               => 'android.png',
453                         'netscape6'                                             => 'netscape.png',
454                         'netscape'                                              => 'netscape.png',
455                         'netfront'                                              => 'netfront.gif',
456                         'galeon'                                                => 'galeon.png',
457                         'phoenix'                                               => 'phoenix.png',
458                         'firefox'                                               => 'firefox.png',
459                         'mozilla firebird'                              => 'firebird.png',
460                         'firebird'                                              => 'firebird.png',
461                         'seamonkey'                                             => 'seamonkey.png',
462                         'camino'                                                => 'camino.png',
463                         'safari'                                                => 'safari.png',
464                         'chrome'                                                => 'chrome.gif',
465                         'k-meleon'                                              => 'k-meleon.png',
466                         'mozilla'                                               => 'mozilla.gif',
467                         'konqueror'                                             => 'konqueror.png',
468                         'blackberry'                                    => '',
469                         'icab'                                                  => 'icab.png',
470                         'lynx'                                                  => '',
471                         'links'                                                 => '',
472                         'ncsa mosaic'                                   => '',
473                         'amaya'                                                 => '',
474                         'omniweb'                                               => 'omniweb.png',
475                         'hotjava'                                               => '',
476                         'browsex'                                               => '',
477                         'amigavoyager'                                  => '',
478                         'amiga-aweb'                                    => '',
479                         'ibrowse'                                               => '',
480                         'arora'                                                 => '',
481                         'epiphany'                                              => 'epiphany.png',
482                         'flock'                                                 => 'flock.png',
483                         'sleipnir'                                              => 'sleipnir.gif',
484                         'lunascape'                                             => 'lunascape.gif',
485                         'shiira'                                                => 'shiira.gif',
486                         'swift'                                                 => 'swift.png',
487                         'wamcom.org'                                    => '',
488                         'playstation portable'                  => 'playstation.gif',
489                         'scej psp browser'                              => '',  // ワイプアウトピュア
490                         'w3m'                                                   => '',
491                         'netcaptor'                                             => 'netcaptor.gif',
492                         'netcraft'                                              => 'netcraft.png',
493                         'webtv'                                                 => 'webtv.gif',
494                         'vivaldi'                                               => 'vivaldi.png',
495                         
496                         // ダウンローダ
497                         'freshreader'                                   => '',
498                         'pockey'                                                => '',          // GetHTMLW
499                         'wwwc'                                                  => '',
500                         'wwwd'                                                  => '',
501                         'flashget'                                              => '',
502                         'download ninja'                                => '',  // ダウンロードNinja
503                         'webauto'                                               => '',
504                         'arachmo'                                               => '',
505                         'wget'                                                  => '',
506                         
507                         // RSSリーダー
508                         'simplepie'                                             => 'simplepie.png',
509                         
510                         // クローラー
511                         'applebot'                                      => 'applebot.png',
512                         'googlebot'                                     => 'google.gif',        // Google
513                         'googlebot-mobile'                      => 'google.gif',        // Google-Mobile
514                         'mediapartners-google'          => 'google.gif',        // Google
515                         'google favicon'                        => 'google.gif',        // Google
516                         'google web preview'            => 'google.gif',        // Google
517                         'msnbot'                                        => 'msn.gif',   // MSN
518                         'msnbot-media'                          => 'msn.gif',   // MSN
519                         'yahooseeker'                           => 'yahoo.gif', // YahooSeeker
520                         'slurp'                                         => 'yahoo.gif', // Yahoo!
521                         'yahoo! de slurp'                       => 'yahoo.gif', // Yahoo!
522                         'yahoo! slurp'                          => 'yahoo.gif', // Yahoo!
523                         'zyborg'                                        => '',  // InfoSeek
524                         'infoseek'                                      => '',  // InfoSeek
525                         'slurp.so/goo; slurp'           => 'goo.gif',   // goo
526                         'mogimogi'                                      => 'goo.gif',   // goo
527                         'moget'                                         => 'goo.gif',   // goo
528                         'ichiro'                                        => 'goo.gif',   // goo
529                         'baiduspider'                           => 'baidu.png', // 百度
530                         'baiduspider+'                          => 'baidu.png', // 百度
531                         'sogou web spider'                      => '',                  // 搜狗
532                         'asahina-antenna'                       => '',                  // 朝日奈アンテナ
533                         'hatena'                                        => 'hatena.gif',        // はてなブックマーク
534                         'hatena antenna'                        => 'hatena.gif',        // はてなアンテナ
535                         'yeti'                                          => 'naver.gif', // Naver(韓国)
536                         'icc-crawler'                           => 'nict.gif',  // 独立行政法人情報通信研究機構
537                         'dotbot'                                        => 'dotbot.gif',        // Dotbot
538                         'speedy spider'                         => 'entireweb.png',     // Entireweb
539                         'turnitinbot'                           => 'turnitinbot.png',   // TurnitinBot
540                         'bingbot'                                       => 'bing.png',  // Bing
541                         'bingpreview'                           => 'bing.png',  // Bing
542                         'yacybot'                                       => 'yacy.png',  // YaCy
543                         'mj12bot'                                       => 'mj12bot.png',
544                         'ahrefsbot'                                     => 'ahrefs.png',
545                         'semrushbot'                            => 'semrush.png',
546                         'scrapy'                                        => 'scrapy.png',
547                         'deusu'                                         => 'deusu.png',
548                         'yandex'                                        => 'ya.png',
549                         'u-tokyo'                                       => 'tokyo_univ.png',    // 東京大学 喜連川研究室
550                         
551                         // クローラーその他
552                         'msproxy'                                       => '',  // ProxyServer
553                         'spacebison'                            => '',  // Proxomitron
554                         'bookmark renewal'                      => '',  // Bookまーく
555                         'hatenascreenshot'                      => '',  // はてなスクリーンショット
556                         'monazilla'                                     => '',
557                         'crawler'                                       => 'crawler.png',                       // クローラー該当なしの場合
558
559                         // 携帯
560                         'docomo'                                        => 'docomo.gif',                // ドコモ
561                         'au'                                            => 'au.gif',            // au
562                         'softbank'                                      => 'softbank.gif',              // ソフトバンク
563                         'willcom'                                       => 'willcom.gif',               // WILLCOM
564                 );
565                 $filename = $browserIconFile[$type];
566                 if (!isset($filename)) $filename = '';
567                 return $filename;
568         }
569         /**
570          * OSアイコンファイル名を取得
571          *
572          * @param string  $type         OS種別
573          * @return string                       ファイル名(該当なしの場合は空文字列)
574          */
575         public function _getOsIconFile($type)
576         {
577                 // OSアイコンファイル名
578                 static $osIconFile = array(
579 /*                      'IPD' => '',    // iPod
580                         'IPH' => '',    // iPhone
581                         'WII' => '',    // Nintendo Wii
582                         'PSP' => '',    // PlayStation Portable
583                         'PS3' => '',    // PlayStation 3
584                         'AND' => '',    // Android
585                         'POS' => '',    // PalmOS
586                         'BLB' => '',    // BlackBerry
587                         'WI7' => 'winvista.gif',        // Windows NT 6.1, Windows 7
588                         'WVI' => 'winvista.gif',        // Windows NT 6.0, Windows Vista
589                         'WS3' => 'win.gif',     // Windows NT 5.2, Windows Server 2003
590                         'WXP' => 'win.gif',     // Windows NT 5.1, Windows XP
591                         'W98' => 'win98.gif',   // Windows 98
592                         'W2K' => 'win.gif',     // Windows NT 5.0, Windows 2000
593                         'WNT' => 'win98.gif',   // Windows NT 4.0
594                         'WME' => 'win98.gif',   // Win 9x 4.90, Windows ME
595                         'W95' => 'win98.gif',   // Windows 95
596                         'MAC' => '',    // Mac PowerPC
597                         'LIN' => '',    // Linux
598                         */
599                         'windows'               => 'windows.png',
600                         'windows phone' => 'windowsphone.gif',
601                         'os x'                  => 'osx.png',
602                         'ios'                   => 'ios.png',
603                         'android'               => 'android.png',
604                         'chrome os'             => 'chromeos.gif',
605                         'linux'                 => 'linux.gif',
606                         'symbos'                => '',
607                         'nokia'                 => '',
608                         'blackberry'    => '',
609                         'freebsd'               => 'bsd.gif',
610                         'openbsd'               => 'openbsd.gif',
611                         'netbsd'                => 'bsd.gif',
612                         'opensolaris'   => '',
613                         'sunos'                 => 'sun.gif',
614                         'os2'                   => 'os2.gif',
615                         'beos'                  => ''
616                 );
617                 $filename = $osIconFile[$type];
618                 if (!isset($filename)) $filename = '';
619                 return $filename;
620         }
621 }
622 ?>