IE2017

Парсинг Google Image Search API

Обмен - Интеграция с WEB

Для начала давайте найдем хотя бы одну причину, почему парсинг 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 \u003cb\u003eWater\u003c/b\u003e | Clean \u003cb\u003eWater\u003c/b\u003e Action",
			"titleNoFormatting":"Protecting Drinking Water | Clean Water Action",
			"originalContextUrl":"http://www.cleanwateraction.org/programinitiative/protecting-drinking-water-0",
			"content":"cup of \u003cb\u003ewater\u003c/b\u003e",
			"contentNoFormatting":"cup of water",
			"tbUrl":"http://t1.gstatic.com/images?q\u003dtbn: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 \u003cb\u003eWater\u003c/b\u003e Rooster",
			"titleNoFormatting":"Characteristics of the Water Rooster",
			"originalContextUrl":"http://www.fengshuiweb.co.uk/animals/waterrooster.htm",
			"content":"Characteristics of the \u003cb\u003eWater\u003c/b\u003e",
			"contentNoFormatting":"Characteristics of the Water",
			"tbUrl":"http://t2.gstatic.com/images?q\u003dtbn: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?oe\u003dutf8\u0026ie\u003dutf8\u0026source\u003duds\u0026start\u003d0\u0026imgsz\u003dlarge\u0026hl\u003den\u0026q\u003dwater",
		"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

Скачать файлы

Наименование Файл Версия Размер
Google images API
.epf 7,03Kb
30.08.14
24
.epf 7,03Kb 24 Скачать

См. также

Комментарии
1. Сергей Фомин (sergei2k) 01.09.14 14:06 Сейчас в теме
Можно использовать что-нибудь вот такое для обработки результата: http://infostart.ru/public/119601/
2. rougudz rougudz (rougudz) 13.06.16 11:33 Сейчас в теме
{"responseData": null, "responseDetails": "This API is no longer available.", "responseStatus": 403}

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

печаль
Оставьте свое сообщение