数学、電気の勉強始めました!プログラムにも挑戦しています!|ω・)ノ

ねごとめも背景

# ねごとめも

# カウンター

# プロフィール

negotoy

Author:negotoy
電気の勉強始めました!
テキストエディタを使ってプログラミングに挑戦中。
fc2 ブログに公開しているテンプレート等は、自由にカスタマイズして、ご活用ください。
プログラム実行の前に必ずコードの確認をお願いします。

# 最新記事

# カレンダー

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 - - - -

# スポンサードリンク

テキスト内指定文字列 CSS クラス名一括指定ツール作成しました。

前回作成した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"]);
	}
?>

検索キーワード抽出 (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"]);
	}
?>

# QRコード

QR

I use Vivaldi.

Download Vivaldi Web Browser Today!

# スポンサードリンク