Monitorar as variações de moedas estrangeiras diretamente por aplicativos bancários pode ser ineficiente devido aos constantes processos de autenticação e interfaces carregadas. Uma alternativa técnica mais ágil é realizar a extração direta dos dados através dos arquivos XML públicos fornecidos pelo portal de câmbio do China Construction Bank (CCB).
Identificando a Fonte de Dados
Ao analisar o tráfego de rede no portal de câmbio do CCB utilizando as ferrramentas de desenvolvedor do navegador (F12 > Network > Fetch/XHR), é possível localizar o arquivo jshckpj_new.xml. Este arquivo contém as cotações atualizadas em tempo real.
A estrutura de cada nó ReferencePriceSettlement no XML segue este padrão:
<ReferencePriceSettlement name="1">
<Ofrd_Ccy_CcyCd>392</Ofrd_Ccy_CcyCd> <!-- Código da Moeda Alvo (ex: Iene) -->
<Ofr_Ccy_CcyCd>156</Ofr_Ccy_CcyCd> <!-- Código da Moeda Base (RMB) -->
<BidRateOfCash>...</BidRateOfCash> <!-- Compra em Papel Moeda -->
<OfrRateOfCash>...</OfrRateOfCash> <!-- Venda em Papel Moeda -->
<BidRateOfCcy>...</BidRateOfCcy> <!-- Compra em Divisas (Remessa) -->
<OfrRateOfCcy>...</OfrRateOfCcy> <!-- Venda em Divisas (Remessa) -->
<LstPr_Dt>20240618</LstPr_Dt> <!-- Data da Cotação -->
<LstPr_Tm>203354</LstPr_Tm> <!-- Hora da Cotação -->
</ReferencePriceSettlement>
Implementação do Script em Python
Para processar essas informações, utilizaremos as bibliotecas requests para a captura dos dados e xml.etree.ElementTree para o parsing do conteúdo. O foco deste exemplo será a extração da cotação do Iene Japonês (JPY).
import requests
import xml.etree.ElementTree as ET
def buscar_cotacao_ccb():
endpoint = "http://forex1.ccb.com/cn/home/news/jshckpj_new.xml"
try:
solicitacao = requests.get(endpoint)
solicitacao.raise_for_status()
conteudo_xml = solicitacao.text
except requests.exceptions.RequestException as erro:
print(f"Falha na conexão: {erro}")
return
tree_root = ET.fromstring(conteudo_xml)
# Extração e formatação da data/hora
data_raw = tree_root.find('.//LstPr_Dt').text
hora_raw = tree_root.find('.//LstPr_Tm').text
data_formatada = f"{data_raw[:4]}-{data_raw[4:6]}-{data_raw[6:]}"
hora_formatada = f"{hora_raw[:2]}:{hora_raw[2:4]}:{hora_raw[4:]}"
timestamp = f"{data_formatada} {hora_formatada}"
info_moeda = None
# Localizando Iene (392) em relação ao Yuan (156)
for entrada in tree_root.findall('ReferencePriceSettlement'):
target = entrada.find('Ofrd_Ccy_CcyCd').text
base = entrada.find('Ofr_Ccy_CcyCd').text
if target == '392' and base == '156':
info_moeda = {
'compra': float(entrada.find('BidRateOfCcy').text),
'venda': float(entrada.find('OfrRateOfCcy').text)
}
break
if info_moeda:
print(f"--- Relatório de Câmbio (JPY/CNY) ---")
print(f"Atualização: {timestamp}")
print(f"Taxa de Compra: {info_moeda['compra']}")
print(f"Taxa de Venda: {info_moeda['venda']}")
# Simulação de custos para volumes específicos
for volume in [50000, 100000]:
custo_total = volume * info_moeda['venda']
print(f"Custo para adquirir {volume} JPY: {custo_total:.2f} CNY")
else:
print("Dados da moeda não encontrados no feed.")
if __name__ == "__main__":
buscar_cotacao_ccb()
Referência de Códigos de Moedas
Caso deseje monitorar outros ativos, utilize os códigos numéricos correspondentes no filtro de busca do script:
- 840: Dólar Americano (USD)
- 978: Euro (EUR)
- 826: Libra Esterlina (GBP)
- 036: Dólar Australiano (AUD)
- 344: Dólar de Hong Kong (HKD)
- 124: Dólar Canadense (CAD)
- 756: Franco Suíço (CHF)
- 702: Dólar de Singapura (SGD)