Application x www form urlencoded charset windows 1251

AJAX, — это технология. Одной из часто используемых техник этой технологии является посылка запросов при помощи объекта класса XMLHttpRequest. Как же посылать...

AJAX, — это технология. Одной из часто используемых техник этой технологии является
посылка запросов при помощи объекта класса XMLHttpRequest.

Как же посылать и принимать AJAX запросы в нужной нам кодировке, нужно ли использовать однобайтовые кодировки или не обойтись без UTF-8. На все эти вопросы раз и навсегда ответит эта статья.

Кстати, перепечатка с моего.

И ещё, классов-то, конечно, в JavaScript нет, но для удобства будем пользоваться такой терминологией.

В документации на XMLHttpRequest сказано, что браузер должен поддерживать следующие типы
HTTP-запросов: GET, POST, HEAD, PUT, DELETE, OPTIONS.

На сегодняшний день джаваскриптом через объект класса XMLHttpRequest можно отправить
только запросы типа GET и POST.

Итак, рассмотрим 2 этих запроса:

1. Запрос типа GET:

Вся информация скрипту на сервере может передаваться только через URL и через заголовки.

Например,

GET moy-rebenok/ajax.php?f=324
Host: moy-rebenok
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.11) Gecko/20071127
Firefox/2.0.0.11
Accept:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/pn
g,*/*;q=0.5
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: moy-rebenok/ajax.html

На сервере, в ajax.php можно будет использовать конструкцию
$_GET[‘f’], чтобы получить значение переменной f.

Почему встает проблема с русскими буквами? Потому что, как вы знаете, русские буквы в URL использовать нельзя, их необходимо как-то передать при помощи доступных латинских букв, цифр и знаков, допустимых в URL после знака ‘?’.

Люди договорились, что будут делать это при помощи escape-последовательностей.

escape последовательность слова «привет» в кодировке windows-1251:
%EF%F0%E8%E2%E5%F2

escape последовательность слова «привет» в кодировке UTF-8:
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

escape последовательность слова «привет» в кодировке KOI8-R:
%CE%CF%D5%C1%C5%D0

(Знак ‘%’, потом код символа).

Таким образом передать русские буквы можно, например, так:

GET moy-rebenok/ajax.php?f=%EF%F0%E8%E2%E5%F2
Host:…

или так:

GET moy-rebenok/ajax.php?f=%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Host:…

Никто вас в этом не ограничивает.

Кстати, для GET запроса не нужно указывать заголовок Content-Type.
Т.к. никакого контента нет. Есть только запрос по определенному адресу.
Все переменные на сервер передаются через URL.

Как же смастерить необходимую escape последовательность в нужной кодировке?

Мастерить можно хоть руками, хоть как, но естественно в JavaScript.
Опять же, никто вас не ограничивает.

Но для удобства обычно используют одну из 3 функций, которые уже определены в JavaScript:

а) escape()
б) encodeURI()
в) encodeURIComponent()

По порядку:

а) escape()

Латинские буквы, цифры, символы @*/+. оставляет как есть, всё остальное кодирует так:
%xx, либо так: %uxxxx.
Причем, xxxx во втором случае, — это код символа не в UTF-8, а в Unicode

(Разница между Unicode и UTF-8).

Использовать эту функцию не надо, т.к. результат выполнения зависит от браузера, функция не является стандартизированной W3C, возникла в лихие 90-е.

К тому же, как-то нормально (по крайней мере, быстро) обработать строку в таком винигретчатом формате на сервере сложно.

Функцию escape() использует библиотека нашего соотечественника JsHttpRequest.
Не потому что библиотека плохая, а потому что создана для работы со всеми браузерами
(в том числе и с самыми древними).

б) encodeURI()

Латинские буквы, цифры, символы !@#$&*()=:/;?+’. оставляет как есть, всё остальное
кодирует
escape-последовательностями в кодировке UTF-8.

в) encodeURIComponent():

Латинские буквы, цифры, символы !*()’. оставляет как есть, всё остальное кодирует
escape-последовательностями в кодировке UTF-8.
Одобрено W3C.

Используется jQuery, prototype.js при запросе методом GET.

Возможно вы слышали от кого-то: «XMLHttpRequest работает только с UTF-8».
Теперь знаете, что это не совсем правда.

Когда используется GET-запрос, то кодировка переданных данных вообще нигде не прописывается(!).
Ещё раз повторю, ‘Content-type’, в котором мы можем указать charset
не используется в GET запросах.

Но, т.к. в JavaScript есть 2 удобные функции для перевода любой строки в строку с escape-последовательностями в UTF-8, то все их используют, и работают с UTF-8.

Именно поэтому в jQuery даже нельзя никак указать charset при отправке запроса.
Именно поэтому в Prototype.js, даже когда указываешь encoding=’windows-1251′, и используешь GET запрос, то передается всё равно UTF-8.

Просто потому что в кодах этих библиотек используется функция encodeURIComponent().

Что ж. В этом нет совершенно ничего плохого. Всё, что надо сделать, чтобы теперь работать
в PHP в
нормальной кодировке использовать iconv:

$f = iconv(‘UTF-8’, ‘windows-1251’, $_GET[‘f’]);

Кстати, мы можем это сделать именно потому, что $_GET работает так, что он понимает
escape-последовательности. Спасибо создателям PHP.

Т.е. когда приходит GET запрос PHP смотрит на URL, создает для нас массив $_GET, а мы
уже с ним
что хотим, то и делаем. Но это вроде понятно должно быть.

2) POST-запросы.

Здесь уже всё интереснее.

Вот приходит это запрос на сервер. Обработчик PHP смотрит на Content-type, и в зависимости от него заполняет массив $_POST и/или переменную $HTTP_RAW_POST_DATA.

$_POST он заполняет в том случае, когда в Content-type указано multipart/form-data или
x-www-form-urlencoded.

Что-же это за Content-type такой?
А контент-тайп это очень удобный. Он позволяет передать php скрипту несколько переменных.

Что по сути такое POST запрос?
Это заголовки, а за ними контент. Контент вообще произвольный. Т.е. просто байты, байты, байты.

Но ведь из JavaScript обычно требуется передать не просто байты, байты, байты, а несколько пар ключ=значение, ключ=значение,…
Как в GET запросе.

Вот люди и договорились о таком удобном типе, как x-www-form-urlencoded
Для того, чтобы передать f=123 и gt=null необходимо передать контент:

f=123&gt=null

Знакомо неправда ли? Конечно знакомо, и тип не зря называется x-www-form-urlencoded.
Всё то же самое, что и при GET запросе.

И как же формируется контент в библиотеках jQuery и prototype.js?

Верно, при помощи всё той же функции encodeURIComponent(), а значит и escape-последовательности будут в кодировке UTF-8. (Независимо от того, что в prototype.js вы установите encoding).

