Ccxt: ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ ํ›„ aiohttp_proxy๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 02์›” 27์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ccxt/ccxt

  • ์šด์˜์ฒด์ œ : Windows
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฒ„์ „ : Python ๋น„๋™๊ธฐ
  • 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' ๊ธฐ๋ณธ ๊ตํ™˜ ํด๋ž˜์Šค (๋น„๋™๊ธฐ์˜ ๊ฒฝ์šฐ)์˜ ๊ฐ€์ ธ ์˜ค๊ธฐ ๋ฉ”์†Œ๋“œ์— ์ฒซ ๋ฒˆ์งธ ์š”์ฒญ ํ›„ TCP ์—ฐ๊ฒฐ์ด ๋‹ซํžˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก์‹œ ์ˆœํ™˜์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š์œผ๋ฉด ์ด์ „ ํ”„๋ก์‹œ์— ๋Œ€ํ•œ TCP ์—ฐ๊ฒฐ์ด ์—ด๋ฆฐ ์ƒํƒœ๋กœ ์œ ์ง€๋˜๊ณ  aiohttp๋Š” ์ƒˆ aiohttp_proxy์— ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ํ—ค๋”๋ฅผ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ‚ต ์–ผ๋ผ์ด๋ธŒ ๊ตฌํ˜„ ์—ฌ๋ถ€ / ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ”„๋ก์‹œ ๋ฐ ๊ตํ™˜์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ headers['Connection'] = 'close' ์ฃผ์ž…ํ•˜๋Š” '๊นจ๋—ํ•œ'๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ—ค๋”๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” '๊นจ๋—ํ•œ'๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค [ 'Connection'] = 'close'.

์ „ํ™”๋ฅผ ๊ฑธ๊ธฐ ์ „ ๋˜๋Š” ๊ตํ™˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“  ์งํ›„์— exchange.headers = {'Connection': 'close'} ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.


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

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

๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๊ณ ๋งˆ์›Œ!

์ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค, thx!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