kuzyara

ВнешняяОбработкаПоискКартинокGoogle.epf

Sep 5th, 2016
489
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.95 KB | None | 0 0
  1.  
  2. &НаКлиенте
  3. Процедура НаименованиеПриИзменении(Элемент)
  4. КомандаНайти(Неопределено);
  5. КонецПроцедуры
  6.  
  7. &НаКлиенте
  8. Процедура КомандаНайти(Команда)
  9. ХтмлДокумент = "https://www.google.ru/search?q="+ТекстUnicodeToUTF8(Наименование)+"&tbm=isch";
  10. ЭтаФорма.ТекущийЭлемент = Элементы.ХтмлДокумент;
  11. КонецПроцедуры
  12.  
  13. &НаКлиенте
  14. Процедура ХтмлДокументДокументСформирован(Элемент)
  15.  
  16. Если Элементы.ХтмлДокумент.Документ.readyState = "complete" Тогда
  17.  
  18. ОчиститьЭлемент("mngb");
  19. ОчиститьЭлемент("xjsc");
  20. ОчиститьЭлемент("searchform");
  21. ОчиститьЭлемент("rshdr");
  22. ОчиститьЭлемент("mngb");
  23. ОчиститьЭлемент("fbar");
  24.  
  25. КонецЕсли;
  26.  
  27. КонецПроцедуры
  28.  
  29. &НаКлиенте
  30. Процедура ХтмлДокументПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
  31. Попытка
  32.  
  33. струкУрл = РазложитьАдрес(ДанныеСобытия.Href);
  34.  
  35. Если струкУрл <> Неопределено Тогда
  36. АдресКаринки = "";
  37. Если струкУрл.Свойство("imgurl", АдресКаринки) Тогда
  38.  
  39. // двойное декодирование - особенность ссылок гугла
  40. АдресКаринки = ДекодироватьURL(ДекодироватьURL(АдресКаринки));
  41.  
  42. СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(АдресКаринки);
  43.  
  44. // при неудаче получим из кэша гугла
  45. Если ТипЗнч(СодержимоеАдреса) <> Тип("ДвоичныеДанные") Тогда
  46. СодержимоеАдреса = ПолучитьСодержимоеВебАдреса(ДанныеСобытия.Element.src);
  47. КонецЕсли;
  48.  
  49.  
  50. Если ТипЗнч(СодержимоеАдреса) = Тип("ДвоичныеДанные") Тогда
  51. к = новый Картинка(СодержимоеАдреса);
  52. Закрыть(к);
  53. Иначе
  54. Сообщить("Не удалось получить изображение");
  55. КонецЕсли;
  56.  
  57.  
  58. Иначе
  59. Предупреждение("Это не ссылка!");
  60. КонецЕсли;
  61. КонецЕсли;
  62.  
  63. Исключение
  64. Предупреждение("Не удалось получить изображение: "+ОписаниеОшибки());
  65. КонецПопытки;
  66. КонецПроцедуры
  67.  
  68. &НаСервере
  69. Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  70. Если ЭтаФорма.Параметры.Свойство("Наименование") Тогда
  71. ЭтаФорма.Наименование = УдалитьЗапрещенныеСимволыИмениФайла(ЭтаФорма.Параметры.Наименование);
  72. КонецЕсли;
  73. КонецПроцедуры
  74.  
  75. &НаКлиенте
  76. Процедура ПриОткрытии(Отказ)
  77. Если ЗначениеЗаполнено(Наименование) Тогда
  78. КомандаНайти(Неопределено);
  79. КонецЕсли;
  80. КонецПроцедуры
  81.  
  82. ///////////////////////////////////////////
  83. // Процедуры и функции общего назначения //
  84. ///////////////////////////////////////////
  85.  
  86. &НаКлиентеНаСервереБезКонтекста
  87. Функция РазложитьАдрес(Знач Адрес_) Экспорт
  88.  
  89. Если Найти(Адрес_, "http://") = 1 Тогда
  90. Адрес = СтрЗаменить(Адрес_, "http://", "");
  91. ИначеЕсли Найти(Адрес_, "https://") = 1 Тогда
  92. Адрес = СтрЗаменить(Адрес_, "https://", "");
  93. Иначе
  94. Возврат Неопределено;
  95. КонецЕсли;
  96.  
  97. Результат = Новый Структура();
  98. СтрокиАдреса = СтрЗаменить(Адрес, "/", Символы.ПС);
  99. Результат.Вставить("АдресСервера", СтрПолучитьСтроку(СтрокиАдреса, 1));
  100. АдресСтраницы = "";
  101. Для Сч = 2 По СтрЧислоСтрок(СтрокиАдреса) Цикл
  102. АдресСтраницы = АдресСтраницы + СтрПолучитьСтроку(СтрокиАдреса, Сч) + "/";
  103. КонецЦикла;
  104. Результат.Вставить("АдресСтраницы", Лев(АдресСтраницы, СтрДлина(АдресСтраницы)-1));
  105.  
  106. ПозПарамов = Найти(Адрес_, "?");
  107. Если ПозПарамов>0 Тогда
  108. Парамы = Сред(Адрес_, ПозПарамов+1);
  109. Парамы = СтрЗаменить(Парамы, "&", Символы.ПС);
  110. Для Сч = 1 По СтрЧислоСтрок(Парамы) Цикл
  111. ТекСтрПарам = СтрПолучитьСтроку(Парамы, Сч);
  112. ПозРавно = Найти(ТекСтрПарам, "=");
  113. ПарамИмя = Лев(ТекСтрПарам, ПозРавно-1);
  114. ПарамЗначение = Сред(ТекСтрПарам, ПозРавно+1);
  115. Результат.Вставить(ПарамИмя, ПарамЗначение);
  116. КонецЦикла;
  117. КонецЕсли;
  118.  
  119. Возврат Результат;
  120.  
  121. КонецФункции
  122.  
  123. &НаКлиентеНаСервереБезКонтекста
  124. Функция УдалитьЗапрещенныеСимволыИмениФайла(Знач ИмяФайла, СимволЗамены=" ") Экспорт
  125. ИмяФайла = Лев(ИмяФайла, 50);
  126. Буквы = "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
  127. Цифры = "0123456789";
  128. ДополнительныеСимволы = ".,-_ ()";
  129. ВсеСимволы = Буквы+Цифры+ДополнительныеСимволы;
  130.  
  131. Рез="";
  132. Для й=1 По СтрДлина(ИмяФайла) Цикл
  133. Символ = Сред(ИмяФайла, й, 1);
  134. Если Найти(ВсеСимволы, НРег(Символ))=0 Тогда
  135. Рез=Рез+СимволЗамены;
  136. Иначе
  137. Рез=Рез+Символ;
  138. КонецЕсли;
  139. КонецЦикла;
  140.  
  141. Возврат Рез;
  142.  
  143. КонецФункции
  144.  
  145. // http://infostart.ru/public/101004/
  146. &НаКлиенте
  147. Функция ДекодироватьURL(URL, WindowsFileURI=Истина)
  148.  
  149. ДлинаСтроки = СтрДлина(URL);
  150. Инд = 1;
  151. Результат = "";
  152. ПолныйКод = 0;
  153. ОсталосьСимволов = 0;
  154.  
  155. Пока Инд <= ДлинаСтроки Цикл
  156.  
  157. Код = КодСимвола(URL, Инд);
  158.  
  159. Если Код = 37 Тогда
  160. // Символ(37) = "%"
  161. Код = Из16ВЧисло(Сред(URL, Инд+1, 2));
  162. Инд = Инд + 2;
  163. ИначеЕсли ОсталосьСимволов = 0 Тогда
  164. Если (Код = 43) и (не WindowsFileURI) Тогда
  165. // Символ(43) = "+"
  166. Код = 32; // Символ(32) = " " (пробел)
  167. КонецЕсли;
  168. Результат = Результат + Символ(Код);
  169. Инд = Инд + 1;
  170. Продолжить;
  171. КонецЕсли;
  172.  
  173. Если Код <= 127 Тогда
  174. // Код = 0b0ххххххх
  175. Результат = Результат + Символ(Код);
  176. ИначеЕсли Код <= 191 Тогда
  177. // Код = 0b10хххххх
  178. ПолныйКод = (ПолныйКод*64) + (Код%64); // shl(ПолныйКод, 6) + (Код & 0x3F)
  179. ОсталосьСимволов = ОсталосьСимволов - 1;
  180. Если ОсталосьСимволов = 0 Тогда
  181. Результат = Результат + Символ(ПолныйКод);
  182. КонецЕсли;
  183. ИначеЕсли Код <= 223 Тогда
  184. // Код = 0b110ххххх
  185. ПолныйКод = Код % 32; // Код & 0x1F
  186. ОсталосьСимволов = 1;
  187. ИначеЕсли Код <= 239 Тогда
  188. // Код = 0b1110хххх
  189. ПолныйКод = Код % 16; // Код & 0x0F
  190. ОсталосьСимволов = 2;
  191. ИначеЕсли Код <= 247 Тогда
  192. // Код = 0b11110ххх
  193. ПолныйКод = Код % 8; // Код & 0x07
  194. ОсталосьСимволов = 3;
  195. ИначеЕсли Код <= 251 Тогда
  196. // Код = 0b111110хх
  197. ПолныйКод = Код % 4; // Код & 0x03
  198. ОсталосьСимволов = 4;
  199. ИначеЕсли Код <= 253 Тогда
  200. // Код = 0b1111110х
  201. ПолныйКод = Код % 2; // Код & 0x01
  202. ОсталосьСимволов = 5;
  203. КонецЕсли;
  204.  
  205. Инд = Инд + 1;
  206. КонецЦикла;
  207.  
  208. Возврат Результат;
  209. КонецФункции
  210.  
  211. &НаКлиенте
  212. Функция Из16ВЧисло(Знач Значение)
  213.  
  214. Результат = 0;
  215. Множитель = 1;
  216. Пока Значение <> "" Цикл
  217. Результат = Результат + Множитель * (Найти("0123456789ABCDEF", Прав(Значение,1))-1);
  218. Множитель = Множитель * 16;
  219. Значение = Лев(Значение,СтрДлина(Значение)-1);
  220. КонецЦикла;
  221. Возврат Результат;
  222.  
  223. КонецФункции
  224.  
  225. // Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
  226. // ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html
  227. &НаКлиенте
  228. Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
  229. Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
  230. Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
  231. Перем ИмяФайлаОтветаКодированное, ИмяФайлаОтвета, Порт, Логин, Пользователь, Пароль, Прокси, Таймаут;
  232.  
  233. Если Не ЗначениеЗаполнено(СерверПриемник) Тогда Возврат Неопределено; КонецЕсли;
  234. Если ТипЗнч(ЗаголовкиHTTP) <> Тип("Соответствие") Тогда ЗаголовкиHTTP = Новый Соответствие; КонецЕсли;
  235. Если Найти(Нрег(СерверПриемник), "https://") = 1 Тогда ЗащищенноеСоединение = Истина; КонецЕсли;
  236.  
  237. Протокол = ?(Найти(Нрег(СерверПриемник), "https://") = 1 ИЛИ ЗащищенноеСоединение, "https://", "http://");
  238. Если Лев(НРег(СерверПриемник), СтрДлина(Протокол)) = Протокол Тогда
  239. СерверПриемник = Сред(СерверПриемник, СтрДлина(Протокол) + 1);
  240. КонецЕсли;
  241.  
  242. Если НЕ ЗначениеЗаполнено(АдресСтраницы) Тогда
  243. Позиция = Найти(СерверПриемник, "/");
  244. Если Позиция > 0 Тогда
  245. АдресСтраницы = Сред(СерверПриемник, Позиция, СтрДлина(СерверПриемник));
  246. СерверПриемник = Лев(СерверПриемник, Позиция - 1);
  247. Иначе
  248. АдресСтраницы = "/";
  249. КонецЕсли;
  250. КонецЕсли;
  251.  
  252. СерверПриемник = СтрЗаменить(СерверПриемник, "/", "");
  253.  
  254. //Выделяем порт из доменного имени
  255. ПозицияДвоеточия = Найти(СерверПриемник, ":");
  256. Если ПозицияДвоеточия > 0 Тогда
  257. Порт = Число(Сред(СерверПриемник, ПозицияДвоеточия + 1));
  258. СерверПриемник = Лев(СерверПриемник, ПозицияДвоеточия - 1);
  259. КонецЕсли;
  260.  
  261. Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
  262. Для каждого КлючЗначение из ПараметрыСоединения Цикл
  263. Значение = КлючЗначение.Значение; Выполнить(КлючЗначение.Ключ + " = Значение;");
  264. КонецЦикла;
  265. Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Логин);
  266. КонецЕсли;
  267. НТТР = Новый HTTPСоединение(СерверПриемник, Порт, Пользователь, Пароль, Прокси, Таймаут,
  268. ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));
  269.  
  270. //Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
  271. ОтветHTTP = НТТР.Получить(Новый HTTPЗапрос(АдресСтраницы, ЗаголовкиHTTP)); //
  272. ОшибкаЗапроса = (ОтветHTTP.КодСостояния >= 400);
  273.  
  274. //После получения ответа сервера необходимо проверить статус или код состояния.
  275. //http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
  276. //Если сервер вернул один из статусов переадресации
  277. //301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»),
  278. //то в этом случае можно попытаться перейти на ресурс, на который переадресовал сервер
  279. Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда
  280.  
  281. Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
  282. //Адрес страницы переадресации содержится в поле Location заголовка ответа
  283. АдресСтраницы = ОтветHTTP.Заголовки["Location"]; //
  284. Если ЗначениеЗаполнено(АдресСтраницы) Тогда
  285. Если Найти(НРег(АдресСтраницы), "http://") = 0 И Найти(НРег(АдресСтраницы), "https://") = 0 Тогда
  286. АдресСтраницы = ?(Лев(АдресСтраницы, 1) = "/", Сред(АдресСтраницы, 2), АдресСтраницы);
  287. Если Найти(АдресСтраницы, СерверПриемник + "/") = 0 Тогда
  288. АдресСтраницы = Протокол + СерверПриемник + ?(ЗначениеЗаполнено(Порт), ":" + Порт, "") + "/" + АдресСтраницы;
  289. КонецЕсли;
  290. КонецЕсли;
  291.  
  292. //Если сервер вернул cookies (http://ru.wikipedia.org/wiki/HTTP_cookie, http://www.faqs.org/rfcs/rfc6265.html?#41;,
  293. //вставим их в заголовки для передачи на страницу перехода
  294. Куки = ОтветHTTP.Заголовки["Set-Cookie"];//
  295. Если ЗначениеЗаполнено(Куки) Тогда ЗаголовкиHTTP.Вставить("Cookie", Куки); КонецЕсли;
  296.  
  297. //Рекурсивный вызов
  298. Возврат ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP, ПолучитьКакДвоичныеДанные, ЗащищенноеСоединение);//
  299.  
  300. КонецЕсли;
  301. КонецЕсли;
  302.  
  303. ИначеЕсли ОтветHTTP.КодСостояния >= 100 И ОтветHTTP.КодСостояния <= 200 Тогда
  304. //Статус ответа в интервале между 100 и 200 Ok говорит о нормальном результате HTTP-запроса
  305. Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
  306. ТипСодержимого = ОтветHTTP.Заголовки["Content-Type"];
  307. //http://ru.wikipedia.org/wiki/Список_MIME-типов
  308. Если Найти(ТипСодержимого, "text/") = 1 ИЛИ Найти(ТипСодержимого, "/javascript")
  309. ИЛИ Найти(ТипСодержимого, "+xml") ИЛИ Найти(ТипСодержимого, "/xml") <> 0 ИЛИ Найти(ТипСодержимого, "/json") <> 0 Тогда
  310. ПолучитьКакДвоичныеДанные = Ложь;
  311. ИначеЕсли Найти(ТипСодержимого, "image/") = 1 ИЛИ Найти(ТипСодержимого, "video/") = 1
  312. ИЛИ Найти(ТипСодержимого, "application/") = 1 ИЛИ Найти(ТипСодержимого, "audio/") = 1 Тогда
  313. //Если содержимое полученного ответа представляет собой изображение, видео, приложение,
  314. //возвращаем двоичные данные, так как возвращать в виде строки не имеет смысла.
  315. ПолучитьКакДвоичныеДанные = Истина;
  316. КонецЕсли;
  317. //Некоторые сервера возвращают в типе содержимого имя отданного файла, например image/png; name="Имя файла.png"
  318. //или отдают в заголовке Content-Disposition: attachment; filename=Имя файла.png (http://www.http11.ru/post.php?post=2)
  319. Если ОтветHTTP.Заголовки["Content-Disposition"] <> Неопределено Тогда
  320. ТипСодержимого = ОтветHTTP.Заголовки["Content-Disposition"];
  321. КонецЕсли;
  322. ТипСодержимого = СтрЗаменить(СтрЗаменить(ТипСодержимого, """", ""), "'", "");
  323.  
  324. //в ключе filename*=UTF-8'' содержится url-кодированное имя файла
  325. ПозицияИмениФайла = Найти(ТипСодержимого, "filename*=UTF-8");
  326. Если ПозицияИмениФайла <> 0 Тогда
  327. ИмяФайлаОтветаКодированное = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("filename*=UTF-8"));
  328. ПозицияДвоеточия = Найти(ИмяФайлаОтветаКодированное, ";");
  329. Если ПозицияДвоеточия <> 0 Тогда
  330. ИмяФайлаОтветаКодированное = Лев(ИмяФайлаОтветаКодированное, ПозицияДвоеточия - 1);
  331. КонецЕсли;
  332. КонецЕсли;
  333.  
  334. //в ключе filename= содержится обычное имя файла
  335. ПозицияИмениФайла = Найти(ТипСодержимого, "name=");
  336. Если ПозицияИмениФайла <> 0 Тогда
  337. ИмяФайлаОтвета = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("name="));
  338. ПозицияДвоеточия = Найти(ИмяФайлаОтвета, ";");
  339. Если ПозицияДвоеточия <> 0 Тогда
  340. ИмяФайлаОтвета = Лев(ИмяФайлаОтвета, ПозицияДвоеточия - 1);
  341. КонецЕсли;
  342. КонецЕсли;
  343. КонецЕсли;
  344. КонецЕсли;
  345.  
  346. ЗаголовкиHTTP = ОтветHTTP.Заголовки;
  347. //Добавляем в заголовки ответа код состояния (ответа) HTTP-сервера и имя файла содержимого, если есть.
  348. ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
  349. Если ЗначениеЗаполнено(ИмяФайлаОтвета) Тогда ЗаголовкиHTTP.Вставить("FileName", ИмяФайлаОтвета); КонецЕсли;
  350. Если ЗначениеЗаполнено(ИмяФайлаОтветаКодированное) Тогда
  351. ЗаголовкиHTTP.Вставить("EncodeFileName", ИмяФайлаОтветаКодированное);
  352. КонецЕсли;
  353.  
  354. Если ОшибкаЗапроса ИЛИ НЕ ПолучитьКакДвоичныеДанные Тогда Возврат ОтветHTTP.ПолучитьТелоКакСтроку(); КонецЕсли;
  355. Возврат ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();
  356.  
  357. КонецФункции // ПолучитьСодержимоеВебАдреса()
  358.  
  359. &НаКлиенте
  360. Функция ЧислоDecToHex(Знач Число)
  361.  
  362. ЧислаHex = "0123456789ABCDEF";
  363. Результат = "";
  364.  
  365. Для Цифр = 1 По 2 Цикл
  366. ТекЦифра = Число % 16;
  367. Число = Цел(Число / 16);
  368. Результат = Сред(ЧислаHex, ТекЦифра + 1, 1) + Результат;
  369. КонецЦикла;
  370.  
  371. Возврат Результат;
  372.  
  373. КонецФункции
  374.  
  375. &НаКлиенте
  376. Функция ТекстUnicodeToUTF8(Текст)
  377.  
  378. СимволыUTF8 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz~_-.";
  379. Результат = "";
  380.  
  381. Для НомерСимвола = 1 По СтрДлина(Текст) Цикл
  382.  
  383. ТекСимвол = Сред(Текст, НомерСимвола, 1);
  384.  
  385. Если ТекСимвол = " " Тогда
  386. Результат = Результат + "%20";
  387. ИначеЕсли Найти(СимволыUTF8, ТекСимвол) > 0 Тогда
  388. Результат = Результат + ТекСимвол;
  389. Иначе
  390.  
  391. КодСимвола = КодСимвола(ТекСимвол);
  392.  
  393. Если КодСимвола < 128 Тогда
  394. Результат = Результат + "%" + ЧислоDecToHex(КодСимвола);
  395. Иначе
  396.  
  397. Делитель = 32;
  398. ГруппаБайт = 8;
  399. HEX = "";
  400.  
  401. Пока Делитель > 4 Цикл
  402.  
  403. Остаток = КодСимвола % 64;
  404.  
  405. HEX = "%" + ЧислоDecToHex(128 + Остаток) + HEX;
  406.  
  407. Множитель = Цел(КодСимвола / 64);
  408.  
  409. Если Множитель < Делитель Тогда
  410. HEX = "%" + ЧислоDecToHex((ГруппаБайт-2) * Делитель + Множитель) + HEX;
  411. Прервать;
  412. КонецЕсли;
  413.  
  414. Делитель = Делитель / 2;
  415. ГруппаБайт = ГруппаБайт * 2;
  416.  
  417. КонецЦикла;
  418.  
  419. Результат = Результат + HEX;
  420.  
  421. КонецЕсли;
  422.  
  423. КонецЕсли;
  424.  
  425. КонецЦикла;
  426.  
  427. Возврат Результат;
  428.  
  429. КонецФункции
  430.  
  431. &НаКлиенте
  432. Процедура ОчиститьЭлемент(ид)
  433. элем = Элементы.ХтмлДокумент.Документ.getElementById(ид);
  434. Если элем <> Неопределено Тогда
  435. элем.innerHTML = "";
  436. КонецЕсли;
  437. КонецПроцедуры
Add Comment
Please, Sign In to add comment