Всё. Осталась ещё одна возможность. Ведь можно передавать не x-www-form-urlencoded (т.е. не параметры), а обычный текстовый или бинарный контент, который потом можно будет прочитать через $HTTP_RAW_POST_DATA.

Для этого устанавливаем Content-type text/xml или application/octet-stream, там же устанавливаем charset=«windows-1251».

Засовываем в функцию send() строку нужной кодировки. (Prototype.js оборачивает этот вызов конструкцией new Ajax.Request(…)).

И что потом… А он (объект класса XMLHttpRequest) переводит эту строку в UTF-8, в какой бы кодировке она не была. Так написано в документации W3C. И он реально это делает.

Выводы:

1. Напрямую через XMLHttpRequest можно передавать только строки в кодировке UTF-8.

2. Можно передавать строки как бы «в любых других кодировках», если нелатинские символы
при этом за-escape-ены.

3. В JavaScript существует 3 функции, которые escape-ят нелатинские символы:
escape(), encodeURI() и encodeURIComponent().

Первая переводит в кривой Unicode. Вторые две в UTF-8.

Можно написать свои функции, которые будут генерировать escape-последовательности любой кодировки. Можно, но не нужно. Т.к. наоборот надо радоваться, что есть такие вот функции, которые переводят текст любой кодировки в UTF-8. Это черезвычайно прекрасный факт. Схема при которой все xhtml страницы работают на windows-1251, ajax с сервера клиенту кидает windows-1251, а ajax с клиента серверу кидает UTF-8 абсолютна приемлема и используется на большинстве ресурсов.

Просто не надо забывать использовать iconv как было описано ниже. А для того, чтобы сервер отдавал яваскрипту JSON (или что там у вас) в правильной кодировке (т.е. в такой же кодировке, в которой отдаются все xhtml страницы) просто в начале вашего ajax.php пропишите заголовок:

header(‘Content-type: text/html; charset=windows-1251’);

И всё будет ок.

На последок немного субъективного мнения:

Используйте jQuery, любите людей, дарите подарки.

Я так решил, когда у меня проблема подобная возникла:

function sendForm(url, data, ok, error, callback) {
    var str = "";
    var boundary = '----WebKitFormBoundary5zih7EsEnWJI1WJw';
    for(var i in data) {
        str += '--' + boundary + 'rn'
        + 'Content-Disposition: form-data; name="'+i+'"rnrn'
        + data[i] + 'rn';
    }

    var converted_str = UnicodeToWin1251(str);

    var send_arr = new Uint8Array(converted_str.length);
    for(var i = 0; i < converted_str.length; ++i) send_arr[i] = converted_str.charCodeAt(i);

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4) {
            if(this.status == 200) {
                ok(this.responseText);
            } else {
                error(this.responseText);
            }
            callback();
        }
    };
    xhttp.open("POST", url, true);
    xhttp.setRequestHeader('Content-Type', 'multipart/form-data; boundary='+boundary);
    xhttp.send(send_arr);
}

var DMap = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, 101: 101, 102: 102, 103: 103, 104: 104, 105: 105, 106: 106, 107: 107, 108: 108, 109: 109, 110: 110, 111: 111, 112: 112, 113: 113, 114: 114, 115: 115, 116: 116, 117: 117, 118: 118, 119: 119, 120: 120, 121: 121, 122: 122, 123: 123, 124: 124, 125: 125, 126: 126, 127: 127, 1027: 129, 8225: 135, 1046: 198, 8222: 132, 1047: 199, 1168: 165, 1048: 200, 1113: 154, 1049: 201, 1045: 197, 1050: 202, 1028: 170, 160: 160, 1040: 192, 1051: 203, 164: 164, 166: 166, 167: 167, 169: 169, 171: 171, 172: 172, 173: 173, 174: 174, 1053: 205, 176: 176, 177: 177, 1114: 156, 181: 181, 182: 182, 183: 183, 8221: 148, 187: 187, 1029: 189, 1056: 208, 1057: 209, 1058: 210, 8364: 136, 1112: 188, 1115: 158, 1059: 211, 1060: 212, 1030: 178, 1061: 213, 1062: 214, 1063: 215, 1116: 157, 1064: 216, 1065: 217, 1031: 175, 1066: 218, 1067: 219, 1068: 220, 1069: 221, 1070: 222, 1032: 163, 8226: 149, 1071: 223, 1072: 224, 8482: 153, 1073: 225, 8240: 137, 1118: 162, 1074: 226, 1110: 179, 8230: 133, 1075: 227, 1033: 138, 1076: 228, 1077: 229, 8211: 150, 1078: 230, 1119: 159, 1079: 231, 1042: 194, 1080: 232, 1034: 140, 1025: 168, 1081: 233, 1082: 234, 8212: 151, 1083: 235, 1169: 180, 1084: 236, 1052: 204, 1085: 237, 1035: 142, 1086: 238, 1087: 239, 1088: 240, 1089: 241, 1090: 242, 1036: 141, 1041: 193, 1091: 243, 1092: 244, 8224: 134, 1093: 245, 8470: 185, 1094: 246, 1054: 206, 1095: 247, 1096: 248, 8249: 139, 1097: 249, 1098: 250, 1044: 196, 1099: 251, 1111: 191, 1055: 207, 1100: 252, 1038: 161, 8220: 147, 1101: 253, 8250: 155, 1102: 254, 8216: 145, 1103: 255, 1043: 195, 1105: 184, 1039: 143, 1026: 128, 1106: 144, 8218: 130, 1107: 131, 8217: 146, 1108: 186, 1109: 190}

function UnicodeToWin1251(s) {
    var L = []
    for (var i=0; i<s.length; i++) {
        var ord = s.charCodeAt(i)
        if (!(ord in DMap)) {
            L.push(63);
        } else {
            L.push(String.fromCharCode(DMap[ord]))
        }
    }
    return L.join('')
}

Использование:

sendForm("test.php", {name:"имя", message:"Сообщение"}, function(){alert("отправлена");}, function(){alert("не отправлена");}, function(){});

Работает так: формируем multipart/form-data, потом конвертируем в cp1251 и в виде бинарного массива отдаем в запрос.

Кроссбраузерность не проверял, в ТЗ к счастью только Chrome.

Главная » Блог » AJAX и проблемы с кодировками.

Очень часто разработчики в тех или иных ситуациях сталкиваются с проблемами, связанными с кодировками. Особенно те, кто работает в кодировке windows-1251. Сегодня хотел рассмотреть эту проблему, посмотреть разные примеры и возможные решения.

AJAX

AJAX (Asynchronous Javascript and XML, асинхронный Javascript и XML) очень тесно вошел в обиходе, и сложно представить себе современный сайт без использования этой технологии. По сути, аякс это фоновый обмен данными, что позволяет получать данные без перезагрузки страницы. Различные «живые поиски», регистрации, формы обратной связи и т.д.

