LINUX.ORG.RU

Выгрузка запрещенных сайтов из реестра и versionNum=2 (Python)


2

4

Добрый день!

Думаю не я один столкнулся с проблемой выгрузки реестра запрещенных сайтов в новом формате.

Многие использовали готовый скрипт:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yegorov-p.ru
from xml.etree.ElementTree import ElementTree
from datetime import datetime,timedelta
from zapretinfo import ZapretInfo
import time
import zipfile
from base64 import b64decode


XML_FILE_NAME = "zapros.xml"
P7S_FILE_NAME = "zapros.xml.p7s"

#Если файлик ранее выгружался, то пробуем получить из него данные
try:
    ts=ElementTree().parse("dump.xml").attrib['updateTime']
    dt = datetime.strptime(ts[:19],'%Y-%m-%dT%H:%M:%S')
    fromFile=int(time.mktime(dt.timetuple()))
except:
    fromFile=0

opener=ZapretInfo()
#print opener.sendRequest(XML_FILE_NAME,P7S_FILE_NAME)


#Проверяем, изменился ли файлик
if opener.getLastDumpDate()/1000<>fromFile:
    #Файлик изменился. Отправляем запрос на выгрузку
    request=opener.sendRequest(XML_FILE_NAME,P7S_FILE_NAME)
    #Проверяем, принят ли запрос к обработке
    if request['result']:
        #Запрос не принят, получен код
        code=request['code']
        print 'Got code %s' % (code)
        print 'Trying to get result...'
        while 1:
            #Пытаемся получить архив по коду
            request=opener.getResult(code)
            if request['result']:
                #Архив получен, скачиваем его и распаковываем
                print 'Got it!'
                file = open('result.zip', "wb")
                file.write(b64decode(request['registerZipArchive']))
                file.close()

                zip_file = zipfile.ZipFile('result.zip', 'r')
                zip_file.extract('dump.xml', '')
                zip_file.close()
                break
            else:
                #Архив не получен, проверяем причину.
                if request['resultComment']=='запрос обрабатывается':
                    #Если это сообщение об обработке запроса, то просто ждем минутку.
                    print 'Not ready yet.'
                    time.sleep(60)
                else:
                    #Если это любая другая ошибка, выводим ее и прекращаем работу
                    print 'Error: %s' % request['resultComment']
                    break
    else:
        #Запрос не принят, возвращаем ошибку
        print 'Error: %s' % request['resultComment']
else:
    print 'No updates'

Все до недавнего времени было хорошо и комфортно, но силовики ввели некий параметр versionNum=2, который предоставляет выгрузку реестра в новом формате (небольшие изменения в контенте):

4. Для автоматизированного получения выгрузки в новом формате будет модифицирован веб-сервис – для метода sendRequest будет введен новый необязательный параметр versionNum. Если этот параметр не указан, либо указано значение versionNum=1, то будет возвращаться выгрузка в текущем формате, которая будет содержать данные только по реестрам 1-3. При указании versionNum=2 будет возвращаться выгрузка в новом формате, содержащая данные по всем реестрам. В течение некоторого времени (1-2 месяца) будет поддерживаться предоставление выгрузки как в старом, так и в новом формате. На стороне Роскомнадзора будет происходить мониторинг обращений и определение используемой версии. Операторам связи необходимо будет как можно оперативное модернизировать своё ПО и перейти на использование нового формата выгрузки. После завершения переходного периода запрос выгрузки в старом формате будет запрещен – при подаче запроса на получение выгрузки без указания номера версии или при указании versionNum=1 будет выдаваться сообщение о невозможности предоставления выгрузки в данном формате. При таких изменениях в веб-сервисе во время переходного периода существующий у операторов связи софт для получения выгрузки продолжит работать корректно, что позволит осуществить плавный переход к новому формату без прекращения блокировок по действующим реестрам 1-3.

В большинстве случаев админы мало знакомы с Питоном и сейчас у многих ступор куда и как в sendRequest впихнуть данный параметр.

Гуру help!!!

python.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import suds
from base64 import b64encode

API_URL = "http://vigruzki.rkn.gov.ru/services/OperatorRequestTest/?wsdl"

class ZapretInfo:
    def getLastDumpDate(self):
        client = suds.client.Client(API_URL)
	# result=client.service.getLastDumpDate()
        # return result
        # ЗАМЕНЯЕМ НА v
        result=client.service.getLastDumpDateEx()
        return result.lastDumpDate



    def sendRequest(self,requestFile,signatureFile):
        file = open(requestFile, "rb")
        data = file.read()
        file.close()
        xml = b64encode(data)

        file = open(signatureFile, "rb")
        data = file.readlines()
        file.close()

        if '-----' in data[0]:
            sert = ''.join(data[1:-1])
        else:
            #sert = ''.join(data)
            sert = b64encode(''.join(data))

        client = suds.client.Client(API_URL)
        # result=client.service.sendRequest(xml,sert)
        # МЕНЯЕМ НА v
        result=client.service.sendRequest(xml,sert,"2.0")

        return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result)

    def getResult(self,code):
        client = suds.client.Client(API_URL)
        result=client.service.getResult(code)

        return dict(((k, v.encode('utf-8')) if isinstance(v, suds.sax.text.Text) else (k, v)) for (k, v) in result)

kolap
()
Ответ на: комментарий от kolap

Спасибо, помогло, может развить тему и доработать анализ выгрузки ?

anonymous
()

request=opener.sendRequest(XML_FILE_NAME,P7S_FILE_NAME, '2.0')

anonymous
()
Ответ на: комментарий от user_id_68054

Если узнают - сильно надают по шапке, но это не останавливает толковых людей - на гитхабе лежит синкающееся зеркало реестра в открытом виде и без огорожений в виде бАНАЛЬНОГО API с авторизацией по сертификату

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.