默认Pythonxmlrpc.client.Transport
(可与xmlrpc.client.ServerProxy
) 不保留 cookie,而基于 cookie 的登录有时需要 cookie。
例如,以下代理与 TapaTalk API 一起使用时(对于该代理login method https://tapatalk.com/api/api_section.php?id=2#login使用 cookies 进行身份验证),在尝试修改帖子时会给出权限错误。
proxy = xmlrpc.client.ServerProxy(URL, xmlrpc.client.Transport())
有一些解决方案 http://www.lunch.org.uk/wiki/xmlrpccookies适用于网络上的 Python 2,但它们与 Python 3 不兼容。
我怎样才能使用Transport
保留cookies?
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
与传输相关的选项,如果指定了传输,那么我们需要直接在传输构造函数中使用它。
Usage:
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'})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)