Имя: Пароль:
1C
1С v8
HTTPСоединение и POST авторизация
0 oslokot
 
10.06.14
15:49
Не получается авторизоваться на страничке сайта.
Используется POST-авторизация. Подозреваю, что я наворочал с заголовками..
Вот код на примере мисты:


    АдресСервера = "dev.mista.ru";
    СтрокаЛогин = "user";
    СтрокаПароль = "pass";
    
    // Формирование заголовков запроса
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("POST /users.php HTTP/1.1");
    Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    Заголовки.Вставить("Accept-Charset", "windows-1251,utf-8;q=0.7,*;q=0.3");
    Заголовки.Вставить("Accept-Encoding", "gzip,deflate,sdch");
    Заголовки.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
    Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
    Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");
    Заголовки.Вставить("Connection", "Keep-alive");
    Заголовки.Вставить("Host", АдресСервера);
    
    
    // Установка соединения с сервером
    Соединение = Новый HTTPСоединение(АдресСервера);
    
    // Далее, пытаюсь авторизоваться
    Запрос = Новый HTTPЗапрос("users.php?user_name="+СтрокаЛогин+"&user_password="+СтрокаПароль, Заголовки);
       Ответ = Соединение.ОтправитьДляОбработки(Запрос, ИмяФайлаЗапроса);
    
    // Теперь я хочу войти на страничку пользователя
    Запрос = Новый HTTPЗапрос("index.php?user_id=84363");
    Соединение.Получить(Запрос, ИмяВходящегоФайла);
    // ФИг там
    // В полученном файле "Страница доступна только зарегистрированным пользователям"



Что я делаю не так? Может есть у кого рабочие примеры?
1 acsent
 
10.06.14
15:50
ты ему пост - он тебе куки,
Ты ему куки и гет - он тебе файл
2 oslokot
 
10.06.14
15:54
(1) Заголовки ответа поста в гет? Пробовал, не получается. Так?:

    Запрос = Новый HTTPЗапрос("index.php?user_id=84363");
    Соединение.Получить(Запрос, ИмяВходящегоФайла, Ответ.Заголовки);
3 oslokot
 
10.06.14
16:00
+ а, вот так наверное?

    Запрос = Новый HTTPЗапрос("index.php?user_id=84363", Ответ.Заголовки);

Но теперь требует размер запроса "411 Length Required"

Пробую перед запросом вставить

    Ответ.Заголовки.Вставить("Content-Length", 100);

Пофиг, не видит
4 Dolphinbet
 
10.06.14
16:13
(3) а зачем все заголовки ответа передавать? нужно только куки
5 oslokot
 
10.06.14
16:23
(4) пробовал подсовывать только полученные куки. Безрезультатно.

Есть у кого живой пример?
6 Dolphinbet
 
10.06.14
18:01
(5) может сохранить в файл, вычислить размер файла и подставить полученное значение в Content-Length ?
7 Bober
 
10.06.14
18:40
(0) как вариант посмотреть как это происходит в браузере по F12
8 acsent
 
10.06.14
19:00
юзай фидлер и браузер
9 Filin
 
10.06.14
20:36
Ну, насколько я понимаю, если у тебя  POST-авторизация, то логин и пароль надо передавать в теле запроса, а не в заголовках. То-есть фактически отправлять форму на сервер. Потом ты получишь ответ с куками, где будет сессия, и при использовании того-же соединения, просто отправляешь запросы. Куки, теоретически, должны ходить автоматом.
10 oslokot
 
11.06.14
09:23
(8) о, спасибо! фидлер мне в помощь, а я и запамятовал.
11 oslokot
 
11.06.14
09:25
Позже отпишу о результате
12 oslokot
 
17.06.14
10:21
Всем привет. Во всем разобрался. Все оказалось как всегда просто.
Если кому интересно, выкладываю свой код авторизации на примере мисты.ру

    // Убрать http-протоколы из доменного имени
    АдресСервера = СтрЗаменить(АдресСервера, "http://";, "");
    АдресСервера = СтрЗаменить(АдресСервера, "https://";, "");
    АдресСервера = СтрЗаменить(АдресСервера, "/", "");
    
    Соединение = Новый HTTPСоединение(АдресСервера);
    
    // Создать файлы запроса и получения
    ВремКаталог = КаталогВременныхФайлов() + "tempParser";
    СоздатьКаталог(ВремКаталог);
    УдалитьФайлы(ВремКаталог,"*.*");
    
    ИмяВыходногоФайла = "" + ВремКаталог + "\answer.html";
    ИмяФайлаОтправки = "" + ВремКаталог + "\request.html";
    
    // Подготовить файл для POST запроса
    POSTПараметры = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.UTF8,, Истина, Символы.ПС);
    POSTПараметры.Записать("user_name=" + Логин + "&user_password=" + Пароль + "&action=do_enter");
    POSTПараметры.Закрыть();

    // Определить заголовки POST, используя алгоритм "application/x-www-form-urlencoded"
    POSTЗаголовки = Новый Соответствие();
    POSTЗаголовки.Вставить("POST "+АдресСтраницыАвторизации+" HTTP/1.1");
    POSTЗаголовки.Вставить("Host", АдресСервера);
    POSTЗаголовки.Вставить("Referer", "http://";+АдресСервера);
    POSTЗаголовки.Вставить("Connection", "keep-alive");
    POSTЗаголовки.Вставить("Content-Type", "application/x-www-form-urlencoded");

    // Отправляем POST запрос
    Попытка
        ОтветHTTP = Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, АдресСтраницыАвторизации, ИмяВыходногоФайла, POSTЗаголовки);
    Исключение
        Сообщить("Неудачная попытка соединения с " + АдресСервера + ": " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;
    
    // Получим ресурс на который нас перебросил сервер
    Если ОтветHTTP.КодСостояния = 302 Тогда
        АдресСтраницы = ОтветHTTP.Заголовки["Location"];
    КонецЕсли;
    
    // Определить заголовки GET, с куками полученными от сервера
    GETЗаголовки = Новый Соответствие();
    GETЗаголовки.Вставить("Cookie", ОтветHTTP.Заголовки["Set-Cookie"]);
    GETЗаголовки.Вставить("Connection", "keep-alive");
    
    // Получаем страницу, указывая куки
    ОтветHTTP = Соединение.Получить(АдресСтраницыРассылки, ИмяВыходногоФайла, GETЗаголовки);
Независимо от того, куда вы едете — это в гору и против ветра!