Получение реестра запрещенных сайтов

Вот такая задача стоит — получить файл из реестра запрещенных сайтов.
Используется дока zapret-info.gov.ru/docs/description_for_operators_2012-10-30v1.3.pdf

Логика: выполнить метод getLastDumpDate, определим свежесть реестра. Если реестр свежий, отправляем файл запроса и отсоединенную ЭП. в методе sendRequest. В ответ получаем код в виде набора символов, типа такого: «66a7d767cbe88d6bfeb8c9e9790e77be». Этот код надо скормить методу getResult, который в ответ вернет файл в виде ZIP-архива. Вот тут и загвоздка — если сразу выполнить этот метод после получения кода, метод отвечает "запрос обрабатывается", то есть типа все хорошо — в доке указано, что метод getResult надо выполнить через несколько минут. Выполняю этот метод через несколько минут — он отвечает: "Ошибка! некорректное значение ЭП".

Может кто-нибудь из сообщества решал эту задачу, и решил ее? Буду благодарен за помощь.

Использую Perl + SOAP::Lite

Кратко основные моменты кода:

open FREQ, '<', 'request.xml';
open FSIG, '<', 'request.xml.sig';

$sig = <FSIG>;
$req = <FREQ>;

close FREQ;
close FSIG;

# Отправка запроса и электронной подписи
$soap = SOAP::Lite->service("http://www.zapret-info.gov.ru/services/OperatorRequest/?wsdl");
my @params =  (
    SOAP::Data->name( 'requestFile' )->type("string")->value($req),
    SOAP::Data->name( 'signatureFile')->type("xsd:base64Binary")->value($sig),
);
my $result = $soap->call( sendRequest =>  @params );
my $code = $result->body->{sendRequestResponse}->{code};

# Попытка получить файл реестра - оправляем полученный $code
my @params =  ( SOAP::Data->name( 'code' )->type("xsd:string")->value( $code ) );
my $resultFile = $soap->call( getResult =>  @params );

# При немедленном запуске этого метода скажет "запрос обрабатывается". При запуске по истечении нескольких минут - "некорректное значение ЭП"
print $resultFile->body->{getResultResponse}->{resultComment};
  • Вопрос задан
  • 16559 просмотров
Решения вопроса 1
Den_CH
@Den_CH Автор вопроса
stalkerxxl, спасибо, поправил.

Задачу решил — моя невнимательность. Включил «use SOAP::Lite;# qw(trace);», и увидел, что файл запроса уходит в непотребном виде.
SOAP::Data->name( 'requestFile' )->type("string")->value($req),

переделана в
SOAP::Data->name( 'requestFile' )->type("xsd:base64Binary")->value( encode_base64($req) ),


был введен в заблуждение тем обстоятельством, что код таки возвращался методом sendRequest, хотя я предполагал ошибку, считая, что файл запроса и сигнатура сравниваются в методе sendRequest. По всей видимости, сравнение идет при выполнении метода getResult. В общем, с ног на голову перевернуто все…
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы