python - 如何在 Python 3 中为 xmlrpc.client 保留 cookie?

标签 python cookies python-3.x xmlrpclib

默认的 Python xmlrpc.client.Transport(可与 xmlrpc.client.ServerProxy 一起使用)不保留 cookie,基于 cookie 的登录有时需要这些 cookie。

例如,以下代理在与 TapaTalk API(login method 使用 cookie 进行身份验证)一起使用时,将在尝试修改帖子时给出权限错误。

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

some solutions适用于网络上的 Python 2,但它们与 Python 3 不兼容。

如何使用保留 cookie 的 Transport

最佳答案

GermainZ 的现有答案仅适用于 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'})

关于python - 如何在 Python 3 中为 xmlrpc.client 保留 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25876503/

相关文章:

Laravel Session 总是在 Laravel 5.4 中更改每次刷新/请求

unit-testing - cakephp 3 未定义属性 cookie 组件单元测试

python - 如何在 Mac OS X 上为 Python 3 安装 pip?

python - 查找字符串中相同相邻字符的数量

python - 给定一个树高列表,找到尽可能少的尝试将它们砍倒

python - 使用python计算电子邮件帐户中的邮件数量

python - 使用 Scrapy 抓取与 Ajax 隐藏的尺寸相关的数据

python - 如何检查元素是否在屏幕上完全可见?

firefox - Firefox插件可删除一个域的缓存和cookie?

python - exec()在函数python3.x中不起作用