Имя: Пароль:
1C
1С v8
Получение куков сессии
,
0 Serglih
 
05.04.16
09:51
Доброго времени суток. Есть люди, которые сталкивались с задачей получения данных сессии интернет-соединения из 1С? Задача такая: пользователь из 1С переходит в браузер, заполняет корзину и сохраняет. При сохранении в куки пишется определенное значение и нужно как то его получить. Можно ли как то отследить сессию и поймать куки? Сам с этой темой знаком весьма поверхностно (не кидайтесь помидорами), гуглить пытался, но внятного решения не нашел. Единственный вариант который смог реализовать - открытие web-страницы внутри самой 1С (через поле html документа):

htmldoc = ЭлементыФормы.ПолеHTMLДокумента.Документ;
Куки = htmldoc.Cookie;

И все бы хорошо, но встроенный в 1С движок не поддерживает библиотеки, которые использует сайт и, соответственно, некорректно отображает страницу. Поэтому такой вариант не подошел.
Знает кто-нибудь как получить данные сессии внешнего браузера (при том, что сессия уже могла быть открыта до того, как пользователь пошел на нужный сайт)?
Ну или может можно как то обновить движок html в 1С?

Вот описание данных о браузерах:
1С - Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; Tablet PC2.0; InfoPath.2)

Chrome - Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
1 Записьдампа
 
05.04.16
09:56
Нельзя. Сессионные куки с флагом httponly доступны только при работе с http протоколом непосредственно. Специально так сделано.
2 Serglih
 
05.04.16
10:00
(1) Может можно как то напрямую тогда? Через POST-запрос или еще как то? Где то в недрах Интернета находил что то похожее, но разобраться не смог.
3 Записьдампа
 
05.04.16
10:01
И не заливай тут про корзину, когда пишешь трояна, уводящего деньги из веб-клиента банка =)
4 Записьдампа
 
05.04.16
10:02
(2) Можно через реализацию работы с http протоколом. Берешь фиддлер, смотришь что оно посылает и принимает. Делаешь через httpсоединение то же самое.
5 Serglih
 
05.04.16
10:07
(3) Эм... нет, к сожалению моих скромных познаний не хватит пока для решения таких задач)) Буду признателен за консультацию) Не в том смысле, что возьмусь тягать деньги, а чтоб понять суть. Работа с куками подобного рода не безопасна? Для моей задачи требуется определенный уровень безопасности соединения (данные не должны утекать куда не надо).
Моя задача несколько более банальна, нежели увод денег с клиент-банка) Всю суть не могу рассказать по причине конфиденциальности, но общая суть такая: есть сайт, на котором пользователь выбирает товары. При нажатии кнопки "Сохранить" (на сайте) формируется запись в куках, содержащая ссылку на xml-файл с выгрузкой выбранных товаров. Нужно поймать куки, выбрать эту ссылку и загрузить товары в документ 1С.
6 Записьдампа
 
05.04.16
10:20
(5) Тогда есть шанс, что это не httonly кука и ее можно прочитать из контекста документа.
Можно попробовать организовать в html документе фрейм, в котором поднять версию ie, используемого 1с, но там могут возникнуть сложности ограничения доступа межу фреймами. Это если твой пользователь использует 1с как браузер для работы.
Пробовать надо, чо...
7 Юрий Лазаренко
 
05.04.16
10:23
(6) Вряд ли получится достучаться до документа внутри фрейма.
8 Юрий Лазаренко
 
05.04.16
10:24
Как вариант - открывать сайт из 1С как com-объект и уже через этот объект попробовать достучаться до страницы и ее куков.
9 Записьдампа
 
05.04.16
10:26
(8) это если пользователь использует для работы тот же браузер, что и ты поднимешь через com. Я бы посмотрел, как тыт поднимешь com firefox, например.
10 Юрий Лазаренко
 
05.04.16
10:31
(9) Пусть ест что дают!
11 Serglih
 
05.04.16
10:35
(8) Можно немного подробнее? Я думал об этом варианте, но пока не знаю как реализовать.
12 Юрий Лазаренко
 