Через AJAX мы можем передавать данные методом POST и GET. Давайте разберемся, какие могут быть проблемы в передачи этих данных.

Начем с GET.

Когда мы передаем данные через GET – это значит мы посылает скрипту URL, в котором русский текст должен быть закодирован, в определенной последовательности. Называется она escape-последовательностью.

Например:

ajax.php?query=%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D1%82%D0%B5%D0%BA%D1%81%D1%82

В этом GET запросе, query передает фразу «русский текст». Но escape-последовательности отличаются друг от друга, в зависимости от используемой кодировки. Для того что бы перевести русский текст в последовательность, W3C рекомендует использовать функцию «encodeURIComponent()», которая автоматически переводит текст в utf-8 и создает escape-последовательность. Поэтому при передаче текста через Jquery, Prototype, и другие фреймворки, на выходе мы получаем текст в UTF-8 кодировке. Если вы работаете в кодировке Windows-1251, то придется вначале текст перевести из utf-8 в Windows-1251 ( это можно сделать через iconv, например: $_GET[‘query’] = iconv(‘utf-8’, ‘Windows-1251’, $_GET[‘query’])).

С теорией закончили, теперь давайте рассмотрим примеры. Есть один интересный нюанс, который я обнаружил. Я работал с фреймворком Jquery, сайт работает в utf-8, обработчик ajax запросов работает в utf-8, база данных работает в utf-8, короче все узлы сайта построены в этой кодировке. Рассчитывая на то, что Jquery посылает запрос через encodeURIComponent(), я его не стал использовать. Да и в принципе никаких проблем не было, пока не стали приходить запросы с «каказябрами», при том что Firefox, Chrome и Opera корректно присылали запросы в utf-8, но вот Internet Explorer, как самый выдающийся браузер, умудрялся присылать запросы в windows-1251.

Я решил провести тест, и разобраться при каких ситуациях IE посылает неверную кодировку.

Есть 2 скрипта:

$.get("ajax.php", { "query": "Русский текст" },function(data){
	alert(data)
})

Результат:

$.ajax({
	dataType: 'html',
	type: "GET",
	url:  "ajax.php",
	data: 'query=Русский текст',
	success: function(data){
		alert(data);
	}
});

Результат:

Так вот, проверив оба, я выяснил что в $.ajax IE посылает не UTF-8, а Windows-1251. Решение этой проблемы – добавить encodeURIComponent() и все будет хорошо.

$.ajax({
	dataType: 'html',
	type: "GET",
	url:  "ajax.php",
	data: 'query='+encodeURIComponent('Русский текст'),
	success: function(data){
		alert(data)
	}
});

Резальтат:

Хорошо, с GET запросами разобрались.

Теперь рассмотрим коротко POST.

В отличие от GET запросов, в POST передается Content-type, который сообщает серверному скрипту информацию, о том с какими данными он работает и возможность указания кодировки. Например, в Jquery по умолчанию AJAX передает «application/x-www-form-urlencoded; charset=UTF-8», но даже если вы укажите “text/html; charset=windows-1251”, то данные приходящие будут в utf-8, так как при передачи данных, Jquery формирует escape-последовательность, функцией, о которой писалось выше.

Но это не так страшно, потому что у нас есть всегда возможность перевести кодировку и уже работать с данными. При этом отдавать результаты мы можем в нашей любимой кодировке, главное не забывайте ставить заголовок, с указанием кодировки, если вдруг вы обратно получаете «каказябры».

Например:

	header('Content-type: text/html; charset=windows-1251');

или:

	header('Content-type: text/html; charset=utf-8');

Вывод: для того что бы не было проблем с кодировками, при передачи данных через AJAX, нужно использовать encodeURIComponent(). Если ваш серверный скрипт, который принимает запросы, работает в другой кодировке, отличной от utf-8, то надо пользоваться php функцией iconv и устанавливать заголовок header.

   Kreont

04.05.09 — 20:11

WinHttp=СоздатьОбъект(«WinHttp.WinHttpRequest.5.1»);

WinHttp.Option(2,»Windows-1251″);                  

WinHttp.Open(«POST»,»http://sta.gov.ua/control/uk/vat/search»,0);

// Вторым параметром передаем GET-данные

//param1=value1&param2=value2″

       
//WinHttp.SetProxy(0,»192.168.1.1:3128″);// Задаем параметры своего прокси сервера

//WinHttp.SetCredentials(«ProxyLogin»,»ProzyPassword»,1);

// Задаєм параметром логин и пароль        

//если прямое соединение то так в коментах и оставлем :)        

WinHttp.SetRequestHeader(«Accept-Language», «ru»);

WinHttp.SetRequestHeader(«Accept-Charset»,»Windows-1251″);

WinHttp.setRequestHeader(«Content-Language», «ru»);

WinHttp.setRequestHeader(«Content-Charset», «Windows-1251»);

WinHttp.setRequestHeader(«Content-Type»,»application/x-www-form-urlencoded; charset=Windows-1251″);

       
ПараметрыПОСТ = «isJuridical=1» + «&individualCode=»+СокрЛП(Контрагент.ЕДРПОУ);

       
       WinHttp.Send(ПараметрыПОСТ);// Параметром передаем POST-данные для страници тут как раз

Дальше или сохраняем страницу в файл

Текст = СоздатьОбъект(«Текст»);

Текст.ДобавитьСтроку(WinHttp.ResponseText());

Текст.Записать(КаталогИБ() + «otvet.htm»);

или парсинг и получение нужных даных

P.S. Просто сам намучался с такой постановкой задачи,

когда надо с сайта налоговой sta.gov.ua было получить страницу

после POST — запроса.

Если кого очень интересует для баз 1С Украины есть что потестить, обработку готовую выложил на http://www.commerce.at.ua/publ/1-1-0-11

// Если будут вопросы отвечу, сам два дня мучался :)

   Torquader

1 — 04.05.09 — 20:13

А через InternetExplorer.Application и метод Navigate не проще ли ? Там можно будет открыть страницу с формой, «вбить» сценарием в неё нужные данные и также «нажать» магическую кнопку отправки данных.

   Kreont

2 — 04.05.09 — 20:21

Непробовал, так думаю точно попроще.

Хотя как вариант посмотрю еще и что умеет InternetExplorer.Application.

искал замену стандартному V7HttpReader, который

через POST ну никак неотправлял.

   Mashinist

3 — 04.05.09 — 20:46

Хорошая тема.
Работает.

   Mashinist

4 — 04.05.09 — 20:49

Только вот почему-то Номер свiдоцтва (8 або 9 знаків) не совпадает ни разу с тем что у меня в базе
И проблема с ЕДРПОУ начинающимся с нуля.

   smaharbA

5 — 04.05.09 — 21:04

А может вперед у супер-пупер-суперногознатока спросить ? у меня ? )))

   Kreont

