Ccxt: 第一次请求后更改 aiohttp_proxy 无效

创建于 2018-02-27  ·  3评论  ·  资料来源: ccxt/ccxt

  • 操作系统:Windows
  • 编程语言版本:Python async
  • CCXT版本:1201

第一次请求后更改 aiohttp_proxy 无效。 如果它设置在第一个(例如) await e.load_markets() ,则不会使用它。 如果它在第一个await e.load_markets()之前设置,它将继续转到该代理服务器,如果您稍后将 aiohttp_proxy 更改为另一个代理服务器。

解决这个问题的最简单方法是什么? 调用close()并覆盖会话变量? 和/或这是需要在 ccxt 中修复的东西(例如,添加另一种方法来重新启动会话)

import ccxt.async as ccxt
import asyncio
import test2_config as config


async def main():
    exchange = 'gatecoin'
    e = getattr(ccxt, exchange)()
    e.verbose = True
    e.apiKey = config.exchange_keys[exchange]['key']
    e.secret = config.exchange_keys[exchange]['secret']
    e.aiohttp_proxy = 'http://' + config.check_proxylist[0]['host'] + ':' + config.check_proxylist[0]['port']
    await e.load_markets(reload=True)
    e.aiohttp_proxy = 'http://' + config.transaction_proxy['host'] + ':' + config.transaction_proxy['port']
    await e.load_markets(reload=True)
    await e.close()


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

详细输出

Request: GET https://api.gatecoin.com/Public/LiveTickers {'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate'} None

Response: GET https://api.gatecoin.com/Public/LiveTickers 200 <CIMultiDictProxy('Date': 'Tue, 27 Feb 2018 18:15:41 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=<snip>; expires=Wed, 27-Feb-19 18:15:40 GMT; path=/; domain=.gatecoin.com; HttpOnly', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains; preload', 'X-Content-Type-Options': 'nosniff', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '<snip>-DUB')> <snip>

Request: GET https://api.gatecoin.com/Public/LiveTickers {'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate'} None

Response: GET https://api.gatecoin.com/Public/LiveTickers 200 <CIMultiDictProxy('Date': 'Tue, 27 Feb 2018 18:15:41 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Cache-Control': 'private', 'Content-Encoding': 'gzip', 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains; preload', 'X-Content-Type-Options': 'nosniff', 'Expect-CT': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': '<snip>-DUB')> <snip>
question

所有3条评论

显然代理按 TCP 连接工作。 如果它没有关闭,则正在使用以前的代理。 如果我添加
headers['Connection'] = 'close'到基础交换类中的 fetch 方法(对于异步),代理轮换按预期工作,因为 TCP 连接在第一个请求后关闭。 如果未添加该标头,则与前一个代理的 TCP 连接保持打开状态,并且 aiohttp 会重用该连接,而不管新的 aiohttp_proxy。

因此,行为可能会因代理和交换而异,具体取决于它们是否/如何实现 keepalive。

不过,我找不到注入headers['Connection'] = 'close'的“干净”方式。

不过,我找不到一种“干净”的方式来注入 headers['Connection'] = 'close'。

在发出调用之前或在创建交换实例之后添加exchange.headers = {'Connection': 'close'}


# option 1
exchange = ccxt.gatecoin({'headers': {'Connection': 'close'}})

# option 2
exchange = ccxt.gatecoin()
exchange.headers = {'Connection': 'close'}

如果它没有帮助,请告诉我们。 谢谢!

似乎有效,谢谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

luigikitten picture luigikitten  ·  3评论

gemini100 picture gemini100  ·  3评论

jjhesk picture jjhesk  ·  3评论

forexhill picture forexhill  ·  3评论

hippylover picture hippylover  ·  3评论