Добрый вечер!
Часто что-то подсказываю пользователю igrovik что-то по PHP. Сам-то я самоучка от и до, ни одной книжки по веб-разработке не читал, курсов не проходил и тем более меня никто не учил. Получился я, пока еще, не слишком опытный кодер, но все-таки за эти полгода-год я продвинулся вперед. Так вот — на днях написал он мне с вопросом о том, как сделать поисковой запрос к api google(он просто дал ссылку, и насколько я понимаю это поиск в google через их api).
Потратил 15-20 минут и написал вот такой кусок кода, ну и прокомментировал каждое действие. Возможно кому-то будет это интересно(тем кто пытается что-то в этом понять), а у кого-то будет рвать п*кан из-за моей не грамотности в php разработке, за мои ошибки или неверное понимание каких-то функций.
Вот сам код
Часто что-то подсказываю пользователю igrovik что-то по PHP. Сам-то я самоучка от и до, ни одной книжки по веб-разработке не читал, курсов не проходил и тем более меня никто не учил. Получился я, пока еще, не слишком опытный кодер, но все-таки за эти полгода-год я продвинулся вперед. Так вот — на днях написал он мне с вопросом о том, как сделать поисковой запрос к api google(он просто дал ссылку, и насколько я понимаю это поиск в google через их api).
Потратил 15-20 минут и написал вот такой кусок кода, ну и прокомментировал каждое действие. Возможно кому-то будет это интересно(тем кто пытается что-то в этом понять), а у кого-то будет рвать п*кан из-за моей не грамотности в php разработке, за мои ошибки или неверное понимание каких-то функций.
Вот сам код
PHP:
<?php
# заголовок ответа сервера, который говорит что страница в кодировке utf-8
header ("Content-Type: text/html; charset=utf-8");
# функция которая делает запрос по переданному url и возвращает результат
function googleSearch( $q ) {
# создаем объект запроса
$page = curl_init();
# результат нужно вернуть в переменную(1), а НЕ вывести на страницу(0)
curl_setopt($page, CURLOPT_RETURNTRANSFER, 1);
# задаем url запроса, в который сразу подставляем фразу поиска
# urlencode() делаем, чтобы русские буквы, пробелы и спец-символы в url не создали проблем
curl_setopt($page, CURLOPT_URL, 'https://www.googleapis.com/customsearch/v1element?key=AIzaSyCVAXiUzRYsML1Pv6RwSG1gunmMikTzQqY&rsz=filtered_cse&num=20&hl=ru&prettyPrint=false&source=gcsc&gss=.ua&sig=4368fa9a9824ad4f837cbd399d21811d&cx=partner-pub-2114605467104271:6649524146&q=' . urlencode( $q ) . '&cse_tok=AOdTmaBXji3_n8zH89iy-VgmLBGPcLqfiA:1514486096740&gl=ua&googlehost=www.google.com&callback=google.search.Search.apiary9495&nocache=1514486102371');
# запрос идет на https:// поэтому отключаем проверку SSL сертификата
curl_setopt($page, CURLOPT_SSL_VERIFYPEER, FALSE);
# влючаем авторедирект, если сервер отдаст заголовок Location: [тут_ссылка]
curl_setopt($page, CURLOPT_FOLLOWLOCATION, 1);
# отключаем возврат заголовков ответа
# в большинстве случаев нам не нужна никакая информация из этих заголовков
curl_setopt($page, CURLOPT_HEADER, 0);
# устанавливаем заголовки запроса, чтобы хоть как-то имитировать типа это браузер
curl_setopt($page, CURLOPT_HTTPHEADER, array(
'accept:*/*',
'accept-language:ru,en;q=0.8',
# страница, с которой якобы идет запрос
'referer:http://search.meta.ua/search.asp?q=' . urlencode( $q ) . '&m=',
# версия нашего воображаемого браузера
'user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
));
# делаем запрос (ответ сервера будет в переменной $data);
$data = curl_exec($page);
# закрываем соединение (удаляем объект запроса, ведь мы уже получили что нужно)
curl_close($page);
# проверяем, вдруг ответ ложь(false) или просто пустой
if ( $data === false || $data == "" ) return false;
# результат обернут в google.search.Search.apiary9495([тут_результат]);
# эту обертку надо убрать вот такой регуляркой
$data = preg_replace( '#^.*google.search.Search.apiary9495\((.*)\);$#is', '\\1', $data );
# декодируем результат (результат возвращается в формате json)
$json = json_decode( $data, true ); // true нужно чтобы на выходе был массив, а НЕ json Object
# проверяем, вдруг что-то пошло не так
if ( $json === false ) return false;
# если все гуд, то возвращаем результат
return $json;
}
# делаем запрос и получаем результа в перменную $data
# такая конструкция экономит лишнюю строку
# результат работы функции googleSearch() возвращается в переменную $search
# но если результат будет ложь (false) то условие не сработает(вернее сработает else)
# batjax avengers — это фраза для по которой будет идти поиск
if( $search = googleSearch( 'batjax avengers' ) ) {
# вывод на экран
echo "<pre>";
print_r( $search );
} else {
echo 'Результат ответа пустой';
}