6 — 05.05.09 — 10:32

«Номер свідоцтва» у меня по базе почти всегда совпал, наверное бухгалтера поаккуратней вносят :)

— С ЕДРПОУ начинающимся с нуля

тоже заметил что шо то тут не то, потестирую счас

   Андрюха

7 — 05.05.09 — 10:35

(5)+100 :-)

   Kreont

8 — 05.05.09 — 10:40

Есть такое точно с ЕДРПОУ что начинаются с нуля(-ей),

но странно что сам сайт такой номер спереди без нулей и возвращает :(

Надо будет написать админам в налоговую… :)

Иначе только самим получается до допустимого значения подогнять спереди нулями

уже полученный результат.

   DGorgoN

9 — 05.05.09 — 10:44

(0) А файлик как передать не подскажешь?

   FN

10 — 05.05.09 — 10:44

(0) Оформи в виде внешней обработки и положи на ИС — я тебе обязательно плюс поставлю.

   Kreont

11 — 05.05.09 — 10:48

Оформил уже, куда обработку положить :)

(Под 1С Бухгалтерия 7.7 Для Украины есть)

С фаликом вроде тут надо менять начинать:

WinHttp.setRequestHeader(«Content-Type»,»application/x-www-form-urlencoded; charset=Windows-1251″);

application/x-www-form-urlencoded — признак что будет отправка на форму

запроса в виде гтовой строки, там есть еще другие варианты в нете видел где — то пока то делал :)

   FN

12 — 05.05.09 — 10:56

(11) www.infostart.ru

   insider

13 — 05.05.09 — 10:57

(11) да хоть на рапидшару :)
я правильно понял, что это пример автоматизации поиска налогоплательщика по ИНН?
тогда штука полезная, думаю многие спасибо скажут :)

P.S. а что абрахамс думает по этому поводу? ;)
на всякий случай, требуемый адрес: http://sta.gov.ua/control/vat/search и тут в поля внести соотв. данные (надеюсь, без перевода понятно, что именно)

   insider

14 — 05.05.09 — 10:59

помнится нечто такое делал через объект эксплорера, но позабыл :(
вот точно помню, что по-другому как-то делается…

   Kreont

15 — 05.05.09 — 11:00

Ближе к обеду выложу , напишу где и куда.



Штука действительно полезная,

у меня бухгалтер и юрист заценили сразу

   Kreont

16 — 05.05.09 — 11:21

Ну у меня ИС и тормозит :(

Пробуйте тут ert-файлом:

http://infostart.ru/projects/4034/

   Холст

17 — 05.05.09 — 15:41

   Kreont

18 — 05.05.09 — 16:02

Переписать тока парсинг страници надо :(

Линк http://egrul.nalog.ru/fns/fns.php

ПараметрыПОСТ = «num=»+Контрагент.ЕДРПОУ;

(Есть еще такое в html: name=»action» value=»Искать»,

если не пойдет то добавить

ПараметрыПОСТ = ПараметрыПОСТ + «&action=Искать»)

Вроде так, попробуй писать в файл что получилось сначала без

анализа страници.

   Kreont

19 — 05.05.09 — 16:04

Линк такой, а то скрипт форума поковырял (

egrul.nalog.ru/fns/fns.php

   Kreont

20 — 05.05.09 — 16:25

А Федеральная налоговая служба смотрю,

так на странице покрасивей даные показывает,

да и побольше: и адрес есть, еще б телефон еще добавили :)

Иду жаловаться на форум sta.gov.ua админам налоговой пусть

добавляют еще адрес и мне :)

   Холст

21 — 05.05.09 — 19:09

спасибо большое !!!

   insider

22 — 05.05.09 — 19:16

(16) спасибо, но чето не работает…
проверял на типовой, на контрагенте с заполненными ИНН и ОКПО. что я делаю не так?

   insider

23 — 05.05.09 — 19:26

+22 сразу уточню: нужно снять проверку на ОКПО, точнее для физиков надо проставлять автоматом нолик (так сайт схавает). и надо проставлять переключатель физик/юрик.

ну а у меня на физиках — «не найдена инфа», а на юриках — «ошибка соединения», ессно инет работает и все такое.

а вообще идея замечательная :)

   Kreont

24 — 05.05.09 — 19:40

Соединение идет через прокси сервер?

   2mugik

25 — 05.05.09 — 20:27

(0) Я в восьмерке пытался Номенклатуру через стандартные методы выгружать на сайт. В итоге тоже промучался с ВИнХТТП. Только пришлось еще через «поток»(stream) делать, посколько кодировка у восьмерки  Unicode

   Ковычки

26 — 05.05.09 — 20:41

(13) а нифига он не думает, лодырь…

думает как трафик на конторе снизить не обрезая ничего

   insider

27 — 05.05.09 — 22:07

(24) нет, прямое

   Холст

28 — 06.05.09 — 00:41

копаю http://www.valaam-info.ru/fns/fns.php (это место куда переадресовывается http://egrul.nalog.ru/fns/fns.php)

не получается пока в 1С получить страницу с данными

в браузере если сначала зайти на http://www.valaam-info.ru/fns/fns.php

а потом пойти на

http://www.valaam-info.ru/fns/fns.php?num=7723000446

работает запрос, может эта инфа поможет ?

   JF_168

29 — 06.05.09 — 01:02

То что надо:))), ща опробуем

   Kreont

30 — 06.05.09 — 20:05

27 — proxycfg.exe -d (выставляет прямое соединение)

мож там непорядок

   Kreont

31 — 08.05.09 — 13:07

28:

Вроде у меня как то заработало и с

http://www.valaam-info.ru/fns/fns.php

Кому оч.интересно то загвоздка

в сессиях сеанса PHP,

там надо еще в хедер добавлять

SetRequestHeader(«Cookie», «PHPSESSID=а тут я вписал свой ид сесии»);

Как сделать чтоб у всех работало незнаю еще,

по идее сначала с 1С надо подключить страницу,

потом получить значение PHPSESSID

и уже при поиске/сверке передавать его.

   Kreont

32 — 11.05.09 — 12:21

Кто искал как сделать проверку под налоговую России:

У меня запрос правда такой, выгреб его с помощью проги

«HTTP Debugger Pro», так что если надо кому под другой адрес, то

рекомендую сначала грабнуть страницу (хедер) что отправляется, а потом

просто его копируем в 1С и все должно работать:

ПараметриПОСТ = «name=&adr=&region=%C2%F1%E5+%F0%E5%E3%E8%EE%ED%FB&date=&num=» + Код + «&action=%C8%F1%EA%E0%F2%FC»;

   Ковычки

