Добрый день, уважаемые читатели!
Этот пост, совмещенный с вопросом, посвящен попытке сделать работу с бесплатными WiFi удобной.
Пост написан про определенную сеть, но при простом допиле сгодится почти для всех. Во избежание проклятий скажу, что в JS не смыслю почти ничего.
Предыстория
Как вы знаете, сейчас очень распространен в кофейнях, ТЦ и т.п. бесплатный вайфай. У большинства из них схожие методы работы, но тут я буду говорить про одно конкретное место. Там работа идет внутри сессии размером 30 минут и ~50МБ. Если активной сессии нет, то любая попытка загрузить внешний сайт автоматически редиректится на страницу регистрации сессии (.../status.php). На ней кнопка «Продолжить работу в интернет», переводящая, в свою очередь, на www.@CompanyName@.ru. Более того, редирект на эту страницу автоматически идет через 10 секунд после загрузки.
В итоге без дополнительного шаманства загрузить средствами браузера файл >30МБ — большая удача, >50МБ в принципе невозможно. Плюс порой сессия обрывается в процессе написания текста, а последующий редирект вынуждает переписывать текст заново, что порой крайне бесит.
Проблема решалась написанием простенького локального html-файла, перезагружающегося раз в 10 секунд и пытающегося в iframe загрузить что-нибудь извне.
<BODY>
<META HTTP-EQUIV="Refresh" Content="15">
<IFRAME src="http://www.ya.ru" width=1024 height=768 scrolling="auto" frameborder="0" id="ifram">_</IFRAME>
</BODY>
В результате по окончании сессии новая регистрировалась в течение 10 секунд, количество ложных редиректов упало почти до нуля, а отличия бесплатного интернета от домашнего свелись лишь к блокировке торрентов.
И всё бы было ничего, если бы в один прекрасный день провайдер не изменил правила регистрации сессии. Раньше сессия регистрировалась при любой загрузке http:://.../status.php. Теперь же на этой странице появилась форма с чекбоксом и словами о совершеннолетии. При отжатом чекбоксе вместо желтой кнопки мы получали серую некликабельную картинку, при нажатом кнопка возвращалась. Старый файл, естественно, не работал, регистрация теперь проходит при нажатии на кнопку.
<form action="https://.../status" method="POST" name="non_reg">
<input type=hidden name=lang value='ru'>
<input type=hidden name=screen value='normal'>
<input type="hidden" name=url value=''>
<input type="hidden" name="mode" value="partner">
<script>
//здесь функции для обработки checkbox'а. Скрывает btncontinue_g и показывает btncontinue или наоборот.
</script>
<p><input type="checkbox" onclick="checkSubmitBtn(this.checked)">Мне уже исполнилось 18 лет</p>
<img id="btncontinue_g" src="/i/v6/b_continue_g_r.gif" alt="Продолжить работу в Интернет"/>
<input id="btncontinue" style="display:none" type=image src="/i/v6/b_continue_r.gif" alt="Продолжить работу в Интернет"/>
</form>
Посмотрев код да понажимав кнопку я узнал три новости. Хорошая — для регистрации нужно всего лишь законфирмить форму, которая при этом не передает значение чекбокса. Плохая — method=«POST», значит, простой запрос ../status.php?mode=partner… не прокактит. И забавная — после нажатия на кнопку происходят аж три редиректа, от двух из которых можно было бы и избавиться.
Ну и, соответственно, решение: делаем такую же форму с таргетом в фрейм и при загрузке страницы говорим confirm(). На это, правда, у меня ушел час, плюс в какое-то время мне нужны были два файла, но в итоге получилось
<HEAD>
<script>
function refreshIFrame() {
document.getElementById("olol").submit();
}
</script>
<TITLE>Refreshing</TITLE>
</HEAD>
<BODY onload="{refreshIFrame();}">
<META HTTP-EQUIV="Refresh" Content="15">
text<br>
<IFRAME name="ifra" src="" width=100 height=100 scrolling="auto" frameborder="0" id="ifram" onLoad="">а—аДаЕб?б? аОаБаНаОаВаЛаЕаНаИаЕ </IFRAME><br>б…б?аЙ<br>
<FORM id="olol" NAME="s" METHOD="post" ACTION="https://startwifi.beeline.ru/status" target="ifra">
<input name="lang" value="ru" type="hidden">
<input name="screen" value="normal" type="hidden">
<input name="url" value="" type="hidden">
<input name="mode" value="partner" type="hidden">
</FORM>
</BODY>
И — вуаля! — всё вновь заработало.
Ну и вопрос — можно ли послать серверу POST-запрос без формы?
Автор: gous32