-
-
Save maurobaraldi/40ec1daf0005530dd94a to your computer and use it in GitHub Desktop.
| #!/usr/bin/env python | |
| from datetime import datetime | |
| from json import loads | |
| from time import gmtime, mktime, strptime | |
| # LevelDict é um wrapper usando dicionário para LevelDB | |
| # https://github.com/maurobaraldi/leveldict | |
| from leveldict import LevelJsonDict | |
| from requests import get | |
| base = 'http://cotacoes.economia.uol.com.br/ws/asset' | |
| assets = base + '/stock/list?size=10000' | |
| intraday = base + '/{asset}/intraday?size=400&callback=uolfinancecallback0' | |
| assets = {i['code']: i['idt'] for i in get(assets).json()['data']} | |
| # 3 ativos para teste | |
| # assets = {'PETR4.SA': 484, 'CTAX4.SA': 227, 'IGUA3.SA': 364} | |
| db = LevelJsonDict('./intraday') | |
| def from_ts(ts): | |
| ''' Convert timestamp (13 digits support) to datetime''' | |
| return datetime.fromtimestamp(mktime(gmtime(ts / 1000.0))) | |
| def to_ts(dt): | |
| ''' From strftime to timestamp (13 digits support)''' | |
| return int(mktime(strptime(dt, "%Y-%m-%d %H:%M")) * 1000) | |
| def get_intraday(asset): | |
| url = intraday.format(**{'asset': asset}) | |
| return loads(get(url).content[20:-2]) | |
| if __name__ == '__main__': | |
| for asset, code in assets.iteritems(): | |
| today = datetime.now().strftime('%Y%m%d') | |
| quote = get_intraday(code).get('data', {}) | |
| db.setdefault(asset) | |
| db[asset] = {today: quote} |
Recomendo a api do yahoo para quem estiver precisando de cotações, infelizmente tem 15 minutos de atraso, mas ta show de bola e permite trazer vários tickers de uma vez, ex:
Recomendo a api do yahoo para quem estiver precisando de cotações, infelizmente tem 15 minutos de atraso, mas ta show de bola e permite trazer vários tickers de uma vez, ex:
Opa obrigado por compartilhar, ele não fornece o histórico intraday?
Opa obrigado por compartilhar, ele não fornece o histórico intraday?
Para histórico, você pode fazer como abaixo, mas ainda não explorei muito:
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigado
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000Obrigado
Esse ai ja era.
Outra saida de uso pode ser esse abaixo.
http://bvmf.bmfbovespa.com.br/cotacoes2000/FormConsultaCotacoes.asp?strListaCodigos=USIM5|PETR4
A da uol morreu mesmo.
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
ObrigadoEsse ai ja era.
Outra saida de uso pode ser esse abaixo.http://bvmf.bmfbovespa.com.br/cotacoes2000/FormConsultaCotacoes.asp?strListaCodigos=USIM5|PETR4
Será que essa ai vai durar bastante?
Putzz usava desde ano passado essa da UOL. A alternativa atual é só do yahoo mesmo?
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000Obrigado
https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id
Esta scritpt está rodando bonitinho:
Sabem de algum site que mostra em tempo real ?
Sem atraso, consigo analisar e/ou fazer um scraping, caso queiram !
Trazendo os dados formatados !
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigadohttps://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id
Me salvou, obrigado!
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigadohttps://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id
Valeu pela dica. Sabe quais os valores possíveis para o parâmetro fields?
Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigadohttps://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id
Valeu pela dica. Sabe quais os valores possíveis para o parâmetro fields?
Também gostaria de saber os fields disponíveis para esse link, será que tem alguma documentação?
Parece que encontrei algo útil nesse post:
https://stackoverflow.com/questions/62963923/get-value-from-graphicview-bidvalue
Porém ao testar os outros fields não obtive resultado :/
Não consigo baixar o 'py-leveldb" pois a url dele não existe mais. O que eu faço nesse caso?
https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=id,abbreviation,name,companies,exchange
Alguém sabe qual o nome do "fields" para mostrar o tipo: Ações, FII, ETF, etc.???
ps: o Type "S" significa o que?
https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=id,abbreviation,name,companies,exchange
Alguém sabe qual o nome do "fields" para mostrar o tipo: Ações, FII, ETF, etc.???
ps: o Type "S" significa o que?
Também gostaria de saber os fields disponíveis para essa API
consegui dar uma ratreada e saber mas campos
https://api.cotacoes.uol.com/currency/intraday/list?currency=1&fields=bidvalue,askvalue,date,variationpercentbid
bidvalue = valor de venda
askvalue = valor de compra ()
variationpercentbid = variação da moeda (importante pra saber se a moeda tá subindo ou descendo)
mas alguém sabe como resolver esse erro aqui ?
"has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled."
Pessoal, criei uma biblioteca Python para pegar dados do mercado financeiro diretamente das fontes originais (chama-se mercados), assim caso a API do UOL não funcione mais, vocês conseguem pegar diretamente da B3 e o resultado já vem em uma dataclass Python com todos os valores convertidos (datetime.date, decimal.Decimal etc.).
Existem várias formas de pegar os valores do último pregão (dá pra pegar inclusive as negociações intradiárias), mas segue um exemplo que detecta a última data disponível e pega todos os ativos (tem preço de abertura, mínimo, médio, máximo e de fechamento, além de número de negócios e volume).
Basta instalar diretamente do Github:
pip install https://github.com/PythonicCafe/mercados/archive/develop.zip
# `pip install mercados` funciona, mas a versão do PyPI ainda não foi atualizada e não tem algumas funcionalidadesExemplo para coletar e mostrar alguns negócios para uma determinada data (tem ações, fundos listados, ETFs, opções etc.):
import datetime
from mercados.b3 import B3
b3 = B3()
for negociacao in b3.negociacao_bolsa("dia", datetime.date(2017, 5, 17)): # Joesley Day
if negociacao.codigo_negociacao in ("PETR4", "POMO4", "ITUB4"):
print(negociacao.codigo_negociacao, negociacao.preco_abertura, negociacao.preco_ultimo)
# `negociacao` é um objeto dataclass com diversos campos
# Resultado (é o preço original, não ajustado):
# ITUB4 39.83 39.43
# PETR4 15.56 15.61
# POMO4 2.93 2.87Exemplo mais completo, que baixa todas as negociações do último dia disponível (pula fim de semana, feriados etc.) e salva em um CSV:
import csv
import datetime
from pathlib import Path
from mercados.b3 import B3
DIAS_PROBE = 8 # Retrocesso máximo em dias na auto-detecção de data, para cobrir feriados prolongados (hoje + 7d)
codigos = {} # `set` com os códigos de negociação a filtrar, ex: codigos = {"PETR4", "POMO4", ...}
data = None # Data do pregão. Se é `None`, então pega a última disponível. Poderia ser: datetime.date(2026, 5, 20)
if data is None:
hoje = datetime.datetime.now().date()
datas = [hoje - datetime.timedelta(days=i) for i in range(DIAS_PROBE)]
else:
datas = [data]
b3 = B3()
registros = []
for data in datas:
try:
for negocio in b3.negociacao_bolsa("dia", data):
if not codigos or negocio.codigo_negociacao in codigos:
if negocio.codigo_negociacao in ("POMO4", "XPML11"): # Mostra dados de exemplo
print(f"Exemplo de dado coletado: {negocio}")
if not registros and len(datas) > 1:
print(f"Data auto-detectada: {data}")
registros.append(negocio.serialize()) # .serialize transforma objeto dataclass em dict
except BadZipFile: # Arquivo ZIP não existe/está vazio para essa data
continue
else:
break # Coleta apenas para a primeira data encontrada
csv_filename = Path(f"negocios-b3-{data}.csv")
print(f"Coletados {len(registros)} registros, salvando em {csv_filename}.")
with csv_filename.open(mode="w") as fobj:
writer = csv.DictWriter(fobj, fieldnames=list(registros[0].keys()))
writer.writeheader()
for registro in registros:
writer.writerow(registro)Resultado:
Data auto-detectada: 2026-05-21
Exemplo de dado coletado: NegociacaoBolsa(quantidade=6271000, pontos_strike=None, data=datetime.date(2026, 5, 21), data_vencimento=None, negociacoes=7782, lote=1, indice_correcao=0, distribuicao=106, codigo_bdi=2, codigo_tipo_mercado=10, prazo_termo=None, codigo_isin='BRPOMOACNPR7', codigo_negociacao='POMO4', moeda='R$', nome_pregao='MARCOPOLO', tipo_papel='PN N2', preco_abertura=Decimal('5.98'), preco_maximo=Decimal('6.05'), preco_minimo=Decimal('5.86'), preco_medio=Decimal('5.95'), preco_ultimo=Decimal('5.98'), preco_melhor_oferta_compra=Decimal('5.98'), preco_melhor_oferta_venda=Decimal('5.99'), volume=Decimal('37325013.00'), preco_execucao=Decimal('0.00'))
Exemplo de dado coletado: NegociacaoBolsa(quantidade=138270, pontos_strike=None, data=datetime.date(2026, 5, 21), data_vencimento=None, negociacoes=20250, lote=1, indice_correcao=0, distribuicao=211, codigo_bdi=12, codigo_tipo_mercado=10, prazo_termo=None, codigo_isin='BRXPMLCTF000', codigo_negociacao='XPML11', moeda='R$', nome_pregao='FII XP MALLS', tipo_papel='CI ER', preco_abertura=Decimal('107.08'), preco_maximo=Decimal('107.30'), preco_minimo=Decimal('106.67'), preco_medio=Decimal('106.98'), preco_ultimo=Decimal('107.05'), preco_melhor_oferta_compra=Decimal('107.04'), preco_melhor_oferta_venda=Decimal('107.05'), volume=Decimal('14793038.88'), preco_execucao=Decimal('0.00'))
Coletados 13431 registros, salvando em negocios-b3-2026-05-21.csv.
O projeto também tem uma interface de linha de comando, então caso não queiram programar, dá pra baixar os dados e gerar um CSV diretamente:
python -m mercados.b3 negociacao-bolsa dia 2026-05-20 negociacao-2026-05-20.csv
wc -l negociacao-2026-05-20.csv # 14212 negociacao-2026-05-20.csvPara quem quiser saber mais sobre a biblioteca, veja o vídeo da minha palestra sobre ela na PythonBrasil 2025.
Como você faz a consulta dos dados por esse site?