Автоматическая авторизация в MaxDSL через PHP-скрипт, Internet – MoldTelecom
Наверное многим пользователям Internet-провайдера MoldTelecom (Молдова, Кишинев) пакета MaxDSL надоела эта надоедливая картинка:
Каждый раз, когда я включаю свой компьютер и пытаюсь зайти в Internet, выскакивает страница с формой авторизации. Честно говоря, мне это поднадоело и я решил автоматизировать процесс авторизации и включения Интернет-сервиса.
Некоторые просто сохраняют данные полей, но меня и такой способ не устраивает. Мне хотелось бы удаленно включать компьютер, и чтобы он автоматически выходил в Internet без участия человека.
Где-то в просторах Internet я уже встречал похожий скрипт, который был написан на PERL. Но для рядовых пользователей PHP гораздо легче воспринимается, да и информации полно.
Для отсылки Логина и Пароля я использую библиотеку CURL и для удобства его использования, я создал класс для работы с CURL по отсылке POST и GET данных. Возможно кому-то он пригодится.
Не забудьте проверить, у вас должна быть подключена библиотека CURL. (раскомментировать «;extension=php_curl.dll» в php.ini).
Вот собственно сам PHP-код:
<?php
error_reporting(5);
set_time_limit(30);
$username = 'c12345678';
$password = '123321';
$base_url = 'http://86.106.213.186:8080/';
$user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
//$_SERVER['HTTP_USER_AGENT']
function set_log($str = '') {
$f = fopen('log.txt', 'a+');
fwrite($f, $str."\r\n");
fclose($f);
echo $str . '</br>';
}
function parsePHPConfig() {
ob_start();
phpinfo(1);
$s = ob_get_contents();
ob_end_clean();
$a = $mtc = array();
if (preg_match_all('/(.*?)<\/td>(.*?)<\/td>(:?(.*?)<\/td>)?<\/tr>/', $s, $mtc, PREG_SET_ORDER))
foreach($mtc as $v){
if($v[2] == 'no value') continue;
$a[trim($v[1])] = $v[2];
}
return $a;
}
if (!extension_loaded('curl')) {
$phpconf = parsePHPConfig();
$str = 'Ошибка! Не загружен модуль "CURL" для PHP.
Откройте файл "'.$phpconf['Configuration File (php.ini) Path'].'" , раскоментируйте строчку "extension=php_curl.dll" (Win32) или "extension=php_curl.so" (Linux/Unix).
Перезапустите Apache Server и проверьте снова.';
set_log($str);
echo $str . 'Загруженные библиотеки:';
print_r(get_loaded_extensions());
exit;
}
class CURL {
var $callback = false;
function setCallback($func_name)
{
$this->callback = $func_name;
}
function doRequest($method, $url, $vars, $timeout = 10)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
if ($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
}
$data = curl_exec($ch);
curl_close($ch);
if ($data) {
if ($this->callback)
{
$callback = $this->callback;
$this->callback = false;
return call_user_func($callback, $data);
} else {
return $data;
}
} else {
return curl_error($ch);
}
}
function get($url, $timeout = 10)
{
return $this->doRequest('GET', $url, 'NULL', $timeout);
}
function post($url, $vars, $timeout = 10)
{
return $this->doRequest('POST', $url, $vars, $timeout);
}
}
set_log('--- '.date('Y-m-d [H:i:s]').' Запуск скрипта ---');
$url_connect = $base_url . 'home';
$a = new CURL();
$html = $a->get($url_connect, 15);
//$r = file_get_contents($url); echo $f;
if(!$html) {
set_log('Ошибка: Нет соединения с '. $url_connect);
exit;
}
if(strstr($html, 'authenticateForm')) {
set_log('Идет авторизация Вашего аккаунта');
$params = 'username='.$username.'&password='.$password;
$res = $a->post($url,$params);
if(strstr($res, 'authenticateForm')) {
set_log('Ошибка: Неверный Логин или Пароль!');
exit;
}
}
else set_log('Авторизация активна');
if(strstr($html, 'serviceOff.gif')) {
set_log('Соединение не активно');
$res = $a->get($base_url . 'serviceStart/refresh/home?service=PrDSL1&group=2');
set_log('Идет активация соединения');
} else set_log('Соединение было активно');
$stat = $a->get($base_url . 'status');
if(strstr($stat, 'Connected')) {
set_log('Соединение успешно установлено');
$rule = '~(.*?)<\/td>\s(.*?)<\/td>\s<\/td>\s
\s<div>(.*)<\/div>\s<\/td>\s<div>(.*)<\/div><\/td>\s
<div>(.*)<\/div><\/td>~siU';
$matches = array();
preg_match($rule, $stat, $matches);
//print_r($matches);
$serv_name = $matches[1];
$status = $matches[2];
$time = $matches[3];
$download = round(str_replace(',', '', $matches[4])/(1024*1024), 2);
$upload = round(str_replace(',', '', $matches[5])/(1024*1024), 2);
set_log('Название сервиса: '.$serv_name);
set_log('Время on-line: '.$time);
set_log('Download: '. $download. ' Mb , Upload: '.$upload .' Mb');
} else set_log('Соединение не установлено');
set_log('');
?>
Скачать PHP-скрипт в виде ZIP-архива
Скрипт можно добавить в планировщик заданий и запускать из командной строки. Либо другими способами запуска php – скрипта на локальном компьютере (CRON).
При каждом запуске скрипта, ведется подробный LOG, в котором пишется и информация о статусе, а также размер Upload и Download трафика:
--- 2008-04-22 [00:19:48] Запуск скрипта ---
Авторизация активна
Соединение было активно
Соединение успешно установлено
Название сервиса: MaxDSL Eco (512/512 kbps) gratuit
Время on-line: 04:41:03
Download: 16.1 Mb , Upload: 45.92 Mb
Если будут какие-нибудь идеи или доработки, обращайтесь!
Читайте ещё похожие статьи на этом сайте:
- MoldTelecom – реклама MaxDSL, не смейтесь :)
- 6 способов сломать Internet Explorer
- PHP функция для конвертирования размеров файла (*KB, *MB, *GB)
- PHP дробная часть числа
- Как установить и получить cookie на JavaScript?
Если Вам понравилась эта статья, пожалуйста оставьте свой комментарий или подпишитесь на RSS-канал и получайте в будущем статьи на RSS Reader.



Статья супер! У меня данной проблемы нет (starnet), но в качестве пособия по curl – очень понятно и подробно написано.
Да и в правду очень полезная статья. Был клиентом молдтелекома – года 1.5 … ну очень надоела постоянная необходимость авторизации
а можно и в модем логин данные вбить – вместо бридж соединения выбирается PPPoE – при этом обязательно надо удалить предыдущее подключение, т.к. будет перекрывать
Нужно попробовать, спасибо за совет Endi
… просто помнится, раньше скрипт использовали для переключения на ночную скорость, которая была больше, чем дневная. Т.к. сейчас в этом нет необходимости, лучше использовать более продвинутые способы авторизации.
А вот у меня MaxDslEco и PPPoE (Как я недавно узнал) отключен.
Обязательно попробую данный скрипт.
Сам хотел написать такой – да всё времени не находил на это.
Сеня, с тех пор поменялись пакеты MaxDSL, возможно чуть изменился контент страницы и для правильного распознавания данных регулярными выражениями, нужно подправить и скрипт.
2 Endi: Позвольте полюбопытствовать, как же вбить эти настройки в АДСЛ рутер так, чтоб заработало. У меня вариантов мало, и то что есть не дало результатов.
2 Bobo: а он и не заработает, если у вас пакет MaxDSL Eco. Я сам пытался сделать то, что посоветовал Endi и не вышло. Я позвонил провайдеру, и мне объяснили, что данная услуга доступна лишь пакетам с постоянным IP-адресом. Дальше я не стал интересоваться.
Наверное можно доплатить и получить постоянный IP адрес.
2 PitBult:
Спасибо за ответ. Наверное, так оно и есть. Я не звонил, не интересовался. Всё равно хочу уйти с молдтелекома. Не знаю, как с Вокснет будет. Услуги мтк меня не совсем устраивают…
Если хочется подключить 2 компьютера дома через АДСЛ рутер надо доплачивать, а при Еко пакете на 2 компьютера уже дорого при том что качество так себе…
2 Bobo:
Почему это нужно доплачивать за 2-ой компьютер? И зачем? У меня у самого 2 компютера, я могу хоть 10 поставить. Просто ADSL модем нужно поставить в режим Рутера, а не Бриджа и включить в свитч. Делается локальная сеть и вперед.
Не могу в клучить в ентернет и в клучить его в избраное
можещь обьяснить как мне все это на ubuntu поставить. плззз
Вот скрипт на WSH, сам пользуюсь для Nano – работает на ура.
1. копируем скрипт куда угодно
2. запускаем скрипт с параметром -install (добавляется в список автозагрузки текущего пользователя), через пробел логин и пароль для записи и хранения их в реестре а не в теле скрипта. Пример (диск:\MTCLogin.wsf -install username password)
3. файл скрипта не удаляем и не переносим в другое место (в ином случае повторяем шаг 2)
3. открываем скрипт и в разделе настройки правим под себя(у кого не Nano)
4. готово (запускаем скрипт)
6. чтоб снести из автозагрузки запускаем скрипт с параметром -uninstall
/****** Настройки ******/
var username = «»; //логин
var password = «»; //пароль
//если при перезапуске подключения не подключится попробуйте увеличить этот параметр (миллисекунды),(Evgenii): только для запуска интернета достаточно значения 1000
var sleepAfterLogout = 1000;
//сервисы пакета (по умолчанию MaxDSL Eco), (Evgenii): если оставить пустое – то только подключение к услуге
var service1 = «»;
var service2 = «»;
/***********************/
function InstallScript()
{
var WshShell = WScript.CreateObject(«WScript.Shell»);
WshShell.RegWrite(«HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\MTCLogin», WScript.ScriptFullName, «REG_SZ»);
WshShell.RegWrite(«HKLM\\Software\\Maxdsl\\»,»"); //(Evgenii): Созданее раздела реестра
WshShell.RegWrite(«HKLM\\Software\\Maxdsl\\user», username);
WshShell.RegWrite(«HKLM\\Software\\Maxdsl\\pass», password);
WScript.Echo(«Скрипт установлен.»);
WScript.Quit();
}
function UninstallScript()
{
var WshShell = WScript.CreateObject(«WScript.Shell»);
try
{
WshShell.RegDelete(«HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\MTCLogin»);
WshShell.RegDelete(«HKLM\\Software\\Maxdsl\\»); //(Evgenii): Удаление раздела с лоином и паролем.
}
catch(e)
{}
WScript.Echo(«Скрипт демонтирован.»);
WScript.Quit();
}
function ConnectToMaxDSL()
{
/************13.11.2008 (Evgenii)/
var WS=WScript.CreateObject(«WScript.Shell»);
username= WS.RegRead(«HKLM\\Software\\Maxdsl\\user»);
password= WS.RegRead(«HKLM\\Software\\Maxdsl\\pass»);
/**/
//var HttpReq = new ActiveXObject(«Microsoft.XMLHTTP»);
//HttpReq.open(«POST», «http://86.106.213.186:8080/accountLogoff/home», false);
//HttpReq.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
//HttpReq.send(«confirmed=true&submitButton=OK»);
/**************************/
WScript.Sleep(sleepAfterLogout);
HttpReq = new ActiveXObject(«Microsoft.XMLHTTP»);
HttpReq.open(«POST», «http://86.106.213.186:8080/user/refresh/home?confirmed=true&submitButton=OK», false);
HttpReq.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
HttpReq.send(«username=»+username+»&password=»+password);
if(HttpReq.status!=200)
{
WScript.Echo(«Ошибка подключения к услуге MaxDSL.»);
return;
}
if(service1!=»")
{
HttpReq = new ActiveXObject(«Microsoft.XMLHTTP»);
HttpReq.open(«POST», service1, false);
HttpReq.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
HttpReq.send(null);
if(HttpReq.status!=200)
{
//WScript.Echo(«Ошибка подключения к услуге MaxDSL.»);
return;
}
}
if(service2!=»")
{
HttpReq = new ActiveXObject(«Microsoft.XMLHTTP»);
HttpReq.open(«POST», service2, false);
HttpReq.setRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);
HttpReq.send(null);
if(HttpReq.status!=200)
{
//WScript.Echo(«Ошибка подключения к услуге MaxDSL.»);
return;
}
}
WScript.Echo(«Подключение к услуге MaxDSL успешно установлено.»);
}
scriptArgs = WScript.Arguments;
for (i = 0; i < scriptArgs.length; i++)
{
if(scriptArgs(i)==»-install»)
{
username= scriptArgs(1); //(Evgenii): Логин из командной строки.
password= scriptArgs(2); //(Evgenii): Пароль из командной строки.
InstallScript();
}
if(scriptArgs(i)==»-uninstall»)
UninstallScript();
}
ConnectToMaxDSL();
если действительно была цель автологина, то автор – извращенец
А может кто-нить переписать этот скрипт на перл, оочень нужно….
Max DSL derimo postoiano propodaet sviazi [цензура]
«»Некоторые просто сохраняют данные полей, но меня и такой способ не устраивает.»"
как это можно зделать?
а как узнать пароль у меня есть логин
в коде не силен, после запуска php-скрипта выдает
— 2009-12-29 [11:23:23] Запуск скрипта —Идет авторизация Вашего аккаунтаСоединение было активноСоединение не установлено
после запуска wsh скрипта выдает
невкрная ссылка на объект (97,16) вот этот фрагмент кода (а именно символ «<" )
or (i = 0; i < scriptArgs.length; i++)
salutari la toti din jur
Вот менее обьемный скрипт на bash с использованием curl:
#!/bin/bash
username=xxxxxxxx
password=4444
auth_srv=86.106.213.98:8080
curl -d «username=$username&password=$password» «http://$auth_srv/user/refresh/home?confirmed=true&submitButton=OK»
Да, чувак, спасибо. По курл – это неплохой пример