Парсинг Google Image Search API

Для начала давайте найдем хотя бы одну причину, почему парсинг Google Image Search API нужен в 1С. Например, для того, чтобы устанавливать картинки номенклатуры, находя их в Google Images, не выходя из 1С.
Суть процесса такова, что мы отправляем http-запрос с определенными параметрами, разделяемыми символом «&» и получаем ответ, который нужно обработать.

Наш запрос: http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=2&imgsz=large&q=water&start=0

Я не буду подробно описывать все параметры, их вы можете изучить самостоятельно.

Опишу только те параметры, которые используются в запросе:

v — версия протокола, сейчас доступна только «1.0»;
rsz — количество возвращаемых изображений;
imgsz — размер изображений;
q — это слово, которое мы ищем;
start — начальное значение результата запроса (например, если мы хотим пропустить первые 2 изображения, то значение должно быть равно «3» — то есть, начинать с третьего изображения).

В результате нашего запроса мы получаем вот такой ответ:

{"responseData": {
"results":[
{
"GsearchResultClass":"GimageSearch",
"width":"825",
"height":"529",
"imageId":"ANd9GcRm5Y-v8pql1b14azVHUPbYDvz5Rf2d0gxT00C-LyC6hXI72Oldvz7bYeY",
"tbWidth":"144",
"tbHeight":"92",
"unescapedUrl":"http://www.cleanwateraction.org/files/images/ca/Front%20image_drinking-water.jpg",
"url":"http://www.cleanwateraction.org/files/images/ca/Front%2520image_drinking-water.jpg",
"visibleUrl":"www.cleanwateraction.org",
"title":"Protecting Drinking u003cbu003eWateru003c/bu003e | Clean u003cbu003eWateru003c/bu003e Action",
"titleNoFormatting":"Protecting Drinking Water | Clean Water Action",
"originalContextUrl":"http://www.cleanwateraction.org/programinitiative/protecting-drinking-water-0",
"content":"cup of u003cbu003ewateru003c/bu003e",
"contentNoFormatting":"cup of water",
"tbUrl":"http://t1.gstatic.com/images?qu003dtbn:ANd9GcRm5Y-v8pql1b14azVHUPbYDvz5Rf2d0gxT00C-LyC6hXI72Oldvz7bYeY"
},
{
"GsearchResultClass":"GimageSearch",
"width":"550",
"height":"339",
"imageId":"ANd9GcTrB2HrLPag0WEBqAbho5jLbAPtgTBK7AzYDpqf4gOysga_34oFpTY1Gz2_",
"tbWidth":"133",
"tbHeight":"82",
"unescapedUrl":"http://www.fengshuiweb.co.uk/wp-content/uploads/2013/03/Water-Rat-Feng-Shui.jpg",
"url":"http://www.fengshuiweb.co.uk/wp-content/uploads/2013/03/Water-Rat-Feng-Shui.jpg",
"visibleUrl":"www.fengshuiweb.co.uk",
"title":"Characteristics of the u003cbu003eWateru003c/bu003e Rooster",
"titleNoFormatting":"Characteristics of the Water Rooster",
"originalContextUrl":"http://www.fengshuiweb.co.uk/animals/waterrooster.htm",
"content":"Characteristics of the u003cbu003eWateru003c/bu003e",
"contentNoFormatting":"Characteristics of the Water",
"tbUrl":"http://t2.gstatic.com/images?qu003dtbn:ANd9GcTrB2HrLPag0WEBqAbho5jLbAPtgTBK7AzYDpqf4gOysga_34oFpTY1Gz2_"
}
],
"cursor":{
"resultCount":"235,000,000",
"pages":[
{
"start":"0",
"label":1
},
{
"start":"2",
"label":2
},
{
"start":"4",
"label":3
},
{
"start":"6",
"label":4
},
{
"start":"8",
"label":5
},
{
"start":"10",
"label":6
},
{
"start":"12",
"label":7
},
{
"start":"14",
"label":8
}
],
"estimatedResultCount":"235000000",
"currentPageIndex":0, "moreResultsUrl":"http://www.google.com/images?oeu003dutf8u0026ieu003dutf8u0026sourceu003dudsu0026startu003d0u0026imgszu003dlargeu0026hlu003denu0026qu003dwater",
"searchResultTime":"0.07"
}
},
"responseDetails": null,
"responseStatus": 200}

С этим ответом и предстоит работать. Не буду подробно описывать, что происходит в коде 1С, там есть комментарии. Вот код обработки:

Процедура КнопкаВыполнитьНажатие(Кнопка)

