Ccxt: cambiar aiohttp_proxy después de la primera solicitud no tiene ningún efecto

Creado en 27 feb. 2018  ·  3Comentarios  ·  Fuente: ccxt/ccxt

  • SO: Windows
  • Versión del lenguaje de programación: Python async
  • Versión CCXT: 1201

Cambiar aiohttp_proxy después de la primera solicitud no tiene ningún efecto. Si se establece después del primero (por ejemplo) await e.load_markets() , no se utilizará. Si está configurado antes del primer await e.load_markets() , seguirá yendo a ese servidor proxy, también si cambia aiohttp_proxy a otro servidor proxy más adelante.

¿Cuál es la forma más sencilla de solucionar este problema? llamar close() y sobrescribir la variable de sesión? Y / o esto es algo que debe arreglarse en ccxt (por ejemplo, agregue otro método para reiniciar la sesión)

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())

Salida detallada

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

Todos 3 comentarios

Aparentemente, el proxy funciona por conexión TCP. Si no está cerrado, se están utilizando proxies anteriores. Si agrego
headers['Connection'] = 'close' al método de recuperación en la clase de intercambio base (para asíncrono), la rotación de proxy funciona como se esperaba porque la conexión TCP se cierra después de la primera solicitud. Cuando no se agrega ese encabezado, la conexión TCP al proxy anterior permanece abierta y aiohttp reutiliza ese sin importar el nuevo aiohttp_proxy.

Por lo tanto, el comportamiento podría ser diferente según el proxy y el intercambio, dependiendo de si implementan keepalive y cómo lo hacen.

Sin embargo, no puedo encontrar una forma 'limpia' de inyectar headers['Connection'] = 'close' .

Sin embargo, no puedo encontrar una forma 'limpia' de inyectar encabezados ['Conexión'] = 'cerrar'.

Agregue exchange.headers = {'Connection': 'close'} antes de realizar la llamada o justo después de crear la instancia de intercambio:


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

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

Háganos saber si no ayuda. ¡Gracias!

¡Parece funcionar, gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones