ねごとめも背景

    ねごとめも



    作成したプログラムは、こちらでも公開しています。
    よかったら覗いてみてください。_(┐「ε:)_
    → javascript,SVG で作成したプログラム置き場
    → プログラム一覧 - (2)

    PHP 検索キーワード抽出 (2) [ filesize 関数 ファイルサイズ取得 ]

    前回作成したPHP 検索キーワド取得(1)では google Analytics と同じ検索キーワード結果を
    得る事が出来ていなかった。
    なので、現在までに確認できた範囲で訂正。
    アクセスログを調べてみると google の検索サイトからのアクセス時のキーワード取得に問題がある事が判明。
    google 検索からのアクセスの場合、ホスト名の後に # で区切って値を保持している場合があった。
    http://www.google.co.jp で検索をかけた場合、ホスト名の後に # 区切りで値を格納?
    http://www.google.com の場合は、 ? 区切りで値を格納?
    調べた範囲では上記の結果。
    リファラーが有効で検索サイトからのアクセスの場合、
    ホスト名の後に ? で区切って search や hash の値を保持してると思い込んでいた。

    訂正したのは javascript と PHP。。。
    PHP を設置してるサーバーのログを見てたらキーワード取得に失敗したケースには
    ページの内容をすべて読み込む前にページを離脱してるログが残っていた。
    なので、 window.onload で処理していた箇所を body 内に javascript を設置して
    検索キーワードを表示する iframe を document.write で出力するようにした。
    これで、処理順が上がって?検索キーワード ( referrer ) の取りこぼしが少なくなるはず!?
    PHP は # 区切りのリファラー処理の変更と
    検索キーワードを格納するログファイルにサイズ制限をかけた。
    今までは、ログをすべて格納。
    それを、 PHP の filesize 関数を使用してファイルサイズを取得。
    ファイルサイズが指定したサイズを超えた場合は古い検索キーワードを削除。
    ログを書き込むとき、一旦、配列に検索キーワードを格納してるから、
    ログ数指定でもよかったけど、 filesize 関数を使ったことがなかったので使用。

    ■ init.js

    
    addEvent(window,"load",function()
    {
    var url=window.location.href;
    	url=url.split("?");
    		url.shift();
    	var search=url.join("?");
    		loadFile(function(str){},"getWords.php",setPostData(["search",search]));
    		setTimeout(function(){ loadFile(writeWords,"keywords.txt",""); },500);
    		setInterval(function(){ loadFile(writeWords,"keywords.txt",""); },10000);
    });
    

    ■ getWords.php

    
    <?php
    	function getKeywords($href)
    	{
    		$result="";
    		$engine="";
    		$url=parse_url($href);
    		if(count($url)>3)
    		{
    			$result=isset($url["fragment"])? $url["fragment"] : $result=isset($url["query"])? $url["query"] : "";
    			switch($url["host"])
    			{
    				case "www.google.co.jp" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    							
    						}
    						$engine="google";
    				break;
    
    				case "www.google.com" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    							
    						}
    						$engine="google";
    				break;
    				
    				case "search.yahoo.co.jp" :
    						$flg=preg_match("/p=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    						}
    						$engine="yahoo";
    				break;
    				
    				case "www.bing.com" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    						}
    						$engine="bing";
    				break;
    				
    				default :
    						$result="";
    			}
    		}
    		return array("word"=>$result,"engine"=>$engine);
    	}
    
    	function addData($words,$engine)
    	{
    		$fp=fopen("keywords.txt","r+");
    		if($fp)
    		{
    			if(flock($fp,LOCK_EX))
    			{
    				$keyArray=array();
    				while(!feof($fp))
    				{
    					array_push($keyArray,trim(fgets($fp)));
    				}
    				if(filesize("keywords.txt")>1000)//ファイルサイズ取得 ( filesize 関数 )
    				{
    					array_pop($keyArray);//古い検索キーワード削除
    				}
    				rewind($fp);
    				ftruncate($fp,0);
    				//$words=str_replace(array("<",">"),array("&lt;","&gt"),trim($words));
    				$now=date('Y 年 m 月 d 日  H:i:s');
    				$words=htmlspecialchars(trim($words),ENT_QUOTES);
    				array_unshift($keyArray,$now."  [ ".$words." ] [ ".$engine." ]");
    				fwrite($fp,implode("\n",$keyArray));
    				flock($fp,LOCK_UN);
    			}
    		}
    		fclose($fp);
    	}
    	$search=@$_POST["search"];
    	$keywords=getKeywords($search);
    	$key=$keywords["word"];
    	if($keywords["word"]!="")
    	{
    		if(strpos($keywords["word"],"sa=t&")===0)
    		{
    			$keywords["word"]="not provided";
    		}
    		addData($keywords["word"],$keywords["engine"]);
    	}
    ?>
    

    2013/04/30 [03:45]
    • category : php,
    • comment : 0

    PHP google , yahoo , bing 検索キーワード抽出 (1)

    検索キーワード抽出 (2) [ filesize 関数 ファイルサイズ取得 ]

    ブラウザのリファラー設定が有効で検索サイトからアクセスが有った場合、
    PHP でリファラー値から検索キーワードを抽出後、ブログへ出力するテスト。
    chrome の google 検索も SLL 化されてるみたいだし、 chrome 使いじゃない人も
    ブラウザ設定で SLL 検索を使用してる人も多いはず。
    なのになじぇっ!

    ■ Javascript , PHP プログラム設置までの流れ

    fc2 ブログへ javascript ファイルを設置、 freeweb へPHP ファイルの設置。
    まず、最初に試したのは、fc2 ブログから javascript を使用して、freeweb に設置してある PHP を呼び出し、
    リファラーを処理、 freeweb に設置してある検索ログファイルへ値を書き込み、出力された値を javascript を利用して
    ブログに出力する流れ。
    これでうまくいくと思ってたけどエラー。
    XMLHttpRequest の status が 0 の値を返してくる。
    テストした範囲では status 0 の症状を改善する事が出来なかった。
    セキュリティ上の問題なのかな?よくわからない。

    次に試したのはブログに HTML の iframe タグを使用、 PHP 設置サイトにある HTML ファイルを呼び出し、
    そのファイルから、 Javascript を使用して PHP ファイルを呼び出し処理する流れ。
    PHP 設置サイトにある HTML へブログで取得したリファラーの値を渡すために、
    javascript を使用して iframe の src 属性の値に ( ? の後 )リファラー値を足してテスト。
    iframe で読み込んでいる HTML ファイルの javascript で parent.document.getElementById("keywordFrame")
    リファラーの値を取得後、処理する流れ。
    ローカルサバーでは問題なく動作。
    レンタルサーバーでプログラムを走らせると parent.document.getElementById("keywordFrame") の値が取得出来ずエラー。
    ドメインが違う ファイルからは値の参照ができない仕様?
    テストした範囲ではこの症状を改善することが出来なかった。
    セキュリティ上の問題??これもよくわからない。

    色々試して、ドメインが違う iframe の src の属性値は window.location.href で取得出来た。

    iframe 内へ読み込んだファイルのドメインが違う場合にリファラーの値を渡すには、
    iframe の src 属性へ javascript を使用して "?" の後にリファラーを足す。
    iframe 内ファイルの window.location.href に値が格納されてる。

    ねごとめもブログへリファラー設定有効で検索サイト ( google , yahoo , bing ) からアクセスが有った場合、
    PHP MEMO に設置してある PHP でリファラーから検索キーワードを抽出後、ブログ内へその結果を出力。
    まだ google Analytics と結果が一致してない。ヽ(・ω・)/ズコー

    ■ getWords.php

    
    <?php
    
    	function getKeywords($href)
    	{
    		$result="";
    		$engine="";
    		$url=parse_url($href);
    		if(count($url)>3)
    		{
    			$result=isset($url["fragment"])? $url["fragment"] : $result=isset($url["query"])? $url["query"] : "";
    			switch($url["host"])
    			{
    				case "www.google.co.jp" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    							
    						}
    						$engine="google";
    				break;
    
    				case "www.google.com" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    							
    						}
    						$engine="google";
    				break;
    				
    				case "search.yahoo.co.jp" :
    						$flg=preg_match("/p=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    						}
    						$engine="yahoo";
    				break;
    				
    				case "www.bing.com" :
    						$flg=preg_match("/q=([^&]+)/",$result,$match);
    						if($flg&&count($match)==2)
    						{
    							$result=(urldecode($match[1]));
    						}
    						$engine="bing";
    				break;
    				
    				default :
    						$result="";
    			}
    		}
    		return array("word"=>$result,"engine"=>$engine);
    	}
    
    	function addData($words,$engine)
    	{
    		$fp=fopen("keywords.txt","r+");
    		if($fp)
    		{
    			if(flock($fp,LOCK_EX))
    			{
    				$keyArray=array();
    				while(!feof($fp))
    				{
    					array_push($keyArray,trim(fgets($fp)));
    				}
    				rewind($fp);
    				ftruncate($fp,0);
    				//$words=str_replace(array("<",">"),array("&lt;","&gt"),trim($words));
    				$now=date('Y 年 m 月 d 日  H:i:s');
    				$words=htmlspecialchars(trim($words),ENT_QUOTES);
    				array_unshift($keyArray,$now."  [ ".$words." ] [ ".$engine." ]");
    				fwrite($fp,implode("\n",$keyArray));
    				flock($fp,LOCK_UN);
    			}
    		}
    		fclose($fp);
    	}
    	$keywords=getKeywords($_POST["host"]."?".$_POST["search"]);
    	if($keywords["word"]!="")
    	{
    		if(strpos($keywords["word"],"sa=t&")===0)
    		{
    			$keywords["word"]="not provided";
    		}
    		addData($keywords["word"],$keywords["engine"]);
    	}
    ?>
    

    2013/04/28 [00:14]
    • category : php,
    • comment : 0

    カウンター

    プロフィール

    negotoy

    Author:negotoy
    好きな選手権 :chara選手権
    好きなコーナー :リスナーが凸して
    椎名林檎の丸の内を歌うコーナー

    PC ゲーム歴 :
    モバゲーのタイピングゲームで
    タイピングの練習(サービス終了)
    ニックネーム : クッキー
    以降ゲーム歴なし

    [ YouTube ]

    chara : あいのうた
    椎名林檎 : ありあまる富
    かせきさいだぁ : じゃっ 夏なんで
    阿部真央 : 貴方の恋人になりたいのです

    最新記事

    カテゴリ

    カレンダー

    03 | 2013/04 | 05
    - 1 2 3 4 5 6
    7 8 9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30 - - - -


    PAGE TOP
    広告: