Страница 1 из 2

Считалка трафика

СообщениеДобавлено: 01 дек 2006 20:30
Вася Триллер
Дело было вечером, делать мне было нечего.
Нет, сабж - не программа. Это всего лишь скрипт. Написан он потому, что на https://np.stat.pike/s/trafs.shtml и других подобных статистических ресурсах Корвета нет пункта "Сумма"/"Итог"/"Всего"/... (или у кого-то всё-таки есть? :))
Так вот. Этот скрипт считает, сколько всего трафика натикало во все стороны. Пока не может самостоятельно брать с сервера данные - их надо вносить в скрипт вручную.
Вот код
Код: Выделить всё
<?php
//error_reporting(E_ERROR|E_WARNING);
$s = 'вместо этого текста сюда нужно скопировать часть таблицы БЕЗ ШАПКИ';
$s = preg_replace('#месяц 200[0-9]-[01][0-9]#is','',$s);
$s = preg_replace('#сутки 200[0-9]-[01][0-9]-[0-3][0-9]#is','',$s);
$s = str_replace('   ',' ',$s);
$s = str_replace("\n",' ',$s);
$s = str_replace("\r",' ',$s);
do {
  $s = str_replace('  ',' ',$s);
} while(strpos($s,'  ')!==false);
$s = trim($s);
$s = str_replace(' ','+',$s);
$s = str_replace('+.','+0.',$s);
if($s[0]=='.'){
  $s = '0'.$s;
}
eval('$t = '.$s.';');
echo $t." MiB, or\n";
echo ($t/1024)." GiB, or\n";
echo ($t/1048576)." TiB\n";
?>

Сохраняем под названием bla-bla-bla.php и запускаем в консоли (php путь/bla.php) или открываем в браузере через сервер с PHP. В итоге получаем кол-во трафика :)

СообщениеДобавлено: 02 дек 2006 14:45
Shurik
Что мешает тянуть с сайта? ;)

СообщениеДобавлено: 02 дек 2006 15:07
RелаXатоR
кстати, попытался все это дело еще летом в excel посчитать- не считает сцукО!!!

PS страница статистик INTS не работает=((

СообщениеДобавлено: 02 дек 2006 15:37
Вася Триллер
Shurik писал(а):Что мешает тянуть с сайта? ;)

Великий дядя Лень =)

