Zend - The PHP Company




Miscellaneous

Add Code


Phoogle  

Type: application
Added by: Codewalkers
Entered: 15/04/2002
Last modified: 04/12/2001
Rating: - (fewer than 3 votes)
Views: 6897
Phoogle is the winner of the first ever PHP Coding Contest at http://codewalkers.com - it was coded by Jon Bardin. Phoogle does some manipulation of google and google groups search results. It is a wonderful example of using sockets.


<?
// this file should be named libGoogle.php


// Jon Bardin jon_bardin@softhome.net

//define ('LYNX', 'which lynx'); || define ('LYNX', '/usr/bin/lynx'); || leave as NULL to use sockets - recomended
define('LYNX'NULL);

function 
parse_google ($query NULL$numrows NULL$start NULL)
{
   if (!
strlen($query) || !$numrows) return;

   
$search "/search?hl=en&q=".urlencode($query)."&num=".$numrows."&start=".$start;

   
$data get_uri ('www.google.com'$search);

   
$data str_replace ('<blockquote>'''$data);
   
$data str_replace ('</blockquote>'''$data);

   
$data_array explode ("<p>"$data);

   
ereg ("<font [^>]*>Results (.*) seconds."$data_array[0], $tmp);
   
$return_data['num_of_results'] = 'Results '.$tmp[1].' seconds';

   for (
$i=1$i<=$numrows$i++) {
      
$stage explode ("</div>"$data_array[$i]);
      
$result_data explode ("<br>"$stage[0]);
      foreach (
$result_data as $row) {
         
$row trim($row);
         if (
ereg("^<a href="$row) || ereg("^<span class=w><font size=-2>"$row)) {
            
$return_data['url'][$i] = $row;
         } elseif (
ereg("^<font size=-1>"$row)) {
            
$return_data['blurb'][$i] = $row.'<br/>';
         } elseif (
ereg("^<span class=f><font size=-1>Description:</font></span>"$row)) {
            
$return_data['desc'][$i] = $row;
         } elseif (
ereg("^<span class=f>Category: </span>"$row)) {
            
$return_data['category'][$i] = $row;
         } elseif (
ereg("^<font color="#008000">", $row)) {
            
$row str_replace ("/search?hl=en&num=10"LOCAL_PHOOGLE.$numrows$row);
            
$return_data['detail'][$i] = $row;
         } else {
            
$row str_replace ("/search?hl=en"LOCAL_PHOOGLE.$numrows$row);
            
$row str_replace ("/search?num=".$numrowsLOCAL_PHOOGLE.$numrows$row);
            
$return_data['blurb'][$i] .= $row.'<br/>';
         }
      }
   }


   
$return_data['num_of_pages'] = substr_count ($data_array[$numrows], '/nav_page.gif');

   
$return_data['categories'] = @array_unique($return_data['category']);
   return 
$return_data;

}

function 
get_category_sites ($path$limit 10)
{
   if (!
strlen($path) || !$limit) return NULL;
   
   
$data get_uri ('directory.google.com'$path);
   
   
$array explode ('<td>'$data);
   
   for (
$i 1$i <= $limit$i++) {
      
$tmp str_replace ("/img/""http://directory.google.com/img/"$array[$i]);
      
$return[] = $tmp;
   }
   
   return 
$return;
}

function 
parse_groups ($query NULL$numrows NULL$start NULL)
{
   if (!
strlen($query) || !$numrows) return NULL;

   
$search '/groups?q='.urlencode($query).'&num='.$numrows.'&start='.$start;
   
   
$data get_uri ('groups.google.com'$search);
   
   
$data str_replace ('<blockquote>'''$data);
   
$data str_replace ('</blockquote>'''$data);

   
$data_array explode ("<p>"$data);

   
ereg ("<font size=-1 color=#000000>Results (.*) seconds.</font>"$data_array[0], $tmp);
   
$return_data['num_of_results'] = 'Results '.$tmp[1].' seconds';

   for (
$i=1$i<=$numrows$i++) {
      
$stage explode ("</div>"$data_array[$i]);
      
$result_data explode ("<br>"$stage[0]);
      foreach (
$result_data as $row) {
         
$row trim($row);
         if (
ereg("^<a href="$row) || ereg("^<span class=w><font size=-2>"$row)) {
            
$return_data['url'][$i] = $row;
         } elseif (
ereg("^<font color=green>"$row)) {
            
$row str_replace ("/groups?""http://groups.google.com/groups?"$row);
            
$return_data['detail'][$i] = $row;
         } else {
            
$row str_replace ("/search?num=".$numrowsLOCAL_PHOOGLE.$numrows$row);
            
$return_data['blurb'][$i] .= $row.'<br/>';
         }
      }
   }
   
   
$return_data['num_of_pages'] = substr_count ($data_array[$numrows], '/nav_page.gif');
   
   return 
$return_data;
}
   
function 
get_uri ($host NULL$uri NULL)
{
   if (!
strlen($uri) || !strlen($host)) return NULL;

   if (
LYNX) {
      (string) 
$cmd trim(LYNX).' -useragent="Mozilla/5.0/Lynx (X11; U; Linux i686; en-US; rv)" -source "http://'.$host.$uri.'"';
      (string) 
$data shell_exec ($cmd);
   } else {
      (int) 
$service_port getservbyname ('www''tcp');

      
/* Get the IP address for the target host. */
      
(string) $address gethostbyname ($host);

      
/* Create a TCP/IP socket. */
      
$socket socket_create (AF_INETSOCK_STREAM0);
      if (
$socket 0) {
         echo 
"socket_create() failed: reason: " socket_strerror ($socket) . "n";
      }

      
$result socket_connect ($socket$address$service_port);
      if (
$result 0) {
         echo 
"socket_connect() failed.nReason: ($result) " socket_strerror($result) . "n";
      }

      
$in "GET $uri HTTP/1.1rn"
          
"Connection: Closern"
          
"Host: $hostrn"
         
//. "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv)rn"
         //. "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1rn"
         //. "Accept-Lanquage: en-us, en;q=0.50rn"
         //. "Accept-encoding: gzip, deflate, compress;q=0.9rn"
         //. "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66rn"
         //. "Cookie: REF=ID=37b9dad9235ea29b:TM=1017817750:LM=1017817750:S=tFoVzZx1DEw; domain=.google.com; path=/;rn"
         
"rn";

      (string) 
$out NULL;
      (string) 
$data NULL;
      
socket_write ($socket$instrlen($in));
      while (
$out socket_read ($socket2048)) {
         
$data .= $out;
      }

      
socket_close ($socket);
   }
   
   return 
$data;
}

function 
display_results ($q$n$s)
{
   (string) 
$url_template '<a href="/phoogle/?=&q=%s&n=%d&s=%d">%s</a>';
   (array) 
$g_data = array();

   
$g_data parse_google ($qintval($n), intval($s));
   
$group_data parse_groups ($qintval($n), intval($s));
            
   (string) 
$page_nav NULL;
   (string) 
$r_data NULL;
   if (!
$n) {
      
$n 15;
   }
   
   
$q_form .= '<tr><td colspan=2><form action="/phoogle/" method=get name=f>'
            
'<input type=hidden name=phoogle>'
            
'<input type=text name=q size=40 value="'.stripslashes(htmlspecialchars($q)).'">&nbsp;'
            
'<input type=text name=n size=3 value="'.intval($n).'">&nbsp;'
            
'<input type=submit name=a value=Go>'
            
'</form></td></tr>';

   if (
count($g_data)) {
      for (
$i=1$i<=count($g_data['url']); $i++) {
         
$s_data .= '<p>'.$g_data['url'][$i].'<br />';
         if (
strlen($g_data['blurb'][$i]))
            
$s_data .= $g_data['blurb'][$i];

         if (
strlen($g_data['desc'][$i]))
            
$s_data .= $g_data['desc'][$i].'<br />';
    
         if (
strlen($g_data['category'][$i]))
            
$s_data .= $g_data['category'][$i].'<br />';

         if (
strlen($g_data['detail'][$i]))
            
$s_data .= $g_data['detail'][$i];
                     
         
$s_data .= '</font></span></p>';
      }
               
      for (
$i=1$i<count($group_data['url']); $i++) {
         
$group_data_html .= '<p>'.$group_data['url'][$i].'<br />';
                  
         if (
strlen($group_data['blurb'][$i]))
            
$group_data_html .= $group_data['blurb'][$i];
                     
         if (
strlen($group_data['detail'][$i]))
            
$group_data_html .= $group_data['detail'][$i];
                     
         
$group_data_html .= '</font></span></p>';
      }
               
      
$r_data .= '<tr><td>Web '.$g_data['num_of_results'].'</td><td>Groups '.$group_data['num_of_results'].'</td></tr>';
      
$r_data .= '<tr><td valign=top align=left nowrap=true>'.$s_data.'</td><td valign=top align=left nowrap=true>'.$group_data_html.'</td></tr>';
                  
               
      if (
intval($s $n) < 0)
         
$prev 0;
               
      
$page_nav sprintf ($url_template,
                           
urlencode($q),
                           
$n,
                           
$prev,
                           
'<').'&nbsp;';
                                   
      for (
$i=0$i<$g_data['num_of_pages']; $i++) {
         
$cur $i $n;
         if (
$cur == intval($s)) {
            
$page_nav .= ($i 1).'&nbsp;';
         } else {
            
$page_nav .= sprintf ($url_template
                                  
urlencode($q),
                                  
$n,
                                  
$cur,
                                  (
$i+1)).'&nbsp;';
         }
      }
               
      
$page_nav .= sprintf ($url_template,
                            
urlencode($q),
                            
$n,
                            
$s $n,
                           
'>').'&nbsp;';
                                     
      
$page_nav '<tr><td colspan=2 align=center>'.$page_nav.'</td></tr>';
      if (
count($g_data['category'])) {
         @
sort ($g_data['category']);
         
ereg ("href=http://directory.google.com([^>]*)([^<]*)"$g_data['category'][0], $temp);
         
$path $temp[1];
         
$cat_array get_category_sites ($path);
         
$cat_html '<tr><td colspan=2><b>'.$path.'</b></td></tr>';
      
         foreach (
$cat_array as $entry) {
            
$cat_html .= "n".'<tr><td colspan=2>'.$entry.'</td></tr>';
         }
      }
      
$r_data $q_form.$page_nav.$r_data.$page_nav.$cat_html.$q_form;
   } else {
      
$r_data $q_form;
   }
            
   return 
$r_data.'</table>';
}

?>






// The following should be placed in index.php

<?

require_once ("libGoogle.php");

define ('LOCAL_PHOOGLE'"/phoogle/?&n=");

?>
<html>
   <head>
      <title>Phoogle</title>
      <style><!--
      body,td,div, .p, a, font {
         font-size: x-small;
         font-family: arial, helvetica;
      }

      div, td {
         color:#000000;
      }
   
      .f, .fl:link {
         color:#6f6f6f
      }

      a:link, .w, a.w:link, .w a:link {
         color:#00c
      }
   
      a:visited, .fl:visited {
         color:#551a8b
      }
   
      a:active, .fl:active {
         color:#f00
      }
   
      .t a:link, .t a:active, .t a:visited, .t {
         color:#000000;
      }
   
      .t {
         background-color:#ffcc33
      }
   
      .h {
         color:#ddaa11
      }  
   
      .i, .i:link {
         color:#a90a08
      }  
   
      .a, .a:link {
         color:#008000
      }
   
      .z {
         display:none;
      }
   
      div.n {
         margin-top: 1ex
      }
   
      .n a {
         font-size: x-small;
         color:#000;
      }
   
      .n .i {
         font-size: x-small;
         font-weight:bold
      }
   
      .q a:visited,.q a:link,.q a:active,.q {
         text-decoration: none;
         color: #00c;
      }
   
      .b {
         font-size: x-small;
         color:#00c;
         font-weight:bold
      }
   //-->
   </style>
   </head>
   
   <body onLoad="document.forms[0].q.focus()"><table>
      <?=display_results ($q$n$s);?>
      <p>
         <a href=index.phps>Show index.php source</a> || <a href=libGoogle.phps>Show libGoogle.php source</a>
   </body>
</html>


Usage Example




Rate This Script





Search



This Category All Categories