【问题标题】:Postman API request in PythonPython 中的 Postman API 请求
【发布时间】:2022-09-23 16:29:57
【问题描述】:

我正在尝试从https://www.mcmaster.com 抓取数据。他们为我提供了一个 .pfx 文件和一个密码。当使用他们的 .json 文件对 Postman 发出 GET 请求时,我输入了我的网站登录名/密码并上传了带有密码的 .pfx 证书,一切正常。现在我正在尝试用 Python 做同样的事情,但有点不确定。

这是我当前的 Python 代码,我不确定将网站电子邮件/密码登录放在哪里以及如何成功执行 GET 请求。

import requests_pkcs12
from requests_pkcs12 import get

r = get(\'https://api.mcmaster.com/v1/login\', pkcs12_filename=\'Schallert.pfx\', pkcs12_password=\'mcmasterAPI@1901\')

response = requests_pkcs12.get(r)

print(response.text)

这是我在 Postman 中设置的方法(网站电子邮件/密码登录)

.PFX 证书页面

    标签: python api postman pfx


    【解决方案1】:

    Postman 有一个内置功能,可以将请求转换为代码。你可以这样做:

    1. 在最右侧单击代码片段按钮 (</>)
    2. 进入该页面后,有两个可用的 python 选项
    3. 然后您只需将代码复制到 Python 文件中并添加所有自定义项(应该已经优化)

      我要警告你的一件事是 URL。邮递员不添加 http:// 或 https:// 到 URL,这意味着 Python 将抛出 No 方案提供的错误。

      自动转换的可用软件包:

      1. 请求
      2. http.client

        这意味着您将不得不使用不同的包而不是 requests_pkcs12

    【讨论】:

    • 我完全按照您所说的做了,并从“代码片段按钮”复制并粘贴了代码,但它在 Python 中给了我一个错误。是因为我缺少 .pfx 文件吗? import requests url = "https://api.mcmaster.com/v1/login" payload = "{\n \"UserName\":\"purchasing@schallertenterprises.com\",\n \"Password\":\"PASSWORD123\"\n}" headers = { 'Authorization': 'Bearer RVVZbEs284796820187waFZrVGFBZ3E0a3VwQXJESTlnOWI0P=', 'Content-Type': 'text/plain' } response = requests.request("POST", url, headers=headers, data=payload) print(response.text)
    • 使用请求和 http.client 我收到 SSL 证书问题/错误
    【解决方案2】:

    在快速的网络搜索之后,您似乎需要创建一个临时证书作为.pem 文件,然后将其传递给请求。

    from contextlib import contextmanager
    from pathlib import Path
    from tempfile import NamedTemporaryFile
    
    import requests
    from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption
    from cryptography.hazmat.primitives.serialization.pkcs12 import load_key_and_certificates
    
    
    @contextmanager
    def pfx_to_pem(pfx_path, pfx_password):
        pfx = Path(pfx_path).read_bytes()
        private_key, main_cert, add_certs = load_key_and_certificates(pfx, pfx_password.encode('utf-8'), None)
    
        with NamedTemporaryFile(suffix='.pem') as t_pem:
            with open(t_pem.name, 'wb') as pem_file:
                pem_file.write(private_key.private_bytes(Encoding.PEM, PrivateFormat.PKCS8, NoEncryption()))
                pem_file.write(main_cert.public_bytes(Encoding.PEM))
                for ca in add_certs:
                    pem_file.write(ca.public_bytes(Encoding.PEM))
            yield t_pem.name
    
    with pfx_to_pem('your pfx file path', 'your passphrase') as cert:
        requests.get(url, cert=cert, data=payload)
    

    【讨论】:

    • 我是否只是将此代码包含在 Postman 的 python 代码中?
    • 我还可以在哪里使用我的网站登录信息?
    • @Kaevonz 在标题中传递身份验证详细信息
    • 我有点困惑你能告诉我吗?
    【解决方案3】:

    requests_pkcs12 是写在requests 包之上的包装器。因此,所有接受requests 的参数都将被requests_pkcs12 接受。

    这是源代码证明。 https://github.com/m-click/requests_pkcs12/blob/master/requests_pkcs12.py#L156

    另外,从您的屏幕截图中,我了解到您使用的是POST 而不是GET

    import json
    from requests_pkcs12 import post
    
    url = "https://api.mcmaster.com/v1/login"
    payload = {'Username': 'yourusername',
               'Password': 'yourpassword'}
    
    resp = post(url, pkcs12_filename='Schallert.pfx', pkcs12_password='mcmasterAPI@1901', data=json.dumps(payload))
    print(resp)
    

    脚注:希望密码mcmasterAPI@1901是假的。如果不是,请不要在平台上分享任何凭据。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2022-07-04
      • 2020-02-17
      • 2019-06-21
      • 2014-11-19
      • 2021-08-22
      • 1970-01-01
      • 2021-10-05
      • 2023-02-10
      相关资源
      最近更新 更多