05.04.16
10:49
(11)
    ИЕ = Новый COMОбъект("InternetExplorer.Application");
    /////////////////////////////////////////////////////////////////////////////////
    // Видимость можно отключать, это должно обеспечить небольшое ускорение, совсем маленькое, но все-таки
    ИЕ.Visible = Истина;
    /////////////////////////////////////////////////////////////////////////////////
    Подумать(1); // Пауза, чтобы IE успел прийти в себя
    ИЕ.Navigate("http://mysite.ru";);
    Подумать(1); // Пауза, чтобы IE успел прийти в себя
    Пока ИЕ.Busy ИЛИ ИЕ.ReadyState <> 4 Цикл
        //Ждем загрузки сайта
    КонецЦикла;
    /////////////////////////////////////////////////////////////////////////////////
    // Небольшая пауза, чтобы сайт успел загрузиться. Здесь всего 1 секунда, так как вся необходимая информация загружается быстро и потом не меняется.
    Подумать(1);
    /////////////////////////////////////////////////////////////////////////////////
    
    Куки = ИЕ.Document.cookie;
13 Serglih
 
05.04.16
11:38
(12) Спасибо, попробую реализовать.
14 Остап Сулейманович
 
05.04.16
11:44
(13) Не взлетит.
15 Остап Сулейманович
 
05.04.16
11:46
+ (14) Ибо бред и пурга.
Вот это вот : ИЕ.Navigate("http://mysite.ru";;); откроет сайт на стороне сервера (то есть 1С). Соответственно Куки = ИЕ.Document.cookie; вернет куки установленные там же. А не у клиента.
16 Остап Сулейманович
 
05.04.16
11:49
Нефик использовать 1С на ВЕБ-сервере как замену ВЕБ-серверу в лоб.
17 Юрий Лазаренко
 
05.04.16
11:53
(15) "откроет сайт на стороне сервера (то есть 1С)"
А если подумать?
18 Serglih
 
05.04.16
11:53
(16) 1С используется под толстым клиентом. Просто нужно с сайта производителя загружать товары напрямую в документ.
19 Serglih
 
