Alterar aiohttp_proxy após a primeira solicitação não tem efeito. Se for definido após o primeiro (por exemplo) await e.load_markets()
, não será usado. Se for definido antes do primeiro await e.load_markets()
, ele continuará indo para aquele servidor proxy, também se você alterar o aiohttp_proxy para outro servidor proxy posteriormente.
Qual é a maneira mais fácil de consertar isso? chamar close()
e sobrescrever a variável de sessão? E / ou isso é algo que precisa ser corrigido no ccxt (por exemplo, adicione outro método para reiniciar a sessão)
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())
Saída detalhada
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>
Aparentemente, o proxy funciona por conexão TCP. Se não estiver fechado, os proxies anteriores estão sendo usados. Se eu adicionar
headers['Connection'] = 'close'
para o método fetch na classe de troca base (para async), a rotação do proxy funciona conforme o esperado porque a conexão TCP é fechada após a primeira solicitação. Quando esse cabeçalho não é adicionado, a conexão TCP com o proxy anterior permanece aberta e o aiohttp a reutiliza, independentemente do novo aiohttp_proxy.
Portanto, o comportamento pode ser diferente dependendo do proxy e da troca, dependendo se / como eles implementam o keepalive.
No entanto, não consigo encontrar uma maneira 'limpa' de injetar headers['Connection'] = 'close'
.
Não consigo encontrar uma maneira 'limpa' de injetar cabeçalhos ['Conexão'] = 'fechar'.
Adicione exchange.headers = {'Connection': 'close'}
antes de emitir a chamada ou logo após criar a instância de troca:
# option 1
exchange = ccxt.gatecoin({'headers': {'Connection': 'close'}})
# option 2
exchange = ccxt.gatecoin()
exchange.headers = {'Connection': 'close'}
Deixe-nos saber se isso não ajudar. THX!
Parece funcionar, obrigado!