:: Visual Foxpro, Foxpro for DOS
Re: http://egrul.nalog.ru/
Евгений Банщиков

Сообщений: 218
Откуда: Kurgan
Дата регистрации: 09.04.2004
Равиль
Похоже надо открывать горячую линию по этой теме, чтобы вовремя реагировать на изменения на сайте egrul.nalog.ru
Надеюсь когда нибудь разработчики ПО для ФНС остановятся , а то их творческий энтузиазм начинает утомлять.

Данные приходят в json формате. Кодировка - это utf-8 , но в специальном json представлении.

Для декодирования можно воспользоваться такой функцией :
*-----------------------
Function Json_To_Win1251
*------------------------
Lparameters m.cText
Local m.cJson,m.cWin1251,m.nIndex
m.cWin1251="А,а,Б,б,В,в,Г,г,Д,д,Е,е,Ё,ё,Ж,ж,З,з,И,и,Й,й,К,к,Л,л,М,м,Н,н,О,о,П,п,Р,р,С,с,Т,т,У,у,Ф,ф,Х,х,Ц,ц,Ч,ч,Ш,ш,Щ,щ,Ъ,ъ,Ы,ы,Ь,ь,Э,э,Ю,ю,Я,я"
m.cJson="u0410,u0430,u0411,u0431,u0412,u0432,u0413,u0433,u0414,u0434,u0415,u0435,u0401,u0451,u0416,u0436,u0417,u0437,u0418,u0438,u0419,u0439,u041a,u043a,"
m.cJson=m.cJson+"u041b,u043b,u041c,u043c,u041d,u043d,u041e,u043e,u041f,u043f,u0420,u0440,u0421,u0441,u0422,u0442,u0423,u0443,u0424,u0444,u0425,u0445,;
u0426,u0446,u0427,u0447,u0428,u0448,u0429,u0449,u042a,u044a,u042d,u044b,u042c,u044c,u042d,u044d,u042e,u044e,u042f,u044f"
For m.nIndex=1 To Getwordcount(m.cJson,',')
m.cText=Strtran(m.cText,'\'+Getwordnum(m.cJson,m.nIndex,','),Getwordnum(m.cWin1251,m.nIndex,','))
Endfor
Return m.cText

К сожалению , встроеного в win парсера для json нет , поэтому надо изворачиваться самим , например так :

*----------------------
Function Get_Json_Value
*-----------------------
Lparameters m.cText,m.cKey,m.lChar
m.cKey='"'+m.cKey+'":'
m.cText=Substr(m.cText,At_c(m.cKey,m.cText)+Len(m.cKey) )
If m.lChar
m.cText=Substr(m.cText,2,at('"',m.cText,2)-2)
m.cText=Strtran(m.cText,["],'"')
Else
m.cText=Substr(m.cText,1,at(',',m.cText,1)-1)
Endif
Return m.cText

и пример парсинга

m.cBody=Json_To_Win1251(oXMLHTTP.responseText)
If Getwordnum(m.cBody,1,':')=='{"errors"'
If Get_Json_Value(m.cBody,"code")=='0'
m.cFound=Get_Json_Value(m.cBody,"found")
If m.cFound=='1'
Thisform.ogrn.value=Get_Json_Value(m.cBody,"ogrn",.t.)
Thisform.kpp.value= Get_Json_Value(m.cBody,"kpp",.t.)
.....
Else
=messageb(Iif(m.cFound=='0','Юр. лицо с таким ИНН не найдено в реестре !','По этим реквизитам найдено несколько Юр. Лиц'))
Endif
Else
=messageb(Get_Json_Value(m.cBody,"msg",.t.))
Endif
Else
=messageb('Опять эти черти поменяли формат !')
Endif
Ratings: 0 negative/0 positive
Re: http://egrul.nalog.ru/
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Через Strtran да GETWORDNUM очень уж неэффективно получается. Плюс к тому все символы вне описанного диапазона идут лесом - IMHO лучше "посимвольно" разбирать. Нечто типа
FUNCTION DecodeHTMLText
LPARAMETERS tcText
LOCAL lcRes, lnPos
lcRes = ""
lnPos = 1
DO WHILE m.lnPos < LEN(m.tcText)
IF SUBSTR(m.tcText, m.lnPos, 2) = "\u"
lcRes = m.lcRes + STRCONV(STRCONV(SUBSTR(m.tcText, m.lnPos + 4, 2) + SUBSTR(m.tcText, m.lnPos + 2, 2), 16), 6)
lnPos = m.lnPos + 6
ELSE
lcRes = m.lcRes + SUBSTR(m.tcText, m.lnPos, 1)
lnPos = m.lnPos + 1
ENDIF
ENDDO
RETURN m.lcRes

P.S. И это не UTF-8, это Си-подобно экранированный UTF-16. САМ json вроде как по стандарту должен передаваться в UTF8, но в данном случае имеет место банальный ANSI - все символы с кодами выше 128 заэкранированы в \u


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 19.04.12 20:21
Ratings: 0 negative/0 positive
Re: http://egrul.nalog.ru/
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Тоже, приложу "для истории" (де)кодеры, почти все оказались нужны для получения инф. из интернет. Без претензии на эффективность. Основная идея STRINGencoder - возможность задавать последовательность нескольких преобразований, списком, когда новые преобразования придумаются, я туда просто еше один (два) CASE допишу...


...и подпрограмма извлечения числа из строки/памяти iSUBSTR (без нее можно было обойтись):
Ratings: 0 negative/0 positive
Re: http://egrul.nalog.ru/
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Да, кстати, непонятно (праздные, наверное, вопросы):

- зачем на одной интернет-странице (на сабже) используются несколько разных кодировок? непроизвольно при разработке страницы, или это вообще неуправляемый разработчиком процесс в разных "пхп,жквери,аяксах"?

- зачем разработчики на этой странице (на сабже) стали усложнять процесс получения рисунка капчи, применять какой-то хитрый механизм возврата данных на страницу - просто так, или для сокрытия от роботов? Разве просто наличие капчи не есть достаточная защита от роботов?

- можно ли так закодировать возвращаемую информацию, например зашифровать по ключу, хоть по коду капчи, чтобы информация была вообще глазу "непонятна", а скрипты страницы ее расшифруют и правильно изобразят на экране? Тогда без запуска скриптов (или запуска IE) вообще нельзя будет разобрать ответ сервера...
Ratings: 0 negative/0 positive
Re: http://egrul.nalog.ru/
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Думаю что хотели сделать "по взрослому" - без дурацкого полного перезапроса всей страницы для обновления лишь небольшого её кусочка. Уж для капчи это практически везде делают - если предложенная капча не читается, то можно запросить другую - тянуть же при этом и всё прочее - нехорошо.
А уж что они положили с прибором на всяких "роботов" пользующих сайт внутри программ - так полное их право. Они, в конце концов, не АПИ предоставляют для поиска по базе Думаю что следующим логичным шагом было бы именно предоставление удобного программного интерфейса (веб сервис, например) - но за денежку


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: http://egrul.nalog.ru/
Alsim

Сообщений: 3636
Откуда: Екатеринбург
Дата регистрации: 17.11.2004
Евгений Банщиков
Для декодирования можно воспользоваться такой функцией :
*-----------------------
Function Json_To_Win1251
Огромное спасибо!Очень выручила функция! Нашёл ошибку, u042d пишет "Ы" вместо "Э".
заменил первую u042d (их там две) на u042b
то есть вот так правильно
Удачи!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 34 (Гостей: 34)

© 2000-2024 Fox Club 
Яндекс.Метрика