へそブルー-画像検索サイトのソースコード

私が作成したサイトへそブルー-画像検索サイトのソースコードをほぼそのまま公開します。

使用言語はPHPのみです。

画像検索のためにBing APIを使用しています。

ソースコードにisGetAdult関数があると思いますが、この関数は作成したものの、へそブルーでは使っていません(GETでadultに値を渡すような処理を実装していません)。なぜなら、使っていなくてもアダルトな画像がバンバン検索できてしまうからです。なので、正直Bing APIの日本語検索の際はアダルトのセーフ機能が効いていないんじゃないかと疑っている。

他にも使ってない関数がちらほらあるけど、コードを整理するのが面倒くさいので、実際にどの関数を使用していて、どの関数を使用していないかは、頑張って解読するんだ。

ソースコードの$bing_api_acctKey="あなたのAPIキーを設定してください"には、実際にはあなたがBing APIのサイトで取得したAPIのキーを設定してください。

え?「コピペしてAPIのキーも設定したのにへそブルーみたいにならない」?なぜならデザインはcssファイルで別に記述しているからです。でも、画像を検索するという機能は問題ないはず。

formの送信先をaction="/"としていますが、送信先はこのファイル自身を指定しています。(へそブルーでは、このコードのファイル名はindex.phpなので、送信先を"/"と指定することでこのファイル自身を指定しています。)

適当プログラマーへ戻る。

<?php
	function isGetText(){
		if(isset($_GET['text']) && is_string($_GET['text']) && !($_GET['text'] === '')) {
			return true;
		} else {
			return false;
		}
	}
	function isGetAdult(){
		if(isset($_GET['adult']) && is_string($_GET['adult']) && !($_GET['adult'] === '')) {
			return true;
		} else {
			return false;
		}
	}

	function isGetPage(){
		if(isset($_GET['page']) && is_string($_GET['page']) && !($_GET['page'] === '') && ctype_digit($_GET['page'])) {
			return true;
		} else {
			return false;
		}
	}

	function getImageJson($text, $page){
		$bing_api_acctKey ="あなたのAPIキーを設定してください";
		if(isGetAdult){
			$bing_api_requestUri = 'https://api.cognitive.microsoft.com/bing/v5.0/images/search?safeSearch=Off&q=';
		} else {
			$bing_api_requestUri = 'https://api.cognitive.microsoft.com/bing/v5.0/images/search?q=';
		}
		$page = ((int)$page - 1) * 150;
		$bing_api_requestUri .= $text.'&count=150&offset='.$page;
		$bing_api_data = array(
			'http'=>array(
				'method'=>'GET',
				'header'=>"Ocp-Apim-Subscription-Key: $bing_api_acctKey"
			)
		);
		$bing_api_context = stream_context_create($bing_api_data);
		$bing_api_response = file_get_contents($bing_api_requestUri, 0, $bing_api_context);
		//echo $bing_api_response;

		$bing_api_jsonObj = json_decode($bing_api_response);
		return $bing_api_jsonObj;
	}

	function isExistNextPage($max, $page){
		$page = ((int)$page - 1) * 150;
		if($page < (int)$max){
			return true;
		} else {
			return false;
		}
	}

	function isExistBeforePage($text, $page){
		if($page < 2) {
			return false;
		} else {
			return true;
		}
	}

	if(isGetText() && isGetPage()){
		$text = rawurlencode($_GET['text']);
		$page = rawurlencode($_GET['page']);
		$image_jsonObj = getImageJson($text, $page);
	}
	
?>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="keywords" content="画像検索,写真検索">
		<meta name="description" content="画像検索サイトです。">
		<title>へそブルー - 画像検索サイト</title>
		<link rel="stylesheet" href="css/default.css">
	</head>
	<body>
		<header>
			<div>
				<h1><a href="./">へそブルー</a></h1>
				<p>- 画像検索サイト -</p>
				<form action="/" method="GET">
					<p><input type="text" size="50" name="text" value="<?php if(isGetText()){echo htmlspecialchars($_GET['text']);} ?>"><input type="hidden" name="page" value="1"></p>
					<p><input type="submit" value="検索する"></p>
				</form>
			</div>
		</header>
		<section>
<?php
	if(isGetText() && isGetPage()){
		$isExistPage = (int)((int)($image_jsonObj->totalEstimatedMatches) / 150);
		if((int)($image_jsonObj->totalEstimatedMatches) % 150 > 0){
			$isExistPage++;
		}
		$page = rawurlencode($_GET['page']);
		$page = (int)$page;
		//$num_total = count($image_jsonObj->value);
//以下、全部表示用コード
//		echo json_encode($image_jsonObj);
//以上全部表示用コード

		echo '<h2>'.htmlspecialchars($_GET['text']).'</h2>'."\n";
		if($page > $isExistPage || $page < 1){
			echo '<p>画像は見つかりませんでした。</p>';
		} else {
			echo '<ul id="gallery">'."\n";
			foreach($image_jsonObj->value as $value)
			{
				$l_width = 500;
				$l_height = (int)($value->height * (500 / (int)($value->width)));
				echo "<li><a href=\"{$value->hostPageUrl}\"><img src=\"{$value->contentUrl}\" width=\"{$l_width}\" height=\"{$l_height}\"></a></li>\n";
			}
			echo '</ul>'."\n";
			echo '<ul id="page">';
			if(isGetText() && isGetPage()){
				$text = rawurlencode($_GET['text']);
				$page = rawurlencode($_GET['page']);
				$max_page = (int)((int)($image_jsonObj->totalEstimatedMatches) / 150);
				if((int)($image_jsonObj->totalEstimatedMatches) % 150 > 0){
					$max_page++;
				}
				for($i = 1; $i <= $max_page; $i++){
					echo '<li><a href="http://www.heso.blue/?text='.$_GET["text"].'&page='.$i.'">'.$i.'</a></li>';
				}

			}
			echo '</ul>';
		}
	}
?>
		</section>
		<footer>
			<dl>
				<dt>このサイトを作った人</dt>
				<dd>ガルニモの人</dd>
				<dt>このサイトを作った人のサイト</dt>
				<dd><a href="http://www.garunimo.com/">ガルニモ</a></dd>
			</dl>
		</footer>
	</body>
</html>