默认的Pythonxmlrpc.client.Transport(可与xmlrpc.client.ServerProxy一起使用)不保留cookie,这有时是基于cookie的登录所必需的。
例如,下面的代理与tapantalk api一起使用时(对于该api,login method使用cookies进行身份验证),在尝试修改post时将给出权限错误。

proxy = xmlrpc.client.ServerProxy(URL, xmlrpc.client.Transport())

网络上有python 2的some solutions,但它们与python 3不兼容。
如何使用保留cookies的Transport

最佳答案

来自GeMeNZ的现有答案仅用于HTTP。经过长时间的努力,有了HTTPS的改编注意context选项,这一点至关重要。

class CookiesTransport(xmlrpc.client.SafeTransport):
    """A SafeTransport (HTTPS) subclass that retains cookies over its lifetime."""

    # Note context option - it's required for success
    def __init__(self, context=None):
        super().__init__(context=context)
        self._cookies = []

    def send_headers(self, connection, headers):
        if self._cookies:
            connection.putheader("Cookie", "; ".join(self._cookies))
        super().send_headers(connection, headers)

    def parse_response(self, response):
        # This check is required if in some responses we receive no cookies at all
        if response.msg.get_all("Set-Cookie"):
            for header in response.msg.get_all("Set-Cookie"):
                cookie = header.split(";", 1)[0]
                self._cookies.append(cookie)
        return super().parse_response(response)

原因是,如果指定了传输,那么serverproxy不尊重与传输相关的context选项,因此我们需要在传输构造函数中直接使用它。
用法:
import xmlrpc.client
import ssl


transport = CookiesTransport(context=ssl._create_unverified_context())
# Note the closing slash in address as well, very important
server = xmlrpc.client.ServerProxy("https://<api_link>/", transport=transport)

# do stuff with server
server.myApiFunc({'param1': 'x', 'param2': 'y'})

09-25 20:35