33 — 11.05.09 — 12:42

ты бы поглядел вперед в код страницы, может и увидел бы, что ничего «выгребать» и не надо

   Паацелуй меня удача

34 — 11.05.09 — 12:47

(33)Немного не в тему. А можно на основе этого заматырить поиск по странице по заданному набору значений или строке ?

   Паацелуй меня удача

35 — 11.05.09 — 12:48

+(34)Обработку такую с выборкой вхождений …

   Ковычки

36 — 11.05.09 — 12:50

это уже DOM, СоздатьОбъект(«htmlfile») загрузить в него полученное и искать

   Паацелуй меня удача

37 — 11.05.09 — 12:52

DOM = DCOM ?

   Паацелуй меня удача

38 — 11.05.09 — 12:52

А понял ..

   Kreont

39 — 11.05.09 — 13:39

->33 Через регулярные выражения

Книга знаний: Использование регулярных выражений (RegExp) в 1С

// Их полезно знать как писать ( и читать:-( )

,пригодится…

   Холст

40 — 11.05.09 — 15:22

не взлетает, вот текущий код

       WinHttp=СоздатьОбъект(«WinHttp.WinHttpRequest.5.1»);

       WinHttp.Option(2,»Windows-1251″); //              

       //WinHttp.Open(«GET»,»http://egrul.nalog.ru/fns/index.php?»,0);//http://sta.gov.ua/control/uk/vat/search

       //WinHttp.Open(«GET»,»http://www.valaam-info.ru/fns/fns.php?»+»name=&adr=&region=&date=&num=»+СокрЛП(ПоточнийКонтрагент.ИНН)+»&action=%C8%F1%EA%E0%F2%FC»,0);//http://sta.gov.ua/control/uk/vat/search

       //WinHttp.Open(«POST»,»http://www.valaam-info.ru/fns/fns.php?»+»num=»+СокрЛП(ПоточнийКонтрагент.ИНН),0);//http://sta.gov.ua/control/uk/vat/search

       WinHttp.Open(«POST»,»http://www.valaam-info.ru/fns/fns.php»,0);//http://sta.gov.ua/control/uk/vat/search

       
       // Другим параметром при потребі можна передавати також додатково GET-змінні звичайно що в форматі «?param1=value1&param2=value2»

       //WinHttp.SetProxy(0,»192.168.1.1:3128″);// Задаєм параметри свого проксі сервера при потребі

       //WinHttp.SetCredentials(«ProxyLogin»,»ProzyPassword»,1);// Задаєм параметром логін і пароль для проксі якщо потрібно

       //якщо пряме підключення до інтернету то два попередніх рядки нерозкоментовуємо

       
       WinHttp.SetRequestHeader(«Accept-Language», «ru»);

       WinHttp.SetRequestHeader(«Accept-Charset»,»Windows-1251″);//

       WinHttp.setRequestHeader(«Content-Language», «ru»);

       WinHttp.setRequestHeader(«Content-Charset», «Windows-1251»); //

       WinHttp.setRequestHeader(«Content-Type»,»application/x-www-form-urlencoded; charset=Windows-1251″); //

       
       ПараметриПОСТ =  «name=&adr=&region=&date=&num=»+СокрЛП(ПоточнийКонтрагент.ИНН)+»&action=%C8%F1%EA%E0%F2%FC»; //+»&action=fns.php»;

       //

       //WinHttp.Send();// Параметром передаєм POST-змінні власне тут

       WinHttp.Send(ПараметриПОСТ);// Параметром передаєм POST-змінні власне тут

Возвращает начальную страницу, русские буквы искажает

   Ковычки

41 — 11.05.09 — 15:24

(39)(40) фигня какая то

   Kreont

42 — 11.05.09 — 15:38

У меня взлетает такое:

       пОбъект.Open(«POST»,»http://www.valaam-info.ru/fns/fns.php»,0);

       пОбъект.SetRequestHeader(«Accept»,»image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, */*»);

       пОбъект.SetRequestHeader(«Referer»,»http://www.valaam-info.ru/fns/»);

       пОбъект.SetRequestHeader(«Accept-Language», «ru»);

       пОбъект.SetRequestHeader(«Content-Type», «application/x-www-form-urlencoded»);

       пОбъект.SetRequestHeader(«UA-CPU», «x86»);

       пОбъект.SetRequestHeader(«Accept-Encoding», «gzip, deflate»);

       пОбъект.SetRequestHeader(«User-Agent», «Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.50727)»);

       пОбъект.SetRequestHeader(«Proxy-Connection», «Keep-Alive»);

       пОбъект.SetRequestHeader(«Content-Length», «96»);

       пОбъект.SetRequestHeader(«Host», «www.valaam-info.ru»);

       пОбъект.SetRequestHeader(«Pragma», «no-cache»);

ПараметриПОСТ = «name=&adr=&region=%C2%F1%E5+%F0%E5%E3%E8%EE%ED%FB&date=&num=» + СокрЛП(ПоточнийКонтрагент.ИНН) + «&action=%C8%F1%EA%E0%F2%FC»;

  

Холст

43 — 15.05.09 — 09:59

на правах апа

на www.valaam-info.ru пока так и не удалось заставить работать обработку

Описание отсылки сообщений через протокол HTTP в системе «ISBC Telecom».

Скачать примеры на PHP

Для работы с классом требуется PHP5

Входные параметры

  • Адрес обращения : http://service.qtelecom.ru/public/http/ или https://service.qtelecom.ru/public/http/
  • Тип авторизации : PLAIN (открытым текстом)
  • Формат входных данных: Content-Type: application/x-www-form-urlencoded; charset=UTF-8 (по умолчанию)
  • При использовании другой кодировки, отличной от UTF-8, требуется указать её в заголовке Content-Type запроса.
  • Например: Content-Type: application/x-www-form-urlencoded; charset=windows-1251
  • Результат : Content-Type: text/xml (UTF-8); content-encoding: gzip
  • Login/password : совпадают с login/password на web-сайт http://go.qtelecom.ru
  • Максимальная длина сообщений : 480 символов.

1. Авторизация

Авторизация требуется при каждом подключении к серверу независимо от дальнейших действий.

  • user — Логин для входа в систему на сайте go.qtelecom.ru
  • pass — Пароль для входа в систему на сайте go.qtelecom.ru
  • gzip=none — Не использовать content-encoding: gzip
  • HTTP_ACCEPT_LANGUAGE — переменная клиента, предпочтение относительно языка (необязательный параметр)
  • CLIENTADR — IP адрес клиента (необязательный параметр)
  • comment — описание подключения (необязательный параметр; до 512 символов)

2. Отправка сообщения

SMS сообщение

Параметр Значение По умолчанию
action post_sms
message текст сообщения
sender имя отправителя, зарегистрированного для вас, в системе (NULL — имя отправителя по умолчанию) имя по умолчанию
post_id пользовательский ID рассылки, необязательный параметр, возвращается обратно в неизменном виде.
period Время жизни сообщения в секундах. Необязательный параметр. Максимальное время, в течение которого сообщение должно быть доставлено на телефон. Если в течение этого времени доставка не возможна (например абонент не в зоне действия сети), сообщение не будет доставлено вовсе. Внимание, данная функция может не работает для некоторых направлений, например для CDMA телефонов.
time_period Период отправки сообщения в формате «HH:mm-HH:mm(час:мин-час:мин)», в течение которого сообщение должно быть доставлено получателям (например 10:00-21:00). Опция позволяет запретить доставку сообщений, например, в ночное время. Для указанного периода времени можно уточнить часовой пояс в time_local 00:00-00:00
time_local Выбор часового пояса для опции time_period. 1 — по местному время получателя, 0 — по часовому поясу, выбранному в личном кабинете отправителя. 0
autotrimtext on — обрезать все пробелы и переводы строк в начале и конце сообщения. off
  • Варианты рассылки по адресатам:
    • target — адресаты. Список через запятую. (Н-р: »+70010001212, 80009990000»)
    • phl_codename — кодовое имя контакт-листа в системе go.qtelecom.ru
      • gender — фильтр по полу получателя. Значение: M / F (мужской / женский)
  • sms_type — Тип SMS (по умолчанию пустое значение):
    • Пустое значение: Простое SMS
    • W: Wap push сообщение
      • wap_url — HTTP ссылка с текста сообщения (http://……) только для sms_type = W.
      • wap_expires — Дата и время когда истекает срок доставки Wap push сообщения. (Формат: dd.mm.yyyy hh:ii:ss (дд.мм.гггг чч:ми:сс))
    • F: Flash SMS сообщение

3. Получение статусов сообщений асинхронно

Данный вариант позволяет получать статусы сообщений в реальном времени. Для настройки укажите в Личном кабинете → Услуги «URL скрипта для приёма статуса отправленных SMS». Как только система получает статус сообщения, она немедленно пересылает вам его по HTTPпротоколу с помощью POST запроса.

Формат данных:

  • ORDID ⇒ номер сообщения (номер соответствует значению атрибута ID тэга SMS, возвращаемого при отправке сообщения)
  • CNRID ⇒ ID контрагента
  • RESCOUNT ⇒ количество для тарификации
  • STATUS ⇒ код статуса (расшифровка кодов ниже)
  • FINALTIME ⇒ время получения финального статуса в UTC

Коды статуса:

  • 2 — сообщение доставлено
  • 3 — время попыток доставить сообщение оператором истекло
  • 5 — сообщение не может быть доставлено (ошибка в номере, номер не существует и т.д.)
  • 8 — сообщение не принято оператором
  • 20 — отправка была отменена пользователей
  • 21 — ошибка при работе по сообщению
  • 22 — оператор не сообщил о состоянии сообщения за отведенное время.

4. Получение данных и статусов сообщений

  • action = status

Три варианта получения статусов для сообщений:

  • sms_id = данные по одному сообщению.
  • sms_group_id = данные по всем сообщениям за одну отсылку.
  • date_from, date_to, smstype = данные по всем сообщениям за период времени от date_from до date_to по типу сообщений smstype. (Формат date_from, date_to: dd.mm.yyyy hh:ii:ss (дд.мм.гггг чч:ми:сс))

Возможные варианты:

  • queued — сообщение в очереди отправки
  • wait — передано оператору на отправку
  • accepted — сообщение принято оператором
  • delivered — сообщение доставлено
  • not_delivered — сообщение не доставлено
  • failed — ошибка при работе по сообщению

5. Получение текущего баланса

  • action = balance

6. Получение входящих сообщений

  • action = inbox
  • sib_num — Номер входящего ящика (Обязательный параметр, соответствует значению «ID ящика» в закладке «Настройки»)
  • new_only — Статус сообщений:
    • 1 — только новые, непрочитанные сообщения
    • 0 — все сообщения
  • date_from, date_to — Данные по всем сообщениям за период времени от date_from до date_to (Формат date_from, date_to: dd.mm.yyyy hh:ii:ss (дд.мм.гггг чч:ми:сс))

Примеры использования протокола

Пример 1. Отправка одного сообщения по адресатам

Запрос

POST= (
    [user] => userX
    [pass] => ***
    [action] => post_sms
    [message] => Привет
    [target] => +79999999991, +79999999992, +7999999999999
    [post_id] => x124127456
    [period] => 600
    [CLIENTADR] => 127.0.0.1
    [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
)

Результат XML

<output>
     <result>
     <sms post_id="x124127456" id="99991" smstype="SENDSMS"  phone="+79999999991" sms_res_count="1"><![CDATA[Привет]]></sms>
     <sms post_id="x124127456" id="99992"  smstype="SENDSMS"  phone="+79999999992" sms_res_count="1"><![CDATA[Привет]]></sms>
     </result>
     <errors>
     <error code="-20117" post_id="x124127456">Неправильный номер телефона: +7999999999999</error>
     </errors>
</output>

Использование PHP-класса

<?php
 Include('QTSMS.class.php');
 // Отправка SMS сообщения по списку адресатов
 $sms_text='Привет';
 $target='+79990001212, 80009990000';
 $sender='vasya';
 $period=600;
 
 $sms= new QTSMS('userX.Y','пароль');
 $result=$sms->post_message($sms_text, $target, $sender, 'x124127456',$period);
 // результат XML
 echo $result;  
 // Отправка SMS по кодовому имени контакт листа
 $sms_text='Привет';
 $phl_codename='druzya';
 $result=$sms->post_message_phl($sms_text, $phl_codename, $sender, 'x124127456',$period);
 header("Content-Type: text/xml; charset=UTF-8");
 // результат XML
 echo $result; 
?>

Пример 2. Получение данных сообщения id=6666

Запрос

POST= (    
    [action] => status    
    [sms_id] => 6666    
    [user] => userX    
    [pass] => ***    
    [CLIENTADR] => 127.0.0.1    
    [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
)

Результат XML

<output>
     <MESSAGES>
     <MESSAGE SMS_ID="6666" SMSTYPE="SENDSMS">
     <CREATED>24.12.07 15:57:45</CREATED> 
     <AUL_USERNAME>userX.Y</AUL_USERNAME> 
     <AUL_CLIENT_ADR>127.0.0.1</AUL_CLIENT_ADR> 
     <SMS_SENDER>SenderName</SMS_SENDER> 
     <SMS_TARGET>89999991111</SMS_TARGET> 
     <SMS_RES_COUNT>1</SMS_RES_COUNT> 
       <SMS_TEXT>
       <![CDATA[ Привет ]]> 
     </SMS_TEXT>
     <SMSSTC_CODE>wait</SMSSTC_CODE> 
     <SMS_STATUS>Сообщение в процессе доставки</SMS_STATUS> 
     <SMS_CLOSED>0</SMS_CLOSED> 
     <SMS_SENT>0</SMS_SENT> 
     </MESSAGE>
     </MESSAGES>
</output>

Использование PHP-класса

<?php
 // Получение статуса SMS сообщений
 Include('QTSMS.class.php');
 $sms= new QTSMS('userX.Y','пароль');
 // данные о сообщении SMS_ID=6666
 $r_xml1=$sms->status_sms_id(6666);
 // данные о сообщениях отправки SMS_GROUP_ID=110
 $r_xml2=$sms->status_sms_group_id(110);
 // Получить данные сообщений отправленных с 18.12.2007 00:00:00 по 23.12.2007      23:00:00
 $r_xml3=$sms->status_sms_date('18.12.2007 00:00:00','23.12.2007 23:00:00');
 header("Content-Type: text/xml; charset=UTF-8");
 echo $r_xml1; // результат XML
 //echo $r_xml2;
 //echo $r_xml3;
?>

Пример 3. Отправка сообщений и получение статусов

Запрос

 
POST= (
    [data] => Array (
            [0] => Array  (
                    [action] => post_sms
                    [message] => Привет!
                    [sender] => 
                    [target] => +79999999999, +79999999992
                )
            [1] => Array  (
                    [action] => post_sms
                    [message] => С днём рождения!
                    [sender] => 
                    [target] => +79999999991
                    [post_id] => x425256
                )
            [2] => Array  (
                    [action] => status
                    [sms_id] => 6666
                )
        )

    [user] => userX
    [pass] => ***
    [CLIENTADR] => 127.0.0.1
    [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
)

Результат XML

<output>
     <result sms_group_id="996">
        <sms id="99991" smstype="SENDSMS" phone="+79999999991" sms_res_count="1"><![CDATA[Привет]]></sms>
        <sms id="99992" smstype="SENDSMS" phone="+79999999992" sms_res_count="38"><![CDATA[С днём рождения!]]></sms>
     </result>
     <errors>
        <error code="-20117" post_id="x425256">Неправильный номер телефона: +7999999999999</error>
     </errors>
     <MESSAGES>
        <MESSAGE SMS_ID="6666" SMSTYPE="SENDSMS">
           <CREATED>24.12.07 15:57:45</CREATED> 
           <AUL_USERNAME>userX.Y</AUL_USERNAME> 
           <AUL_CLIENT_ADR>127.0.0.1</AUL_CLIENT_ADR> 
           <SMS_SENDER>SenderName</SMS_SENDER> 
           <SMS_TARGET>89999991111</SMS_TARGET> 
           <SMS_RES_COUNT>1</SMS_RES_COUNT> 
                   <SMS_TEXT>
                      <![CDATA[ Привет ]]> 
                 </SMS_TEXT>
           <SMSSTC_CODE>wait</SMSSTC_CODE> 
           <SMS_STATUS>Сообщение в процессе доставки</SMS_STATUS> 
           <SMS_CLOSED>0</SMS_CLOSED> 
           <SMS_SENT>0</SMS_SENT> 
        </MESSAGE>
     </MESSAGES>
</output>

Данные по сообщению:

  • SMS_ID — ID сообщения
  • SMS_GROUP_ID — ID рассылки сообщений
  • SMSTYPE — тип сообщения
  • CREATED — дата и время создания сообщения
  • AUL_USERNAME — Имя пользователя, создавшего сообщение
  • AUL_CLIENT_ADR — IP адрес пользователя, создавшего сообщение
  • SMS_SENDER — Имя отправителя сообщения
  • SMS_TARGET — Телефон адресата
  • SMS_RES_COUNT — Кол-во единиц ресурсов на данное сообщение
  • SMS_TEXT — Текст сообщения
  • SMSSTC_CODE — Код статуса доставки сообщения
  • SMS_STATUS — Текстовое описание статуса доставки сообщения
  • SMS_CLOSED — [0,1] 0 — сообщения находится в процессинге, 1 = работа по отправке сообщения завершена
  • SMS_SENT — [0,1] 0 — сообщение не отослано, 1 = сообщение отослано успешно
  • SMS_CALL_DURATION — Время, в течение которого было установлено соединение для отправки сообщения.
  • SMS_DTMF_DIGITS — Что пользователь нажимал в сеансе разговора (для SENDVOICE (в разработке))
  • SMS_CLOSE_TIME — Время завершения работы по сообщению.

Использование PHP-класса

<?php
 // Единый запрос 
 Include('QTSMS.class.php');
 $sms= new QTSMS('userX.Y','пароль');
 // !!! Команда на кеширование запросов
 $sms->start_multipost();    
 // Отправка смс 
 $sms->post_message('Привет', '+79999999991,+79999999992', 'Vasya');    
 // Отправка смс 
 $sms->post_message_phl('С днём рождения!', 'druzya', 'Petya', 'x425256');                           
 // данные о сообщении SMS_ID=6666
 $sms->status_sms_id(6666);
 // данные о сообщениях с SMS_GROUP_ID=110
 $sms->status_sms_group_id(110) ; 
 // !!! отправить всё одним запросом и получить результат в XML
 $r_xml=$sms->process();   
 header("Content-Type: text/xml; charset=UTF-8");
 echo $r_xml; // результат XML
?>

Пример 4. Получение баланса

Запрос

POST= (
    [user] => userX
    [pass] => ***    
    [action] => balance    
    [CLIENTADR] => 127.0.0.1    
    [HTTP_ACCEPT_LANGUAGE] => ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
)

Результат XML

<output>
     <BALANCE>
     <AGT_BALANCE>1000</AGT_BALANCE>    [текущее состояние счёта]
     <OVERDRAFT>100</OVERDRAFT>         [максимальных уход в минус]
     </BALANCE>
</output>

Использование PHP-класса

<?php
 Include('QTSMS.class.php');
 $sms= new QTSMS('XXXXX','пароль');
 
 // получение баланса
 $r_xml=$sms->get_balance();
 // результат в XML
 header("Content-Type: text/xml; charset=UTF-8");
 echo $r_xml; // результат XML
?>

Пример 5. Получение входящих сообщений.

Запрос

POST= (
    [user] => userX
    [pass] => ***    
    [action] => inbox
    [sib_num] => 123
    [date_from] => 12.01.2010 00:00:00
    [date_to] => 15.01.2010 12:00:00
)

Результат XML

<output>
  <RECEIVER AGT_ID="10XXX" DATE_REPORT="08.02.2010 14:10:42"/>
  <inbox>
    <MESSAGE SMS_ID="10001234235782138" SMSTYPE="RECVSMS">
      <CREATED>13.01.2010 18:08:29</CREATED>
      <SMS_SENDER>79670413211</SMS_SENDER>
      <SMS_TARGET>79037672810</SMS_TARGET>
      <SMS_RES_COUNT>1</SMS_RES_COUNT>
      <SMS_TEXT>test 1111</SMS_TEXT>
      <SMS_STATUS>N</SMS_STATUS>
    </MESSAGE>
    <MESSAGE SMS_ID="1000123312382134" SMSTYPE="RECVSMS">
      <CREATED>14.01.2010 18:03:03</CREATED>
      <SMS_SENDER>79670413211</SMS_SENDER>
      <SMS_TARGET>79037672810</SMS_TARGET>
      <SMS_RES_COUNT>1</SMS_RES_COUNT>
      <SMS_TEXT>qwerty 22</SMS_TEXT>
      <SMS_STATUS>N</SMS_STATUS>
    </MESSAGE>
  </inbox>
</output>

Использование PHP-класса

<?php
 Include('QTSMS.class.php');
 $sms= new QTSMS('XXXXX','пароль');
 
 // получение только новых входящих смс для ящика 134 
 $r_xml=$sms->inbox_sms(1, 134);
 // получение только новых входящих смс 
 // для ящика 134 c 10.01.2010 00:00:00  до 15.01.2010 00:00:00 
 // $r_xml=$sms->inbox_sms(0,134,'10.01.2010 00:00:00','15.01.2010 00:00:00'); 
 
 // результат в XML
 header("Content-Type: text/xml; charset=UTF-8");
 echo $r_xml; // результат XML
?>

Обработка ошибок

Коды ошибок тэга error:

  • -20117 Неправильный номер телефона.
  • -20170 Слишком большой текст сообщения. Максимальная длина не должна превышать 160 байт.
  • -20171 Не пройдена проверка текста сообщения на наличие недопустимых слов и/или фраз.
  • -20158 Отправитель или получатель в черном списке.
  • -20167 Сработало ограничение по отправке одинакового текста на один и тот же номер в течение небольшого промежутка времени. Обратитесь в поддержку, если хотите отключить или уменьшить период.
  • -20144 Нет доступного тарифа для запрашиваемого направления.
  • -20147 Нет подходящего тарифа у вышестоящего контрагента.
  • -20174 Политика маршрутизации не найдена.
  • -20154 Ошибка транспорта. При возникновении этой ошибки обратитесь в службу поддержки.
  • -20148 Не поддерживаемое направление.

qtsms.class.zip

Для работы с классом требуется PHP5

AJAX и кириллица

11.10.2010

У многих программистов (и у меня в частности), при знакомстве с «аяксом» может появится вопрос — «Как же правильно отправить на сервер запрос, содержащий знаки кириллицы?».

Отправляем

На самом деле всё довольно таки просто, ко всем (или только к необходимым) переменным перед отправкой надо применить функцию encodeURIComponent(). Эта функция переводит в UTF-8-кодировку все символы, кроме символов латинского алфавита и десятичных цифр.

Вот пример такой функции, отправляющей AJAX запрос к файлу ajax/file.php

function UpdateBlocks(obj)

{
var req;
req = newXMLHttp();
if (req) {
req.onreadystatechange = function()
{
if (req.readyState == 4 && req.status == 200)
{
respone = req.responseText;
obj.innerHTML = respone + obj.innerHTML;
}
};
req.open('POST', 'ajax/file.php', true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251');
req.send('blockid=' + encodeURIComponent(id) + '&Check=' + encodeURIComponent(i));
}
else
alert('Браузер не поддерживает AJAX');
}

Как видите в 16 строчке, переменные blockid и Check кодируются с помощью указанной выше функции.

Принимаем

При этом, в самом «ajax/file.php» при приёме переменных blockid и Check, их надо обратно из UTF-8 перевести в кодировку cp1251, теперь уже с помощью PHP функции iconv().

$blockid = iconv('UTF-8', 'windows-1251', $_POST['blockid']);

$Check = iconv('UTF-8', 'windows-1251', $_POST['Check'));

Вот и всё, а дальше уже можно обрабатывать эти данные как душе угодно.

И на последок о ещё одном полезном свойстве функции encodeURIComponent(). Если в качестве значения переменной id передать «12&text=15», то в итоге мы будем иметь не одну переменную id равной 12&text=15, а две, и это:

id=12 и text=15. А с использованием функции названой выше, такой проблемы не будет и данные сохранятся в целости и сохранности.

Популярные записи

  • #1

Кодировка XMLHTTP при передачи форм

Есть необходимость передать информацию формы на сервер через XMLHTTP в win1251.

Делаю это следующим образом:
xmlhttp.open(‘POST’, ‘ajax/ajaxaction.php’, true);
xmlhttp.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded;charset=windows-1251’);
xmlhttp.setRequestHeader(‘Accept-Charset’, ‘windows-1251’);
xmlhttp.setRequestHeader(‘Accept-Language’, ‘ru’);
xmlhttp.send(param);

но все равно кодировка получается UTF

как временное решение использую iconv, но мне все же кажется что правильней уже будет передовать информацию в нужной кодировке.

Подскажите, пожалуйста, где ошибка.

  • #2

header(«Content-type: text/plain; charset=windows-1251»);
header(«Cache-Control: no-store, no-cache, must-revalidate»);
header(«Cache-Control: post-check=0, pre-check=0», false);

  • #3

К сожадению при передачи информации в «text/plain» вместо «application/x-www-form-urlencoded» переменных вообще нет в массиве $_POST

Видимо это это какая то особенность AJAX

Автор оригинала: Romantik
header(«Content-type: text/plain; charset=windows-1251»);
header(«Cache-Control: no-store, no-cache, must-revalidate»);
header(«Cache-Control: post-check=0, pre-check=0», false);

  • #4

JavaScript — создан на юникоде, ему ненужны всякие вины, кои и изгои =)

  • #5

А исходная страница в какой кодировке ?

  • #6

Исходная страница в win1251

Автор оригинала: Skubent
А исходная страница в какой кодировке ?

  • #7

но все равно кодировка получается UTF

JavaScript — создан на юникоде, ему ненужны всякие вины, кои и изгои

если попробовать логически связать енти 2 фразы, чегонить на ум приходит?

  • #8

А простой POST от сраницы в нормальной кодировке приходит ?

  • #9

Да, кодировка совершенно нормальная в таком случае.

Автор оригинала: Skubent
А простой POST от сраницы в нормальной кодировке приходит ?

Понравилась статья? Поделить с друзьями:
  • Application frame host что это за процесс windows 10
  • Application frame host windows 10 как отключить
  • Application error что это за ошибка как исправить windows 10
  • Application error класс не зарегистрирован windows 7
  • Application error 1000 windows 10 что это