Год назад написал 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]);
И всё работало чётко...
Спасибо!