在 Python 中对捷克贸易许可登记册 (RŽP) 执行 XML-请求

Performing a XML-Request against Czech Trade Licensing Register(RŽP) in Python

我需要创建一个函数,它将发送 xml 和 post 请求并在 python 中接收它。 在 official site 上(仅在捷克语中可用)只有 html 形式的这个小代码:

<form name="frmdata" method="post" enctype="multipart/form-data" 
   action="http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh">
      <input type="hidden" name="VSS_SERV" value="ZVWSBJXML">
      <input type="file" name="filename">
      <input type="submit" name="x" value="ODESLI">
</form>

所以我试图将它像这样转换为 python,以实现自动化,但它不起作用:

headers = {'Content-Type':'text/xml'}
url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'

with open('dotaz1.txt') as xml:
    myobj = {   'VSS_SERV': 'ZVWSBJXML',
                'X': 'ODESLI',
                'file': xml,
             }

    x = requests.post(url, data = myobj, headers=headers)

有人知道我做错了什么吗?

我收到了一个有效的响应,代码如下:

import requests

url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'

if __name__ == '__main__':
    with open('query.xml') as xml:
        request_data = {
            'VSS_SERV': 'ZVWSBJXML',
            'filenameList': xml
        }

        response = requests.post(url, data=request_data)
        print(f"status code: {response.status_code}")
        print(f"response:\n{response.text}")

请注意:参数filenameList与官方API文档不同。但是,使用 filename 的描述值会导致服务器做出非常具体的响应:

Multiple definitions of filename encountered in input. If you're trying to do this intentionally (such as with select), the variable must have a "List" suffix.

我相应地更改了请求并得到了有效的 XML 响应。 进一步注意,我 不是 设置显式 HTTP 处理程序,而是让请求模块选择适当的 headers。看起来这很好用——只要你使用 filenameList。网上有提到这个问题。只需 google 引用错误消息,您就会找到几个结果。似乎通过选择 完全 正确的 HTTP headers 您还可以提供 filename 属性。

我在这个 github 存储库中找到了一些帮助:https://github.com/f4z4onZH27/rzp

我忍不住要引用它的自述文件:

So, here we are, fixing government’s and major vendor’s incompetency.

所以我终于得到了答案。我从这个 post 中得到了一些灵​​感,其中有一个 C# 的实现:

至于 python,诀窍在于将其作为文件发送,因为它不接受其他格式。此外,我的代码中的 text 变量需要显示格式。你不能从顶部替换文本,否则会出错。

代码:

import requests

url = 'http://www.rzp.cz/cgi-bin/aps_cacheWEB.sh'

text = """<?xml version="1.0" encoding="UTF-8"?>
<VerejnyWebDotaz xmlns="urn:cz:isvs:rzp:schemas:VerejnaCast:v1" version="2.8">
   <Kriteria>
     <IdentifikacniCislo>75848899</IdentifikacniCislo>
     <PlatnostZaznamu>0</PlatnostZaznamu>
   </Kriteria>
</VerejnyWebDotaz>
"""


if __name__ == '__main__':
with open('query.xml', 'r+') as xml:
    xml.truncate(0)
    xml.write(text)
    xml.seek(0)
    request_data = {
        'VSS_SERV': 'ZVWSBJXML',
    }

    response = requests.post(url, data=request_data, files={'filename' : xml})
    print(f"status code: {response.status_code}")
    print(f"response:\n{response.text}")

要将其用于自动化,您需要做的就是动态更改主题的 ID (IdentifikacniCislo)