Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.04.2016, 22:13
Аватар для Paguo-86PK
Профессор
Отправить личное сообщение для Paguo-86PK Посмотреть профиль Найти все сообщения от Paguo-86PK
 
Регистрация: 16.09.2009
Сообщений: 253

Скриптом залогиниться в медиасервисе
Год назад написал cmd/bat утилитку, которая записывает телепередачу один раз в неделю. И она работала, пока сайт не обновлял движок. Пока обновляли, несколько раз менять мне пришлось регулярки для извлечения ссылки на поток. А вот теперь, чтобы просматривать что-либо, обязательно нужно залогиниться. Ну, я зарегистрировался - всё работает...
А вот оказалось, что за все эти годы так и не научился (никогда не стояла задача) логиниться из-под сценария...

Вот фрагмент (форма логина) сайта
<form id="login-form" class="form-inline" action="/login" method="post">
<input type="hidden" name="_csrf" value="R0NtNndjUHcBbh9gJ1sIGQ8yHQYxVRc6NikdACQ8YBkBCFlsPw9hLg==">
                    <div class="form-group field-loginform-username required">
<div class="col-lg-offset-1"><input type="text" id="loginform-username" class="form-control authLines" name="LoginForm[username]" placeholder="Введите логин"></div>
</div><div class="form-group field-loginform-password required">
<div class="col-lg-offset-1"><input type="password" id="loginform-password" class="form-control authLines" name="LoginForm[password]" placeholder="Введите пароль"></div>
</div>
                    <div class="form-group">
                        <div class="col-lg-1 col-lg-11">
                            <button type="submit" class="btn btn-primary" name="login-button">Войти</button>                        </div>
                    </div>

                    <div class="form-group">
                        <div class="col-lg-1 col-lg-11">
                            <a class="btn btn-primary" name="register-button" href="/users/signup">Зарегистрироваться</a>                        </div>
                    </div>

                    </form>

Вот кусок моего cmd-скрипта:
@if (@a==@b) @end /*
@echo off
setlocal EnableDelayedExpansion
cls & echo * Internet Television *
set Link=http://live.tv/
set User=paguo-86pk
set Pass=0p3n-p4s5w0rd
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%Link% %User% %Pass%"') do (
    <nul set/P z=:
)
goto :EOF
JScript */
var http = WSH.Arguments(0).split(" ")[0];
var user = WSH.Arguments(0).split(" ")[1];
var pass = WSH.Arguments(0).split(" ")[2];
var ie, body;

// Создаём объект браузера
ie = WScript.CreateObject("InternetExplorer.Application");
ie.Navigate("about:blank");
body = ie.document.getElementsByTagName("body")[0];

// Создаём объект запросов
var x = new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET", http, true, user, pass);
x.setRequestHeader("User-Agent", "XMLHTTP/1.0"); x.send("");
while(x.readyState != 4)
    WSH.Sleep(50);

// Получаем идентификатор сессии
var csrf = x.responseText.match(/_csrf.+="(.+==)/)[1];

// Имитируем отправку формы с логином/паролем
x.open("POST", http + "login");

var Post = ["LoginForm[username]=" + encodeURIComponent(user),
            "LoginForm[password]=" + encodeURIComponent(pass),
            "_csrf=" + encodeURIComponent(csrf)];
x.send(Post.join("&"));
while(x.readyState != 4)
    WSH.Sleep(50);

// Заполняем поля входа на сайт для наглядности
var s = x.responseText.replace(/(username.")/gm, "$1 value='" + user + "'");
s = s.replace(/(password.")/gm, "$1 value='" + pass + "'");
body.innerHTML = s;
while(ie.Busy || ie.ReadyState != 4) {
    WScript.sleep(10);
}

// Отображаем сайт на экране
ie.Visible = 1;
while (!ie.Busy)
    WScript.sleep(10);
ie.Quit();
Я так понимаю, что нужно передать типа
Код:
ax.open("POST", "http://live.tv/РенТВ?_csrf=552877edb3c85d52ad93e4b97b273aa5bd23d6cf63f01ece77e11330314fd035a%3A2%3A%7Bi%3A0%3Bs%3A5%3A%22_csrf%22%3Bi%3A1%3Bs%3A32%3A%22F-rVP8XnHqp0F6GMqjp6S_0nFK4ZHl1Y%22%3B%7D&LoginForm[username]=paguo-86pk&LoginForm[password]=0p3n-p4s5w0rd")
Не работает Выдаёт ошибку 400...

Нужно сначала получить csrf, потом сформировать вход с логином/пассом, а потом получу тело с ссылками на поток - три запроса отработать надо. Или можно сразу как-то cookies сформировать, узнав лишь csrf и перекодируя чем?
Раньше код был таким
var x = new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET", WSH.Arguments(0), true);
x.setRequestHeader("User-Agent", "XMLHTTP/1.0");
x.send("");
while(x.readyState != 4)
    WSH.Sleep(50);
var s = x.responseText;
WSH.Echo(s.match(/var showFile = '([^']+)'/)[1]);
И всё работало чётко...

Спасибо!

Последний раз редактировалось Paguo-86PK, 24.04.2016 в 22:06.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск