【问题标题】:POST request (python) - invalid requestPOST 请求 (python) - 无效请求
【发布时间】:2018-08-03 22:34:33
【问题描述】:

我正在尝试使用媒体 ID 注册表的 API(EIDR)来下载电视节目信息。我希望能够自动查询许多节目。我在如何使用 API 方面没有经验,而且这个特定的 documentation 非常不透明。我在 Ubuntu 16.04 中使用 python 3(请求库)。

我尝试发送特定电视节目的请求。我从浏览器中获取了标头和参数信息,例如,我从浏览器中进行了查询(我查找了“anderson cooper 360”from this page),然后查看了浏览器页面的“网络”选项卡中的信息检查员。我使用了以下代码:

import requests
url = 'https://resolve.eidr.org/EIDR/query/'

headers = {'Host': 'ui.eidr.org', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) \ 
Gecko/20100101 Firefox/58.0', \ 
'Accept': '*/*', \ 
'Accept-Language': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', \ 
'Referer': 'https://ui.eidr.org/search/results/19c70c63d73790b86f3fb385f2a9b3f4', \ 
'Cookie': 'ci_session=f4tnbi8qm7oaq30agjtn8p69j91s4li4; \ 
_ga=GA1.2.1738620664.1519337357; _gid=GA1.2.1368695940.1519337357; _gat=1', \ 
'Connection': 'keep-alive'}

params = {'search_page_size':25, 'CustomAsciiSearch[_v]':1, \ 
'search_type':'content', 'ResourceName[_v]':'anderson cooper 360', \ 
'AlternateResourceNameAddition[_v]':1, \ 
'AssociatedOrgAlternateNameAddition[_v]':1, 'Status[_v]':'valid'}

r = requests.post(url, data=params, headers=headers)
print(r.text)

我收到的回复基本上说这是一个无效请求:

<?xml version="1.0" encoding="UTF-8"?><Response \ 
xmlns="http://www.eidr.org/schema" version="2.1.0"><Status>\ 
<Code>3</Code><Type>invalid request</Type></Status></Response>

现在,我在this Stackoverflow question 的回答中读到我应该以某种方式使用会话对象。答案中建议的代码 Padraic Cunningham 是这样的:

headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:46.0) \ 
Gecko/20100101 Firefox/46.0','X-Requested-With': 'XMLHttpRequest', \ 
"referer": "https://www.hackerearth.com/challenges/"}

with requests.Session() as s:
    s.get("https://www.hackerearth.com")
    headers["X-CSRFToken"] = s.cookies["csrftoken"]
    r = s.post("https://www.hackerearth.com/AJAX/filter-challenges/?modern=true", \
    headers=headers, files={'submit': (None, 'True')})
    print(r.json())

所以我知道我应该以某种方式使用它,但我不完全理解为什么或如何。

所以我的问题是:

1) 在这种情况下,“无效请求”是什么意思?

2) 你对如何编写请求有什么建议吗?

3) 你知道我应该怎么做才能在此处正确使用会话对象吗?

谢谢!

【问题讨论】:

    标签: python api session post python-requests


    【解决方案1】:

    你可能需要this documentation

    1) 来自文档:

    无效请求:不存在的 API (URI),包括缺少必需的 范围。还可能包括对有效的 HTTP 操作的错误 URI(例如注册时的 GET)。也可以是 POST 多部分 语法无效的数据,例如缺少必需的标头或 如果行尾字符不是 CR-LF。

    2) 据我了解,此 API 接受 XML 请求。查看在网页上单击“查看 XML”后出现的结果 (https://ui.eidr.org/search/results)。对于“anderson cooper 360”,您可以像这样在 Python 中使用 XML 数据:

    import requests
    import xml.etree.ElementTree as ET
    
    url = 'https://resolve.eidr.org/EIDR/query/'
    
    headers =  {'Content-Type': 'text/xml',
        'Authorization': 'Eidr 10.5238/webui:10.5237/D4C9-7E59:9kDMO4+lpsZGUIl8doWMdw==',
        'EIDR-Version': '2.1'}
    xml_query = """<Request xmlns="http://www.eidr.org/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Operation>
                <Query>
                        <Expression><![CDATA[ASCII(((/FullMetadata/BaseObjectData/ResourceName "anderson" AND /FullMetadata/BaseObjectData/ResourceName "cooper" AND /FullMetadata/BaseObjectData/ResourceName "360") OR (/FullMetadata/BaseObjectData/AlternateResourceName "anderson" AND /FullMetadata/BaseObjectData/AlternateResourceName "cooper" AND /FullMetadata/BaseObjectData/AlternateResourceName "360")) AND /FullMetadata/BaseObjectData/Status "valid")]]></Expression>
                        <PageNumber>1</PageNumber>
                        <PageSize>25</PageSize>
                </Query>
        </Operation>
    </Request>"""
    r = requests.post(url, data=xml_query, headers=headers)
    root = ET.fromstring(r.text)
    for sm in root.findall('.//{http://www.eidr.org/schema}SimpleMetadata'):
        print({ch.tag.replace('{http://www.eidr.org/schema}',''):ch.text for ch in sm.getchildren()})
    

    3) 我认为您不需要会话对象。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2020-04-27
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多