API Yahoo Finance V7 теперь требует файлы cookie? (Питон)

url = 'https://query2.finance.yahoo.com/v7/finance/quote?symbols=TSLA&fields=regularMarketPreviousClose&region=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?

Запустив ваш код, я получаю нормальный ответ Json {'quoteResponse': {'result': [{'language': 'en-US', 'region': 'US', 'quoteType': 'EQUITY', ...

Andrej Kesely 20.04.2023 20:44

@AndrejKesely Да, кажется, они исправили это за ночь. Я предполагаю, что теперь мой вопрос заключается в том, должен ли я включать файлы cookie в свои заголовки? Если да, то как лучше всего это сделать?

Justin 21.04.2023 10:45

Вы нашли исправление для этого? Я использую приложение, которое обновляет цены на акции с помощью этого API, и оно не работает уже несколько недель.

ChrisR 13.05.2023 22:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
987
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это сработало для меня.

  1. Сделайте вызов HTTP GET для URL-адреса https://fc.yahoo.com. Хотя этот вызов приводит к ошибке 404, нам просто нужно извлечь set-cookie из заголовков ответов, которые затем используются в последующих вызовах.
  2. Теперь сделайте вызов HTTP GET для URL-адреса https://query2.finance.yahoo.com/v1/test/getcrumb, включив полученный файл cookie из предыдущих заголовков ответа. Этот вызов извлечет значение крошки.
  3. Замените [crumb-value] в следующем URL-адресе и выполните вызов HTTP GET с файлом cookie https://query2.finance.yahoo.com/v7/finance/quote?symbols=TSLA&crumb=[crumb-value]
  4. Кэшируйте значение cookie и значение крошки, чтобы пропустить первые два шага вперед.

Спасибо, я тоже смог это сделать.

Justin 24.05.2023 10:59

Я делал на 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.

Jeremy Caney 30.05.2023 08:59

Вот пример кода 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)

Другие вопросы по теме