url = 'https://query2.finance.yahoo.com/v7/finance/quote?symbols=TSLA&fields=regularMarketPreviousClose®ion=US&lang=en-US'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'
}
data = requests.get(url,headers=headers)
prepost_data = data.json()
Кажется, недавно Yahoo Finance изменила свой API V7, чтобы требовать файлы cookie для каждого запроса. Запустив приведенный выше код, я получаю ошибку Invalid Crumb.
{"finance":{"result":null,"error":{"code":"Unauthorized","description":"Invalid Crumb"}}}
Эта проблема, кажется, также известна в этом репозитории Github: https://github.com/joshuaulrich/quantmod/issues/382
Кажется, у них есть работающий патч: https://github.com/joshuaulrich/quantmod/pull/383/commits
Но весь код написан на R... Кто-нибудь знает, как это перевести на Python?
@AndrejKesely Да, кажется, они исправили это за ночь. Я предполагаю, что теперь мой вопрос заключается в том, должен ли я включать файлы cookie в свои заголовки? Если да, то как лучше всего это сделать?
Вы нашли исправление для этого? Я использую приложение, которое обновляет цены на акции с помощью этого API, и оно не работает уже несколько недель.
Это сработало для меня.
set-cookie
из заголовков ответов, которые затем используются в последующих вызовах.[crumb-value]
в следующем URL-адресе и выполните вызов HTTP GET с файлом cookie https://query2.finance.yahoo.com/v7/finance/quote?symbols=TSLA&crumb=[crumb-value]Спасибо, я тоже смог это сделать.
Я делал на php, код такой:
<?php
/* 1 - Get cookie */
//https://stackoverflow.com/questions/76065035/yahoo-finance-v7-api-now-requiring-cookies-python
$url_yahoo = "https://fc.yahoo.com";
$yahoo_headers = get_headers($url_yahoo, true);
//print_r($yahoo_headers);
$cookie_name = 'Set-Cookie';
/* 2 - Get crumb , setting cookie */
$url_yahoo2 = "https://query2.finance.yahoo.com/v1/test/getcrumb";
$c = curl_init($url_yahoo2);
curl_setopt($c, CURLOPT_VERBOSE, 1);
curl_setopt($c, CURLOPT_COOKIE, $yahoo_headers[$cookie_name]);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$crumb = curl_exec($c);
curl_close($c);
//echo "<BR>Crumb:" . $crumb;
/* 3 - Get quotes with crumb, setting cookie. Using sample tickets*/
$tickets_list = "AAPL,TSLA";
$url_cotacao = "https://query2.finance.yahoo.com/v7/finance/quote?symbols = " . $tickets_list . "&crumb = " . $crumb;
$c = curl_init($url_cotacao);
curl_setopt($c, CURLOPT_VERBOSE, 1);
curl_setopt($c, CURLOPT_COOKIE, $yahoo_headers[$cookie_name]);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$data_quote = curl_exec($c);
curl_close($c);
/* 4 - Get data from yahoo */
$resJson_decode = json_decode($data_quote, false);
if (!$resJson_decode->quoteResponse->result) {
$resultado = "Ticket dont exists in yahoo!";
} else {
foreach ($resJson_decode->quoteResponse->result as $ticket_result){
echo "<BR>Ticket:" . $ticket_result->symbol;
echo "<BR>Price:" . $ticket_result->regularMarketPrice;
}
}
Но вопрос к Python.
Вот пример кода Python, основанный на ответе @mahindar, чтобы получить файл cookie и крошку:
import requests
def get_yahoo_cookie():
cookie = None
user_agent_key = "User-Agent"
user_agent_value = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
headers = {user_agent_key: user_agent_value}
response = requests.get(
"https://fc.yahoo.com", headers=headers, allow_redirects=True
)
if not response.cookies:
raise Exception("Failed to obtain Yahoo auth cookie.")
cookie = list(response.cookies)[0]
return cookie
def get_yahoo_crumb(cookie):
crumb = None
user_agent_key = "User-Agent"
user_agent_value = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
headers = {user_agent_key: user_agent_value}
crumb_response = requests.get(
"https://query1.finance.yahoo.com/v1/test/getcrumb",
headers=headers,
cookies = {cookie.name: cookie.value},
allow_redirects=True,
)
crumb = crumb_response.text
if crumb is None:
raise Exception("Failed to retrieve Yahoo crumb.")
return crumb
# Usage
cookie = get_yahoo_cookie()
crumb = get_yahoo_crumb(cookie)
Запустив ваш код, я получаю нормальный ответ Json
{'quoteResponse': {'result': [{'language': 'en-US', 'region': 'US', 'quoteType': 'EQUITY', ...