Как самому добавить оператор в расширение xsms 0.0.5.12. Краткое руководство

Во-первых, скажу сразу, что руководство для версии Firefox 1.0.x, т.к. только сегодня обнаружил, что в 1.1a2 расшрение работает некорректно. :(
Во-вторых, напишу достаточно кратко, не описывая в подробностях как пользоваться proxomitron'ом, из чего состоит расширение, и т.д. То-есть, это руководство не для новичков.
В-третьих, когда я делал первую версию xsms, то никакого самостоятельного добавления операторов не планировал, поэтому процесс добавления оператора может оказаться длительным и сложным.

Опишу процесс добавления оператора на примере Мегафон-Москва.

0. Для начала нужно несколько раз с сайта отправить смс, проследив отправку proxomitronom, выявить закономерности и получить полное представление о том, как происходит процесс отправки.
В нашем случае процесс отправки будет такой:
- загрузка страницы http://sms.megafonmoscow.ru. В страницу встроена картинка с кодом следующим образом:

<img src="/image.phtml?k=6760724" alt="" border="0" height="40" width="100">

- Загрузка картинки по адресу http://sms.megafonmoscow.ru/image.phtml?k=6760724
- Отправка формы по адресу http://sms.megafonmoscow.ru/action.phtml, причем нужно обратить внимание, что за поля передаются, и что поле codekey соответствует адресу картинки.
- Загрузка ответа.
При успешной отправке в коде страницы есть строки:

...
    <h3>
        Ваше сообщение отправлено
    </h3>
...

При ошибке:

...
    <h3 class="error">
                                    Ошибка!!! Вы неправильно ввели код подтверждения.
           
    </h3>
...

Все эти данные потребуются в дальнейшем.
1. Для начала в распакованном расширении в папке content нужно найти 2 файла: operators.js, и xsms.js.
2. В файле operators.js найти строки:

operator[operator.length]={
    name:stringBundle.getString('xsms.operators.mf'),
    id:'mf',
    prefix:['7926','7095']};

Поле name обозначает название оператора, которое будет видно в расширении.
В этом примере оно считывается из файла локализации xsms.properties, но можно было и просто написать:

...
    name:'Megafon',
...

Затем идет поле id - это уникальный идентификатор оператора.
Затем поле prefix - вроде и так понятно - массив префиксов для оператора.

После добавления нужных строк в файл, сохраняем его, и переходим к xsms.js
3. В файле xsms.js информация для Мегафона разбросана по разным местам:
- во-первых, в начале указывется количество символов:

...
xsms_max_mf=110;
...

- потом привязка этой переменной к идентификатору оператора (в нашем случае 'mf'):

function xsms_max(){
m='';
...
if (xsms_tek_op=='mf'){m= xsms_max_mf}
...
}

- потом прописывается, нужна ли картинка с кодом (нужна - true):

function xsms_code_needed(){
...
if (xsms_tek_op=='mf'){return true}
...
}

- потом вызов процедуры с показом кода (если код нужен):

function xsms_shownewcode(){
    xsms_hidecodeblock();
...
if (xsms_tek_op==''mf'') {xsms_shownewcode_mf();}
...
}

- вызов процедуры отсылки сообщения:

function xsms_send(){
xsms_translit(document.getElementById('xsms-message-id'));
xsms_message_text+=xsms_signature;
...
if (xsms_tek_op=='mf') {xsms_send_mf();}
...
}

Затем, ближе к концу файла (строки где-то в районе 1200-1250) сами функции показа кода:

function xsms_shownewcode_mf(){
...
}

обработки ответа (вызывается в xsms_send_mf()):

function xsms_parse_result_mf(result){
...
}

и отсылки сообщения:

function xsms_send_mf(){
...
}

4. Теперь самое сложное. Сами функции.
Функция показа кода xsms_shownewcode_mf().
Принцип: закачиваем код страницы отправки, из него "выдираем" код картинки codekey_mf, дополняем им адрес картинки, и используем этот код в дальнейшем.

//скрипты для отправки на Мегафон
function xsms_shownewcode_mf(){

var url="http://sms.megafonmoscow.ru"//страница, из которой нужно "выдрать" адрес картинки с кодом.
var xrequest=new XMLHttpRequest();
xrequest.open("GET",url,true);

xrequest.onreadystatechange = function () {
switch (xrequest.readyState){
   case 2    : {
    xsms_set_status(2);
    } break;
   case 4    : {
    xsms_set_status(0);
xsms_showcodeblock();

var result=xrequest.responseText;          // в строку result заносим код страницы
begin=result.indexOf('image.phtml?k=',0);              // "выдираем" код картинки
end=result.indexOf('"',begin);                                 // "выдираем" код картинки
    codekey_mf=result.substring(begin+14,end);    //  "выдираем" код картинки
var xsms_newcode = new Image ();                                         //
xsms_newcode.src="http://sms.megafonmoscow.ru/image.phtml?k="+codekey_mf; // вставляем картинку в xul-документ
document.getElementById("xsms-imagecode-id").src=xsms_newcode.src;        //
      } break;
    }
};
xsms_set_status(1);
xrequest.send("");
}

5. Функция отправки сообщения xsms_send_mf().
Принцип: в строку data подставляем префикс, номер, текст сообщения, параметр codekey_mf, полученный ранее, и отправляем форму по адресу http://sms.megafonmoscow.ru/action.phtml, а ответ сервера обрабатываем функцией xsms_parse_result_mf.

function xsms_send_mf(){
var xsms_prf=document.getElementById('xsms-prefix-id').label;            //префикс, выбранный пользователем
var xsms_number=document.getElementById('xsms-number-id').value;         //номер
var xsms_message=escape(xsms_message_text);                              //текст сообщения
var xsms_codevalue=document.getElementById('xsms-codevalue-id').value;   //код, набранный пользователем
/*в строку data подставляем поля, необходимые для отправки */
data="transliterate=on&area=sms&messlen=110&english=0&send_after_flag=off&prefix="+xsms_prf+"&addr="+xsms_number+"&message="+xsms_message+"&codekey="+codekey_mf+"&codevalue="+xsms_codevalue;
var url="http://sms.megafonmoscow.ru/action.phtml";                      //адрес обработки формы
var xrequest=new XMLHttpRequest();
    xrequest.open("POST",url,true);
xrequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

xrequest.onreadystatechange = function () {
switch (xrequest.readyState){
   case 2    : {
    xsms_set_status(4);
    } break;
   case 4    : {
    xsms_set_status(0);
      xsms_parse_result_mf(xrequest.responseText);                        //вызов функции обработки статуса отправки
      } break;
    }
};
xsms_set_status(3);
xsms_hidecodeblock();
xrequest.send(data);
}

6. Обработка статуса отправки xsms_parse_result_mf(result).
Принцип: Проверяем в коде страницы наличие строки "Ваше сообщения отправлено", если не находим, то "выдираем" код ошибки.

function xsms_parse_result_mf(result){
//                                                        xsms_test_inwindow(result); //тестовое окно, в которое выводится страница со статусом
t1=result.indexOf(unescapeEx('Ваше сообщение отправлено'),0);
if (t1!=-1) {alert(xsms_sent_all_ok_alert);                  //выводим alert'ом сообщение об успешной отправке
} else {
    begin=result.indexOf('<h3 class="error">',0);        //
    end=result.indexOf('</h3>',begin+18);                // "выдираем" код ошибки
    s=result.substring(begin+28,end-8);                  //
    alert(s);                                //выводим alert'ом код ошибки
}
}


P.S. Естественно, что всё это выглядит на первый взгляд ужасно, и я с Вами в этом согласен - код неоптимизирован, всё раскидано по разным углам, ничего непонятно, комментариев нет, и т.д. Всё это из-за того, что расширение планировал "для себя". Если бы я сейчас писал всё с нуля, то написал бы по-другому, но увы, времени мало, да и лето, жарко, пляж, пиво :)..., в общем руки не доходят переделывать.
Но на самом деле добавить оператора не так уж и сложно, у меня это дело с учетом отладки и т.д. занимает где-то 30 минут.


Модераторам: создаю новую тему, т.к. руководство объемное, не каждому нужно, и в старой теме смотрелось бы как-то не к месту, IMHO.

а если я наблюдаю такую картину при отправке:

+++GET 117+++
CONNECT / HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; ru-RU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Proxy-Connection: keep-alive
Host: gw.kubangsm.ru

+++SSL 117:+++
SSL Pass-Thru: CONNECT https://gw.kubangsm.ru:443/
+++CLOSE 117+++


означает ли это что мне не судьба оправлять sms через этого оператора ?

Attid
Я так понял, что отправка идет со страницы http://gw.kubangsm.ru/cgi-bin/cgi.exe?function=ch_put_sms_win&Lang=2 ?
Там у меня вот что выдается:

Выделить код

Код:

New Message Log Window....

+++GET 1+++
GET /cgi-bin/cgi.exe?function=ch_put_sms_win&Lang=2 HTTP/1.1
Host: gw.kubangsm.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

+++RESP 1+++
HTTP/1.1 200 OK
Date: Wed, 20 Jul 2005 11:59:21 GMT
Server: Apache/2.0.52 (Unix) mod_ssl/2.0.52 OpenSSL/0.9.7e
Content-Length: 3220
Content-Type: text/html; charset=WINDOWS-1251
+++CLOSE 1+++

+++GET 2+++
POST /cgi-bin/cgi.exe?function=ch_send_sms HTTP/1.1
Host: gw.kubangsm.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Referer: http://gw.kubangsm.ru/cgi-bin/cgi.exe?function=ch_put_sms_win&Lang=2
Content-Type: application/x-www-form-urlencoded
Content-Length: 42
Connection: keep-alive
Posting 42 bytes...
SmsNick=%2B7***1234567
count=0
SmsMsg=test

+++RESP 2+++
HTTP/1.1 200 OK
Date: Wed, 20 Jul 2005 12:11:00 GMT
Server: Apache/2.0.52 (Unix) mod_ssl/2.0.52 OpenSSL/0.9.7e
Content-Length: 3244
Content-Type: text/html; charset=WINDOWS-1251
+++CLOSE 2+++

Там всё достаточно просто и обычно. Или другая страница отправки?

Yan пишет

Attid
Я так понял, что отправка идет со страницы http://gw.kubangsm.ru/cgi-bin/cgi.exe?function=ch_put_sms_win&Lang=2 ?
Там у меня вот что выдается:

слушай а я про такую страницу и не знал :)
тут действительно все просто сенкс, буду мучить дальше :)
я пробывал через
https://gw.kubangsm.ru/cgi-bin/cgi.exe?function=sms_send&isFree=1