Выбрал Delphi - лучше знаю и писать не напряжно.
Так как URFA-клиент мне не по карману, в качестве инструмента доступа к ядру билинга выбрал веб-морду утм.
Что сделано:
Написан класс для работы с веб-мордой. Для экономия времени на парсинг, снижения нагрузки на апач и экономию трафика переработаны basic.xslt и *.xml до состояния при котором ответы апача выглядят примерно так:
Код: Выделить всё
<TD>M_ID</TD>
<TD>1</TD>
</TR><TR>
<TD>M_LOGIN</TD>
<TD>kayfolom</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT</TD>
<TD>1</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT_BALANCE</TD>
<TD>-7343.42</TD>
</TR><TR>
<TD>M_BASIC_ACCOUNT_CREDIT</TD>
<TD>10000.00</TD>
</TR>
Клас умеет все то что умеет веб-интерфейс билинга. Секция public выглядит вот так:
Код: Выделить всё
public
{ Public declarations }
Login : String;
Password : String;
ConnectError : String;
WebSessionTimeout : Integer;
HTTPURL : String;
HTTPPort : Integer;
RefreshPeriod : Integer;
Busy : Boolean;
LogFile : String;
LogRotate : Boolean;
DebugLevel : Integer;
Constructor Create;
Destructor Destroy;
Function Connect : Boolean;
Function Ping(Reconnect : Boolean) : Integer;
Function CheckOnline : Boolean;
Function GetUser_Reports : String;
Function GetUserReportsInfo : TUserReport;
Function GetInternetStatus : Boolean;
Function SetIntetnetInvert : Boolean;
Function GetBalanceByAccountsCount : Integer;
Function GetBalanceByAccounts(Index : Integer) : TBalanceByAccounts;
Function GetServicesCount : Integer;
Function GetService(Index : Integer) : TService;
Function GetServiceLink(Index : Integer) : String;
Function GetServiceInfo(Link : String) : String;
Function GetServiceInfoDownloadedCount : Integer;
Function GetServiceInfoDownloaded(Index : Integer) : TServiceInfoDownloaded;
Function GetServicesInfoIPCount : Integer;
Function GetServiceInfoIP(Index : Integer) : String;
Function GetServicesInfoBorderCount : Integer;
Function GetServiceInfoBorder(Index : Integer) : TBorderTraficClass;
Function GetServicesInfoPrepaidCount : Integer;
Function GetServiceInfoPrepaid(Index : Integer) : TTraficClassCount;
Function GetPayments(DateStart, DateEnd : TDateTime) : Integer;
Function GetPayment(Index : Integer) : TPayments;
Function GetMessages(DateStart, DateEnd : TDateTime) : Integer;
Function GetMessage(Index : Integer) : TMessage;
Function GetTrafficReportCount(DateStart, DateEnd : TDateTime) : Integer;
Function GetTrafficReport(Index : Integer) : TTrafficReport;
Function PaymentCard(Account, Card_Number, Card_PIN : String) : TPaymentResult;
Function SentMessage(Subject,MessageText : String) : Boolean;
Function ChangePassword(NewPassword,OldPassword : String) : Boolean;
Procedure Log(Msg : String);
end;
Логика работы утилиты следующая:
При запуске утилита читает свои настройки из рееста (логин и пароль если есть, MainURL (пишеться в реестр при инсталяции)).
В месте куда указывает MainURL (в моем случае это https://10.0.0.100/utmtray/) утилита ищет RemoteINI в следующей последовательности:
IPадрес_компа.ini (перебирает все имеющиеся у компа IP)
логин.ini
default.ini
Разные INI сделаны для того чтоб можно было конкретному компьютеру(или компьютерам аккаунта) подсунуть персональный ini - с разным уровнем отладки, разными серверами (для балансировки нагрузки к примеру)
Удаленный INI имеет вид:
Код: Выделить всё
[Options]
HTTPNativeURL=https://10.0.0.100/cgi-bin/auto/
HTTPAlterNativeURL=https://10.0.0.100/auto/
HTTPNativePort=443
HTTPAlterNativePort=443
WebSessionTimeout=500
WebSessionTimeoutMin=100
WebSessionTimeoutMin=60000
RefreshTime=120000
[Debug]
LogFile=utmtray.log
LogRotate=True
DebugLevel=2
SMTPServer=10.0.0.9
SMTPPort=25
[EchoRequest]
Enable=true
Port=12345
AllowIP=10.0.0.25;10.0.0.51
[EchoRequestSecure]
Enable=true
Port=1234
AllowIP=10.0.0.100
[Application]
AppName=UTMTray ООО "Ухта-Информ" Default Config
[HttpResource]
BillingPortal=https://10.0.0.100/cgi-bin/utm5/aaa5
MainPortal=http://www.flint.net
NewsPortal=http://www.flint.net/index.php?option=com_content&task=blogcategory&id=0&Itemid=8
GamesPortnal01=http://games.flint.net
GamesPortnal02=http://wow.flint.net
[HttpResourceDescription]
BillingPortal=Личный кабинет
MainPortal=Главный сайт сети
NewsPortal=Новости
GamesPortnal01=Игровые сервисы сети
GamesPortnal02=Сервер World of Warcraft
При первом запуске пользователью стразу всплывает диалог ввода логина и пароля, тоже самое происходит при отключенной опции "Сохранять пароль" - это по просьбам клиентов с детьми-любителями посмотреть порнуху в инете пока папа на работе, чтоб папе потом не приходилось лезть в менюшки, вбивать пароль и наблюдать ошибку сохранения как в родной утилите.
В данный момент дописываю интерфейс...
Столкнулся с диллемой новостной вкладки - или брать с сервера подготовленную html c новостями (что для меня проще) или пользовать RSS (что честно говоря меня ломает). Написал оба варианта, но в RSS еще не сделал тэговую обертку для красивого отображения.
Следующим этапом будет прикручивание к утилите умения ставить кредиты и перекидывать деньги с клиента на клиента - но для этого нужен код на php для работы с консольной админкой и utm5_payment_tool. Здесь загвоздка - php я читаю, но писать не могу
