Skip to content

Commit

Permalink
Add proxy-provider callback (#65)
Browse files Browse the repository at this point in the history
Impl #53
  • Loading branch information
qrtt1 authored and mlouielu committed May 13, 2019
1 parent cddddcc commit 8ff01b7
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 4 deletions.
26 changes: 26 additions & 0 deletions test/test_proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import unittest

from twstock.proxy import get_proxies, configure_proxy_provider, reset_proxy_provider
from twstock.proxy import SingleProxyProvider


class ProxyProviderTest(unittest.TestCase):

def setUp(self):
reset_proxy_provider()

def tearDown(self):
reset_proxy_provider()

def test_configure(self):
# default values are empty
self.assertDictEqual({}, get_proxies())

# configure fake proxy
configure_proxy_provider(SingleProxyProvider(dict(http="http-proxy", https="https-proxy")))
self.assertEqual("http-proxy", get_proxies()['http'])
self.assertEqual("https-proxy", get_proxies()['https'])

# reset proxy
reset_proxy_provider()
self.assertDictEqual({}, get_proxies())
3 changes: 2 additions & 1 deletion twstock/codes/fetch.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import requests
from lxml import etree

from twstock.proxy import get_proxies

TWSE_EQUITIES_URL = 'http://isin.twse.com.tw/isin/C_public.jsp?strMode=2'
TPEX_EQUITIES_URL = 'http://isin.twse.com.tw/isin/C_public.jsp?strMode=4'
Expand All @@ -26,7 +27,7 @@ def make_row_tuple(typ, row):


def fetch_data(url):
r = requests.get(url)
r = requests.get(url, proxies=get_proxies())
root = etree.HTML(r.text)
trs = root.xpath('//tr')[1:]

Expand Down
38 changes: 38 additions & 0 deletions twstock/proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import abc


class ProxyProvider(abc.ABC):
@abc.abstractmethod
def get_proxy(self):
return NotImplemented


class NoProxyProvier(ProxyProvider):
def get_proxy(self):
return {}


class SingleProxyProvider(ProxyProvider):
def __init__(self, proxy=None):
self._proxy = proxy

def get_proxy(self):
return self._proxy


_provider_instance = NoProxyProvier()


def reset_proxy_provider():
configure_proxy_provider(NoProxyProvier())


def configure_proxy_provider(provider_instance):
global _provider_instance
if not isinstance(provider_instance, ProxyProvider):
raise BaseException("proxy provider should be a ProxyProvider object")
_provider_instance = provider_instance


def get_proxies():
return _provider_instance.get_proxy()
3 changes: 2 additions & 1 deletion twstock/realtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import twstock
import sys

from twstock.proxy import get_proxies

SESSION_URL = 'http://mis.twse.com.tw/stock/index.jsp'
STOCKINFO_URL = 'http://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch={stock_id}&_={time}'
Expand Down Expand Up @@ -67,7 +68,7 @@ def _join_stock_id(stocks) -> str:

def get_raw(stocks) -> dict:
req = requests.Session()
req.get(SESSION_URL)
req.get(SESSION_URL, proxies=get_proxies())

r = req.get(
STOCKINFO_URL.format(
Expand Down
7 changes: 5 additions & 2 deletions twstock/stock.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import datetime
import urllib.parse
from collections import namedtuple

from twstock.proxy import get_proxies

try:
from json.decoder import JSONDecodeError
except ImportError:
Expand Down Expand Up @@ -48,7 +51,7 @@ def __init__(self):
def fetch(self, year: int, month: int, sid: str, retry: int=5):
params = {'date': '%d%02d01' % (year, month), 'stockNo': sid}
for retry_i in range(retry):
r = requests.get(self.REPORT_URL, params=params)
r = requests.get(self.REPORT_URL, params=params, proxies=get_proxies())
try:
data = r.json()
except JSONDecodeError:
Expand Down Expand Up @@ -92,7 +95,7 @@ def __init__(self):
def fetch(self, year: int, month: int, sid: str, retry: int=5):
params = {'d': '%d/%d' % (year - 1911, month), 'stkno': sid}
for retry_i in range(retry):
r = requests.get(self.REPORT_URL, params=params)
r = requests.get(self.REPORT_URL, params=params, proxies=get_proxies())
try:
data = r.json()
except JSONDecodeError:
Expand Down

0 comments on commit 8ff01b7

Please sign in to comment.