// С параметрами запроса можно ознакомиться тут: https://developers.google.com/image-search/v1/jsondevguide?hl=ru

РезультатЗапроса = ПолучитьИмяВременногоФайла("txt");
КоличествоИзображений = 2; // Запрашиваем два изображения

// Получаем страницу http://ajax.googleapis.com/ajax/services/search/images?v=1.0&rsz=2&imgsz=large&q=water&start=0
Хост = "ajax.googleapis.com";
Запрос = "/ajax/services/search/images?v=1.0&rsz=" + КоличествоИзображений + "&imgsz=large&q=water&start=0";

Попытка
Соединение = Новый HTTPСоединение(Хост);
Соединение.Получить(Запрос, РезультатЗапроса);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

// Получаем текст результата запроса
Файл = Новый ТекстовыйДокумент;
Попытка
Файл.Прочитать(РезультатЗапроса, КодировкаТекста.Системная);
Текст = Файл.ПолучитьТекст();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;

// Обрабатываем результат запроса
НачалоМассиваДанныхИзображений = Найти(Текст, "[") + 1;
КонецМассиваДанныхИзображений = Найти(Сред(Текст, НачалоМассиваДанныхИзображений, СтрДлина(Текст)), "]") - 1;
МассивДанныхИзображений = Сред(Текст, НачалоМассиваДанныхИзображений, КонецМассиваДанныхИзображений);
// В переменной МассивДанныхИзображений хранится массив изображений с их параметрами: {"p1":"value","pn":"value"},{"p1":"value","pn":"value"}

// Обрабатываем массив
Для Н = 1 По КоличествоИзображений Цикл

Сообщить("Изображение " + Строка(Н));
НаборПараметровМассива = Сред(МассивДанныхИзображений, 2, Найти(МассивДанныхИзображений, "}") - 2); // Без {}

МассивДанныхИзображений = Сред(МассивДанныхИзображений, Найти(МассивДанныхИзображений, "}") + 2, СтрДлина(МассивДанныхИзображений)); // Исключаем текущий элемент массива

Если Н = 1 Тогда // Подразумеваем, что количество параметров будет одинаковым, поэтому один раз узнать их количество будет достаточно
НаборПараметровДляВычисленияКоличества = НаборПараметровМассива;
КоличествоПараметров = ПолучитьКоличествоПараметров(НаборПараметровДляВычисленияКоличества, СтрДлина(НаборПараметровМассива), ",");
КонецЕсли;

НаборПараметровДляВычисленияЗначений = НаборПараметровМассива;
Для НН = 1 По КоличествоПараметров Цикл
ПозицияРазделителя = Найти(НаборПараметровДляВычисленияЗначений, ",");

ПараметрЗначение = Сред(НаборПараметровДляВычисленияЗначений, 1, ПозицияРазделителя - 1);
Параметр = СтрЗаменить(Сред(ПараметрЗначение, 1, Найти(ПараметрЗначение, ":") - 1), """", "");
Значение = СтрЗаменить(Сред(ПараметрЗначение, Найти(ПараметрЗначение, ":") + 1, СтрДлина(ПараметрЗначение)), """", "");
Сообщить(Параметр + " / " + Значение);

НаборПараметровДляВычисленияЗначений = Сред(НаборПараметровДляВычисленияЗначений, ПозицияРазделителя + 1, СтрДлина(НаборПараметровДляВычисленияЗначений)); // Исключаем текущую пару параметр/значение
КонецЦикла;

КонецЦикла;

КонецПроцедуры

Функция ПолучитьКоличествоПараметров(Стр, КонецСтроки, Разделитель)

КоличествоПараметров = 0;

Для Н = 1 По КонецСтроки Цикл

ПозицияРазделителя = Найти(Стр, Разделитель);

Если ПозицияРазделителя <> 0 Тогда
КоличествоПараметров = КоличествоПараметров + 1;
КонецЕсли;

Стр = Сред(Стр, ПозицияРазделителя + 1, КонецСтроки);

КонецЦикла;

Возврат КоличествоПараметров + 1;

КонецФункции

Обработка разберет параметры изображений и их значения. Параметры самого запроса здесь не обрабатываются.

В результате можно получить, например, вот что: http://youtu.be/BwvNrmm-q7c

3 Comments

  1. sergei2k

    Можно использовать что-нибудь вот такое для обработки результата: http://infostart.ru/public/119601/

    Reply
  2. rougudz

    {«responseData»: null, «responseDetails»: «This API is no longer available.», «responseStatus»: 403}

    Этот API не больше не доступен.

    печаль

    Reply
  3. echo77

    (0) А что сейчас вместо этого API?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *