How to built Open Graph & Twitter Card Checker Tool

Open graph checker is a tool to validate the website page contains sufficient informations and it can be easily access by social media and it display as facebook post or twitter tweet in proper structure format.
open-graph-checker.php
1 <?php
2 //--
3 $outerHead = "<head>";
4 $outerHeadLength = strlen($outerHead);
5 $outerHeadStart = 0;
6 
7 $innerHead = "</head>";
8 $innerHeadLength = strlen($innerHead);
9 $innerHeadStart = 0;
10 //--
11 
12 //--
13 $outerMeta = "<meta";
14 $innerMeta = ">";
15 $metaPointer = 0;
16 //--
17 
18 //--
19 $metaPropertyBase = "property=''";
20 $metaPropertyPointer = 0;
21 //--
22 
23 //--
24 $metaContentBase = "content=''";
25 $metaContentPointer = 0;
26 //--
27 
28 $crawlOptions = array(
29 CURLOPT_RETURNTRANSFER => true,     		// return web page
30 CURLOPT_HEADER         => false,    		// don't return headers
31 CURLOPT_FOLLOWLOCATION => true,     		// follow redirects
32 CURLOPT_ENCODING       => "",       		// handle all encodings
33 CURLOPT_USERAGENT      => "algoberrybot", 	// who am i
34 CURLOPT_AUTOREFERER    => true,     		// set referer on redirect
35 CURLOPT_CONNECTTIMEOUT => 10,      			// timeout on connect
36 CURLOPT_TIMEOUT        => 10,      			// timeout on response
37 CURLOPT_MAXREDIRS      => 0       			// stop after 10 redirects
38 );
39 
40 $metaName = "";
41 $metaContent = "";
42 $openGraphList = array();
43 $twitterCardList = array();
44 $noMatchList = array();
45 
46 
47 $openGraphMetadata = array("og:title","og:type","og:image","og:url","og:audio","og:description","og:determiner","og:locale","og:locale:alternate","og:site_name","og:video","og:image","og:image:secure_url","og:image:type","og:image:width","og:image:height","og:image:alt","og:video","og:video:secure_url","og:video:type","og:video:width","og:video:height","og:audio","og:audio:secure_url","og:audio:type","music.song","music:duration","music:album","music:album:disc","music:album:track","music:musician","music:song:disc","music:song:track","music:musician","music:release_date","music.playlist","music.radio_station","music:creator","video.movie","video:actor","video:actor:role","video:director","video:writer","video:duration","video:release_date","video:tag","video.episode","video:series","video.tv_show","video.other","article:published_time","article:modified_time","article:expiration_time","article:author","article:section","article:tag","book:author","book:isbn","book:release_date","book:tag","profile:first_name","profile:last_name","profile:username","profile:gender");
48 $twitterCardMetadata = array("twitter:card","twitter:site","twitter:creator","twitter:url","twitter:title");
49 
50 
51 function checkCategory($type) {
52 	global $openGraphMetadata,$twitterCardMetadata;
53 	$category = "opengraph";
54 	foreach($openGraphMetadata as $key => $value) {
55 		if($type == $value) {
56 			return $category;
57 		}
58 	}
59 	$category = "twittercard";
60 	foreach($twitterCardMetadata as $key => $value) {
61 		if($type == $value) {
62 			return $category;
63 		}
64 	}
65 	$category = "nomatch";
66 	return $category;
67 }
68 
69 function showList($base,$category) {
70 	?>
71 	<div style="margin-bottom:40px;">
72 	<h3><?php echo $category; ?></h3>
73 	<table width="100%">
74 	<tr>
75 		<th valign='top'>SR.No</th>
76 		<th valign='top'>Tag Name</th>
77 		<th valign='top'>Value</th>
78 	</tr>
79 	<?php
80 	$count = 1;
81 	foreach($base as $key => $value) {
82 		if(count$value>=2) {
83 			foreach($value as $innerKey => $innerValue) {
84 				echo "<tr><td>".$count."</td><td>".$key."</td><td>".$innerValue."</td></tr>";
85 				$count++;
86 			}
87 		}
88 		else
89 		{
90 			echo "<tr><td>".$count."</td><td>".$key."</td><td>".$value[0]."</td></tr>";
91 			$count++;
92 		}
93 	}
94 	?>
95 	</table>
96 	</div>
97 	<?php
98 }
99 
100 $url = "";
101 $validURL = "";
102 if(isset$_POST["auditbutton"] && isset$_POST["url"]) {
103 	$url = trim($_POST["url"]);
104 	if($url != "") {
105 		if(filter_var$url,FILTER_VALIDATE_URL == true) {
106 			$validURL = $url; 
107 		}
108 	}
109 	else
110 	{
111 		$url = " ";
112 	}
113 }
114 ?>
115 <html>
116 	<head>
117 		<title>Open Graph & Twitter Card Checker Tool</title>
118 		<style>
119 		body {
120 		font-family: 'Merriweather', serif;
121 		font-size:14px;
122 		}
123 
124 		h1 {
125 		font-size:16px;
126 		}
127 
128 		table {
129 		border-collapse: collapse;
130 		width: 100%;
131 		}
132 
133 		th {
134 		font-size:15px;
135 		}
136 		
137 		td, th {  
138 		border: 1px solid #ddd;
139 		text-align: left;
140 		padding: 15px;
141 		}
142 		
143 		.error {
144 		color:red;
145 		}	
146 		</style>
147 	</head>
148 	<body>
149 		<h2>Open Graph & Twitter Card Checker Tool</h2>
150 		<div>
151 			<form action="open-graph-checker.php" method="post">
152 			<input type="input" name="url" value="<?php echo $url; ?>" placeholder="https://www.algoberry.com"/>
153 			<input type="submit" name="auditbutton" value="Audit"/>
154 			</form>
155 		</div>
156 		<div style="margin-top:10px;margin-bottom:15px;">
157 		<?php
158 		if($validURL != "") {
159 			$curlObject = curl_init($validURL);
160 			curl_setopt_array($curlObject,$crawlOptions);
161 			$webPageContent = curl_exec($curlObject);
162 			$errorNumber = curl_errno($curlObject);
163 			curl_close($curlObject);
164 			if($errorNumber == 0) {
165 				$webPageCounter = 0;
166 				$webPageLength = strlen($webPageContent);
167 				//-------- Head Session Start  --------
168 				while($webPageCounter < $webPageLength) {
169 					$character = $webPageContent[$webPageCounter];
170 					//-------- Escape Character Start  --------
171 					if($character == "") {	
172 						$webPageCounter++;	
173 						continue;
174 					}
175 					//-------- Escape Character End  --------
176 					//-------- Outer Head Start  --------
177 					if($outerHead[$outerHeadStart] == $character) {
178 						$outerHeadStart++;
179 						if($outerHeadStart == $outerHeadLength) {
180 							$outerHeadStart = 0;
181 							$webPageCounter++;
182 							while($webPageCounter < $webPageLength) {
183 								$character = $webPageContent[$webPageCounter];
184 								//-------- Escape Character Start  --------
185 								if($character == "") {	
186 									$webPageCounter++;	
187 									continue;
188 								}
189 								//-------- Escape Character End  --------
190 								//-------- Outer Meta Start  --------
191 								if($outerMeta[$metaPointer] == $character) {
192 									$metaPointer++;
193 									if($metaPointer == 5) {
194 										$metaPointer = 0;
195 										$webPageCounter++;
196 										while($webPageCounter < $webPageLength) {
197 											$character = $webPageContent[$webPageCounter];
198 											//-------- Escape Character Start  --------
199 											if($character == "") {	
200 												$webPageCounter++;	
201 												continue;
202 											}
203 											//-------- Escape Character End  --------
204 											//-------- Meta Property Start  --------
205 											if($metaPropertyBase[$metaPropertyPointer] == $character || $metaPropertyPointer == 9 && $character == "\"") {
206 												if($metaPropertyPointer == 9) {
207 													$metaPropertyPointer = 0;
208 													$webPageCounter++;
209 													while($webPageCounter < $webPageLength) {
210 														if($webPageContent[$webPageCounter] != "'" && $webPageContent[$webPageCounter] != "\"")
211 														{	$metaName .= $webPageContent[$webPageCounter]; }
212 														else
213 														{	break;	}
214 														$webPageCounter++;
215 													}
216 													$metaName = trim($metaName);
217 												}
218 												else
219 												{	$metaPropertyPointer++;	}
220 											}
221 											else
222 											{	$metaPropertyPointer = 0;	}
223 											//-------- Meta Property End  --------
224 											//-------- Meta Content Start  --------
225 											if($metaContentBase[$metaContentPointer] == $character || $metaContentPointer == 8 && $character == "\"") {
226 												if($metaContentPointer == 8) {
227 													$metaContentPointer = 0;
228 													$webPageCounter++;
229 													$titleStart = $webPageCounter;
230 													$titleEnd = $webPageCounter;
231 													while($webPageCounter < $webPageLength) {
232 														if($webPageContent[$webPageCounter] != "'" && $webPageContent[$webPageCounter] != "\"")
233 														{	$metaContent .= $webPageContent[$webPageCounter]; }
234 														else
235 														{	
236 															$titleEnd = $webPageCounter - 1;
237 															break;	
238 														}
239 														$webPageCounter++;
240 													}
241 													$metaContent = trim($metaContent);
242 												}
243 												else
244 												{	$metaContentPointer++;	}
245 											}
246 											else
247 											{	$metaContentPointer = 0;	}
248 											//-------- Meta Content End  --------
249 											//-------- Inner Meta Start  --------
250 											if($character == $innerMeta) {
251 												if($metaName != "") {
252 													$metaName = strtolower($metaName);
253 													$type = checkCategory($metaName);
254 													if($type == "opengraph") {
255 														$openGraphList[$metaName][] = $metaContent;
256 													}
257 													else if($type == "twittercard") {
258 														$twitterCardList[$metaName][] = $metaContent;
259 													} 
260 													else
261 													{
262 														$noMatchList[$metaName][] = $metaContent;
263 													}
264 												}
265 												$metaName = "";
266 												$metaContent = "";
267 												break;
268 											}
269 											//-------- Inner Meta End  --------
270 											$webPageCounter++;
271 										}
272 									}
273 								}
274 								else
275 								{	$metaPointer = 0;	}
276 								//-------- Outer Meta End  --------
277 								//-------- Inner Head Start  --------
278 								if($innerHead[$innerHeadStart] == $character) {
279 									$innerHeadStart++;
280 									if($innerHeadStart == $innerHeadLength) {
281 										$innerHeadStart = 0;
282 										$headFound = 1;
283 										break;
284 									}
285 								}
286 								else if($innerHeadStart != 6)
287 								{	$innerHeadStart = 0;	}
288 								//-------- Inner Head End  --------
289 								$webPageCounter++;
290 							}
291 							if($headFound == 1) {	
292 								$webPageCounter++;
293 								break;	
294 							}
295 						}
296 					}
297 					else if($outerHeadStart != 5)
298 					{	$outerHeadStart = 0;	}
299 					//-------- Outer Head End  --------
300 					$webPageCounter++;
301 				}
302 				//-------- Head Session End  --------
303 				
304 				if(count$openGraphList>=1) {
305 					showList($openGraphList,"Open Graph Tags");
306 				}
307 				if(count$twitterCardList>=1) {
308 					showList($twitterCardList,"Twitter Card Tags");
309 				}
310 				if(count$noMatchList>=1) {
311 					showList($noMatchList,"Miscellaneous Tags");
312 				}
313 			}
314 			else
315 			{
316 			?>
317 			<div class="error">Unable to access now</div>
318 			<?php
319 			}
320 		}
321 		else
322 		{
323 			if($url != "") {
324 			?>
325 			<div class="error">Please enter valid URL</div>
326 			<?php
327 			}	
328 		}
329 		?>
330 		</div>
331 		<div>
332 		Created by <a href = "https://www.algoberry.com" target="_blank">https://www.algoberry.com</a>
333 		</div>
334 	</body>
335 </html>