СообщениеДобавлено: 02 дек 2006 15:52
Ivan.Rybin
RелаXатоR писал(а):PS страница статистик INTS не работает=((


https://10.102.45.194/s/trafs.shtml - работает

СообщениеДобавлено: 02 дек 2006 18:35
Вася Триллер
Для любителей реалтайм-данных выкладываю следующий скрипт. Выводит некоторые суммарные данные (типа трафика в обе стороны). Работает только со помесячной статистикой (посуточная просто игнорируется).
Если есть какие-то идей - не стесняйтесь выкладывать =)
Поменять нужно всего лишь 2-4 строчки для каждого конкретного юзера.
Код: Выделить всё
<?php
//error_reporting(E_ERROR|E_WARNING);
header('Content-type: text/html; charset=koi8-r');
/***********************/
$user = '****'; //логин
$pass = '**********'; //пароль
$ip = 'summary'; //IP, для которого берём статистику. Если нужно для всех - пишем summary
$host = '***.stat.pike'; //сервер статистики. указывается БЕЗ https:// и пути после слеша (да и слеш не нужен)
/***********************/
$req  = "GET /s/".($ip=='summary'?'trafs.shtml':'trafi.shtml?ip='.$ip)." HTTP/1.0\r\n";
$req .= "Host: $host\r\n";
$req .= "Accept: text/html, */*\r\n";
$req .= "User-Agent: Total traffic counter (by 10.107.53.79)/1.0\r\n";
$req .= "Authorization: Basic ".base64_encode($user.':'.$pass)."\r\n\r\n";


$fs = fsockopen('ssl://'.$host,443);
if(!$fs){
  die("error\n");
}
fwrite($fs,$req);
$res = "";
while (!feof($fs)){
  $res .= fgets($fs,2048);
}
fclose($fs);

$res = explode("\r\n\r\n",$res);
array_shift($res);
$res = implode("\r\n\r\n",$res);

$res = preg_replace('#<head>(.*?)</head>#is','',$res);
$res = preg_replace('#<h[12]>(.*?)</h[12]>#is','',$res);
$res = preg_replace('#<hr>(.*?)</body>#is','',$res);
$res = preg_replace('#<body (.*?)>#is','',$res);
$res = str_replace('<html>','',$res);
$res = str_replace('</html>','',$res);
$res = str_replace('<br>',' ',$res);
$res = preg_replace('#<!(.*?)>#is','',$res);
$res = preg_replace('#<code>(.*?)</code>#is','\\1',$res);
$res = preg_replace('#<td align=right>(.*?)</td>#ies','"<td>".trim("\\1")."</td>"',$res);
$res = preg_replace('#<([^>]*?)table([^<]*?)>#is','',$res);
$res = str_replace('<td align=left>','<td>',$res);
$res = preg_replace('#<th(.*?)>(.*?)</th>#is','',$res);
$res = preg_replace('#<tr>(.*?)</tr>#ies','trim("\\1")==""?"":"<tr>\\1</tr>"',$res);
$res = preg_replace('#<tr>      <td>сутки(.*?)</td>(.*?)</tr>#is','',$res);
$res = str_replace("\n",'',$res);
$res = str_replace("\r",'',$res);
$res = str_replace('</tr>',"</tr>\n",$res);
$res = preg_replace('#<tr>([^<]*?)<td>#is','<tr><td>',$res);
$res = preg_replace('#</td>([^<]*?)<td>#is','</td><td>',$res);
$res = preg_replace('#</td>([^<]*?)</tr>#is','</td></tr>',$res);


$res = explode("\n",$res);
$i=0;
foreach($res as $val){
  $val = trim(preg_replace('#<tr><td>месяц([^<]*?)#is','\\1',$val));
  $val = preg_replace('#</td><td>([^<]*?)</td></tr>#is','',$val);
  if(!empty($val)){
    $r[$i] = explode('</td><td>',$val);
    $i++;
  }
}

echo 'Все цифры приведены в Мб (MiB)';
echo '<table border="1">';
echo '<tr><th rowspan="2">Интервал, месяц</th><th colspan="3">Локальный трафик</th><th colspan="3">Российский трафик</th><th colspan="3">Зарубежный трафик</th><th rowspan="2">Всего</th></tr>';
echo '<tr><th>входящий</th> <th>исходящий</th> <th>всего</th> <th>входящий</th> <th>исходящий</th> <th>всего</th> <th>входящий</th> <th>исходящий</th> <th>всего</th></tr>';
foreach($r as $k=>$v){
  echo '<tr>';
  echo '<td>'.$r[$k][0].'</td>';
  echo '<td>'.$r[$k][1].'</td>';
  echo '<td>'.$r[$k][2].'</td>';
  echo '<td>'.($r[$k][1]+$r[$k][2]).'</td>';
  echo '<td>'.$r[$k][3].'</td>';
  echo '<td>'.$r[$k][4].'</td>';
  echo '<td>'.($r[$k][3]+$r[$k][4]).'</td>';
  echo '<td>'.$r[$k][5].'</td>';
  echo '<td>'.$r[$k][6].'</td>';
  echo '<td>'.($r[$k][5]+$r[$k][6]).'</td>';
  echo '<td>'.($r[$k][1]+$r[$k][2]+$r[$k][3]+$r[$k][4]+$r[$k][5]+$r[$k][6]).'</td>';
  echo '</tr>';
}
$t[1] = 0;
$t[2] = 0;
$t[3] = 0;
$t[4] = 0;
$t[5] = 0;
$t[6] = 0;
foreach($r as $k=>$v){
  $t[1] += $r[$k][1];
  $t[2] += $r[$k][2];
  $t[3] += $r[$k][3];
  $t[4] += $r[$k][4];
  $t[5] += $r[$k][5];
  $t[6] += $r[$k][6];
}
echo '<tr><td>Всего</td>';
echo '<td>'.$t[1].'</td>';
echo '<td>'.$t[2].'</td>';
echo '<td>'.($t[1]+$t[2]).'</td>';
echo '<td>'.$t[3].'</td>';
echo '<td>'.$t[4].'</td>';
echo '<td>'.($t[3]+$t[4]).'</td>';
echo '<td>'.$t[5].'</td>';
echo '<td>'.$t[6].'</td>';
echo '<td>'.($t[5]+$t[6]).'</td>';
echo '<td>'.($t[1]+$t[2]+$t[3]+$t[4]+$t[5]+$t[6]).'</td>';
echo '</tr>';
echo '</table>';
?>

СообщениеДобавлено: 02 дек 2006 18:58
Sokol
Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://ostrov.stat.pike:443

СообщениеДобавлено: 02 дек 2006 19:07
Вася Триллер
МЕДВЕД писал(а):Warning: fsockopen() [function.fsockopen]: unable to connect to ssl://ostrov.stat.pike:443

Или адрес неправильный, или в настройках PHP косяк =)
Отключи safe_mode, если таковой включен, и попробуй вместо ostrov.stat.pike заюзать его IP

СообщениеДобавлено: 02 дек 2006 19:10
Вася Триллер
Да, и ещё - поскольку эти ресурсы доступны только из Корвета, не надо тестировать скрипт на хостинге в инете (jino-net.ru for example) - он там никогда не заработает =).

СообщениеДобавлено: 02 дек 2006 19:40
Ivan.Rybin
МЕДВЕД писал(а):ssl://ostrov.stat.pike:443


а чё это за протокол такой, SSL? :-) - https там должно быть

СообщениеДобавлено: 02 дек 2006 19:41
Ivan.Rybin
Ну закиньте куда-нить на big-bossa - пущай будет форма с вводом данных на свой аккаунт и после логина бы выводила статистику

СообщениеДобавлено: 02 дек 2006 19:54
Вася Триллер
ivan s. rybin писал(а):
МЕДВЕД писал(а):ssl://ostrov.stat.pike:443


а чё это за протокол такой, SSL? :-) - https там должно быть

Префикс ssl:// указывает, что нужно использовать шифрование, https:// напрямую заюзать нельзя. Курим маны: http://php.net/fsockopen

Ну закиньте куда-нить на big-bossa

Вопрос: куда конкертно? =) Заводить хостинг ради слегка улучшенной статистики как-то не хочется... =)

СообщениеДобавлено: 02 дек 2006 20:53
Shurik
Насколько я понимаю, статистика привязана к IP клиента, так что облом ;)

СообщениеДобавлено: 02 дек 2006 20:57
Ivan.Rybin
ну тогда - да, хотя если скрипт будет брать IP у обращающегося к нему и передавать его серверу статистики как "свой" - то должно работать.

СообщениеДобавлено: 03 дек 2006 00:24
Shurik
Ты меня не понял. Эта ссылка безо всякой авторизации подставляет твои данные: https://stat.npnet.pike/order.shtml