05.04.16
11:54
(15) Не знаю, до этого пока не дошел, пока не могу таким способом пройти авторизацию на сайте (сначала IE несколько раз переоткрывает окно авторизации, а потом выкидывает ошибку Authorization Required. Хотя учетные данные ввожу верные.
20 Serglih
 
05.04.16
11:57
(19) Куки соответственно пустые при этом.
21 Остап Сулейманович
 
05.04.16
12:02
(18) "нужно с сайта производителя загружать товары напрямую в документ."
Всмысле 1С используется как клиент? Тогда задлянафига тебе куки? Их устанавливает и читает сервер. А не клиент.
22 Serglih
 
05.04.16
12:03
(6) Этот вариант вообще не понял. Слова "html" и "фрейм" вгоняют меня в тупик(
23 Остап Сулейманович
 
05.04.16
12:04
+ (21) С твоей стороны должно быть разрешено сохранять куки. Только и всего. Умеет ли это браузер встроенный в 1с - я не знаю. Тем более сможет ли он потом эти самые куки вернуть серверу.
24 Юрий Лазаренко
 
05.04.16
12:05
(22) Сейчас кину на почту обработку с работающим кодом
25 Остап Сулейманович
 
05.04.16
12:06
(22) Относись к HTML как обычному XML. Оно по сути так и есть.
26 Serglih
 
05.04.16
12:08
(21) Вкратце: пишется большой модуль, внедряемый в типовую конфу. Большую часть уже реализовал, но загвоздка в этом пункте возникла. Ранее полагалось, что из корзины выгружаем и сохраняем xml, а затем его загружаем в 1С. Теперь хотим отказаться от ручного выбора файла (защита от ошибки пользователя). На стороне сайта сказали, что в куки в определенном месте сохраняется ссылка на xml файл. Процедура загрузки из этого файла написана, осталось только его получить. А тут возникла проблема. Если открываю сайт в браузере, то не могу получить куки (и, соответственно, ссылку на xml). А если открывать в 1С, то куки получаю нормально, но из-за старой версии браузера 1С не работают нужные библиотеки и сайт в 1С выглядит не читабельно (более того, не работает механизм выбора товаров).
27 Юрий Лазаренко
 
05.04.16
12:10
Отправил. Там открывается страница, читаются ее куки и выводятся через "Сообщить". Думаю, дальше понятно, как доработать. При нажатии кнопки в 1С открывается окно ИЕ, там пользователь делает что надо, потом жмет еще одну кнопку, 1С дергает открытый ранее ИЕ и берет из него куки - они там в виде одной строки с разделителем в виде ";".
28 Юрий Лазаренко
 
05.04.16
12:11
(14)(15) Вам отправить, Остап Сулейманович?
29 Сергиус
 
05.04.16
12:24
(0) Для этого лучше всего использовать HTTPСоединение.

Как пример:
30 Сергиус
 
05.04.16
12:27
+(29)

HTTP =  Новый HTTPСоединение(Сервер,,,,,600,);
        ФайлЗапроса = ПолучитьИмяВременногоФайла();
        ТекстовыйФайл = Новый ТекстовыйДокумент;
        
        ТекстовыйФайл.УстановитьТекст("");
        ТекстовыйФайл.Записать(ФайлЗапроса, КодировкаТекста.ANSI);
        ФайлРезультата = ПолучитьИмяВременногоФайла();
        HTTPОтвет = HTTP.ОтправитьДляОбработки(ФайлЗапроса, Ресурс, ФайлРезультата, ЗаголовокHTTP);
        Если (HTTPОтвет.КодСостояния = 200) Тогда
            Заголовки = HTTPОтвет.Заголовки;
            ТекЗнач = Заголовки["Set-Cookie"];
            Если ТекЗнач <> Неопределено Тогда
                ПозСессии = Найти(ТекЗнач,"PHPSESSID=");
                Если ПозСессии > 0 Тогда
                    ПозТЗ = Найти(ТекЗнач,";");
                    Если ПозТЗ > 0 Тогда
                        ИдСессии = Сред(ТекЗнач,ПозСессии+10,ПозТЗ - ПозСессии - 10);
                    Иначе
                        ИдСессии = Сред(ТекЗнач,ПозСессии+10);
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;    
        КонецЕсли;
31 Serglih
 
05.04.16
12:33
(27) (30) Спасибо, сейчас буду пробовать варианты.
32 Serglih
 
05.04.16
13:39
(27) При запуске (ничего не менял, только адрес сайта) выдает ошибку:
{Форма.Форма.Форма(33)}: Ошибка при получении значения атрибута контекста (cookie)
    Возврат ИЕ.document.cookie;
по причине:
Произошла исключительная ситуация (0x800a01b6)

А вообще не совсем понял ваш алгоритм. Точнее то, что написано в коде вроде понятно, но не понимаю то, что вы написали тут. "При нажатии кнопки в 1С открывается окно ИЕ, там пользователь делает что надо, потом жмет еще одну кнопку, 1С дергает открытый ранее ИЕ и берет из него куки "
Судя по коду 1С сразу дергает куки а не ждет второго нажатия кнопки. Или я где то что то недопонимаю?
33 Юрий Лазаренко
 
05.04.16
14:15
(32) Да, в моем случае сразу дергает и ничего не ждет. Но вам же иначе надо сделать, как я понял? Пользователь должен зайти на сайт, что-то там заполнить и потом 1С должна взять с этого сайта куки. Вот я и предлагаю вам алгоритм: открываете автоматом пользователю ИЕ, он там все делает, потом 1С из этого ИЕ берет куки. Хотя, если кука сохранена, можно ее взять и позже.

А ошибка "Произошла исключительная ситуация (0x800a01b6)" скорее всего означает, что вам документ еще не успел подгрузиться. Хотя может еще дело в версии ИЕ - на 11-м бывают такие траблы.
34 Юрий Лазаренко
 
05.04.16
14:16
+(33) Но я просто кинул рабочий пример кода, попробуйте хром вместо ИЕ, например.
35 Serglih
 
05.04.16
15:09
(34) Ок, буду пробовать, спасибо за помощь.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн