Ccxt: changer aiohttp_proxy après la première requête n'a aucun effet

Créé le 27 févr. 2018  ·  3Commentaires  ·  Source: ccxt/ccxt

  • OS : Windows
  • Version du langage de programmation : Python asynchrone
  • Version CCXT : 1201

Changer aiohttp_proxy après la première requête n'a aucun effet. S'il est défini après le premier (par exemple) await e.load_markets() , il ne sera pas utilisé. S'il est défini avant le premier await e.load_markets() , il continuera à accéder à ce serveur proxy, même si vous modifiez ultérieurement aiohttp_proxy vers un autre serveur proxy.

Quelle est la façon la plus simple de résoudre ce problème ? appelez close() et écrasez la variable de session ? Et/ou est-ce quelque chose qui doit être corrigé dans ccxt (par exemple, ajoutez une autre méthode pour redémarrer la session)

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

Sortie verbeuse

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

Tous les 3 commentaires

Apparemment, le proxy fonctionne par connexion TCP. S'il n'est pas fermé, les proxys précédents sont utilisés. Si j'ajoute
headers['Connection'] = 'close' à la méthode fetch dans la classe d'échange de base (pour async), la rotation du proxy fonctionne comme prévu car la connexion TCP est fermée après la première requête. Lorsque cet en-tête n'est pas ajouté, la connexion TCP au proxy précédent reste ouverte et aiohttp réutilise celui-ci quel que soit le nouveau aiohttp_proxy.

Ainsi, le comportement peut être différent selon le proxy et l'échange, selon si/comment ils implémentent keepalive.

Cependant, je ne trouve pas de moyen «propre» d'injecter headers['Connection'] = 'close' .

Cependant, je ne trouve pas de moyen «propre» d'injecter des en-têtes['Connection'] = 'close'.

Ajoutez exchange.headers = {'Connection': 'close'} avant d'émettre l'appel ou juste après avoir créé l'instance d'échange :


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

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

Faites-nous savoir si cela ne vous aide pas. Merci!

Ça a l'air de fonctionner, merci !

Cette page vous a été utile?
0 / 5 - 0 notes