Skip to content

Instantly share code, notes, and snippets.

@arulrajnet
Last active December 29, 2022 17:56
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save arulrajnet/21addbacdbdfd6e190f4 to your computer and use it in GitHub Desktop.
Save arulrajnet/21addbacdbdfd6e190f4 to your computer and use it in GitHub Desktop.
Get the latest Index from BSE and NSE stock market. Python script using google finance open API http://finance.google.com/finance/info?client=ig&q=INDEXBOM:SENSEX
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import namedtuple
import json
try:
from urllib.request import Request, urlopen
except ImportError: # python 2
from urllib2 import Request, urlopen
__author__ = 'arulraj'
STOCK_CODE_LIST = [
"INDEXBOM:SENSEX",
"NSE:NIFTY",
"INDEXBOM:BSE-100",
"INDEXBOM:BSE-200",
"INDEXBOM:BSE-500",
"INDEXBOM:BSE-SMLCAP",
"INDEXBOM:BSE-MIDCAP",
"NSE:NIFTYJR"
]
Stock = namedtuple("Stock", ["Index", "Current", "Change_pts", "Change_percent", "Updated_on"])
def build_url():
"""
:return:
"""
symbol_list = ','.join([stock for stock in STOCK_CODE_LIST])
return 'http://finance.google.com/finance/info?client=ig&q=' \
+ symbol_list
def get_content(url):
"""
:return:
"""
req = Request(url)
resp = urlopen(req)
content = resp.read().decode('ascii', 'ignore').strip()
content = content[3:]
return content
def parse_content(content):
"""
:param content:
:return:
"""
stock_resp_list = json.loads(content)
list_stock = list()
for stock_resp in stock_resp_list:
isPositive = False if stock_resp["cp"] != None and len(stock_resp["cp"]) > 0 and stock_resp["cp"][0] == '-' else True
colored_cp = stock_resp["cp"]
if isPositive:
colored_cp = Color.green(stock_resp["cp"])
else:
colored_cp = Color.red(stock_resp["cp"])
list_stock.append(Stock(stock_resp["t"], stock_resp["l"], stock_resp["c"], colored_cp, stock_resp["lt"]))
return list_stock
def pprinttable(rows):
"""
From http://stackoverflow.com/a/5910078/458701 and modified bit to support UTF-8
:param rows:
:return:
"""
if len(rows) > 1:
headers = rows[0]._fields
lens = []
for i in range(len(rows[0])):
lens.append(len(max([x[i] for x in rows] + [headers[i]], key=lambda x: len(str(x)))))
formats = []
hformats = []
for i in range(len(rows[0])):
if isinstance(rows[0][i], int):
formats.append("%%%dd" % lens[i])
else:
formats.append("%%-%ds" % lens[i])
hformats.append("%%-%ds" % lens[i])
pattern = " | ".join(formats)
hpattern = " | ".join(hformats)
separator = "-+-".join(['-' * n for n in lens])
print hpattern % tuple(headers)
print separator
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
for line in rows:
print pattern % tuple(_u(t) for t in line)
elif len(rows) == 1:
row = rows[0]
hwidth = len(max(row._fields, key=lambda x: len(x)))
for i in range(len(row)):
print "%*s = %s" % (hwidth, row._fields[i], row[i])
def preety_print_stock(stock_list, preety=True):
"""
:param stock_list:
:return:
"""
if not preety:
print """"%s", "%s", "%s", "%s", "%s" """ % (Stock._fields)
for stock in stock_list:
print """"%s", "%s", "%s", "%s", "%s" """ % (stock[0], stock[1], stock[2], stock[3], stock[4])
else:
pprinttable(stock_list)
class Color(object):
"""
reference from https://gist.github.com/Jossef/0ee20314577925b4027f and modified bit.
"""
def __init__(self, text, **user_styles):
styles = {
# styles
'reset': '\033[0m',
'bold': '\033[01m',
'disabled': '\033[02m',
'underline': '\033[04m',
'reverse': '\033[07m',
'strike_through': '\033[09m',
'invisible': '\033[08m',
# text colors
'fg_black': '\033[30m',
'fg_red': '\033[31m',
'fg_green': '\033[32m',
'fg_orange': '\033[33m',
'fg_blue': '\033[34m',
'fg_purple': '\033[35m',
'fg_cyan': '\033[36m',
'fg_light_grey': '\033[37m',
'fg_dark_grey': '\033[90m',
'fg_light_red': '\033[91m',
'fg_light_green': '\033[92m',
'fg_yellow': '\033[93m',
'fg_light_blue': '\033[94m',
'fg_pink': '\033[95m',
'fg_light_cyan': '\033[96m',
# background colors
'bg_black': '\033[40m',
'bg_red': '\033[41m',
'bg_green': '\033[42m',
'bg_orange': '\033[43m',
'bg_blue': '\033[44m',
'bg_purple': '\033[45m',
'bg_cyan': '\033[46m',
'bg_light_grey': '\033[47m'
}
self.color_text = ''
for style in user_styles:
try:
self.color_text += styles[style]
except KeyError:
raise KeyError('def color: parameter `{}` does not exist'.format(style))
self.color_text += text
def __format__(self):
return '{}\033[0m\033[0m'.format(self.color_text)
@classmethod
def red(clazz, text):
cls = clazz(text, bold=True, fg_red=True)
return cls.__format__()
@classmethod
def orange(clazz, text):
cls = clazz(text, bold=True, fg_orange=True)
return cls.__format__()
@classmethod
def green(clazz, text):
cls = clazz(text, bold=True, fg_green=True)
return cls.__format__()
@classmethod
def custom(clazz, text, **custom_styles):
cls = clazz(text, **custom_styles)
return cls.__format__()
if __name__ == "__main__":
json_content = get_content(build_url())
stock_list = parse_content(json_content)
preety_print_stock(stock_list, True)
@arulrajnet
Copy link
Author

wget --no-check-certificate https://gist.githubusercontent.com/arulrajnet/21addbacdbdfd6e190f4/raw/stockmarketindia.py
chmod +x stockmarketindia.py
sudo cp stockmarketindia.py /usr/bin/stockmarketindia

Then run stockmarketindia from your terminal. the output will be

alt

@arulrajnet
Copy link
Author

New revision have colored output

colored-stockmarketindia

@surisetty
Copy link

surisetty commented Oct 26, 2017

File "/usr/lib/python2.7/urllib2.py", line 556, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

http://finance.google.com/finance/info?client=ig&q=INDEXBOM:SENSEX
Seems URL not working here any other alternative ?

@arulrajnet
Copy link
Author

Thanks @surisetty for reporting this. Just noticed the script got broken. There are discussions happened regarding the same in SO and reddit. From there these are the possible endpoints

https://finance.google.com/finance?q=NSE:NIFTY&output=json

https://finance.google.com/finance/data?dp=mra&output=json&catid=all&cid=207437

The cid in this is google id of stock.

https://finance.google.com/finance/getprices?q=.NSEI&p=1d&f=d,o,h,l,c,v

Will fix this whenever I get time.

@arulrajnet
Copy link
Author

Use https://github.com/ranaroussi/yfinance

pip install yfinance
pip install html5lib
pip install BeautifulSoup4

Then

import yfinance as yf
sensex = yf.Ticker("^BSESN")
sensex.info

@arulrajnet
Copy link
Author

Here is the script https://github.com/arulrajnet/stockinfo-cli using Yahoo Finance API

@surisetty FYI

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment