Скриптом залогиниться в медиасервисе
Год назад написал 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") Нужно сначала получить 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]);И всё работало чётко... Спасибо! |
Часовой пояс GMT +3, время: 16:26. |