I have this python script which works with no problem on ubuntu 16.04 But it wont get data in ubuntu 18.04, any idea what the problem could be? No errors.
try:
exchrate=float(json.loads(requests.get("http://api.coindesk.com/v1/bpi/currentprice.json").read())['bpi'][currency]['rate_float'])
print exchrate
except:
try:
print("Can not get data from coindesk.com")
print("Trying to get data from coinbase.com")
exchrate=float(json.loads(urllib2.urlopen("https://api.coinbase.com/v2/exchange-rates?currency=BTC").read())["data"]["rates"][currency])
print exchrate
except:
try:
print("Can not get data from coinbase.com")
print("Trying to get data from blockchain.info")
exchrate=float(json.loads(urllib2.urlopen("https://blockchain.info/ticker").read())[currency]["last"])
print exchrate
except:
print("Can not get data from blockchain.info")
print("Failed to get BTC exchange rate")
sys.exit()
Output:
Can not get data from coindesk.com
Trying to get data from coinbase.com
Can not get data from coinbase.com
Trying to get data from blockchain.info
Can not get data from blockchain.info
Failed to get BTC exchange rate
Full code is here : https://github.com/papampi/nvOC_by_fullzero_Community_Release/blob/Dual-cuda/WTM_SWITCHER
Advertisement
Answer
Since you’re using the Requests library, you should use it on each API. Requests provides a method to extract JSON, so you don’t need to call the json
module yourself.
When multiple things can go wrong, it’s not a good idea to bundle them all together in one line. Do them in stages so you can see exactly where the error occurred, and deal it with it appropriately. Also, using unnamed except
blocks is rarely a good idea: you might catch something that you don’t know how to handle.
Here’s a re-organized version of your code.
import requests
currency = "USD"
apis = [
{
"name": "coindesk.com",
"url": "https://api.coindesk.com/v1/bpi/currentprice.json",
"keys": ("bpi", currency, "rate_float"),
},
{
"name": "coinbase.com",
"url": "https://api.coinbase.com/v2/exchange-rates?currency=BTC",
"keys": ("data", "rates", currency),
},
{
"name": "blockchain.info",
"url": "https://blockchain.info/ticker",
"keys": (currency, "last"),
},
]
for d in apis:
name, url, keys = d["name"], d["url"], d["keys"]
print("Trying", name)
try:
req = requests.get(url)
req.raise_for_status()
except requests.exceptions.RequestException as e:
print(e)
print("Cannot get data from", name)
continue
try:
# Extract the exchange rate
data = req.json()
for k in keys:
data = data[k]
except KeyError as e:
print("Bad key!:", e)
continue
try:
# Convert the exchange rate to a float.
# Some APIs return it as a float, but coinbase.com returns
# a string. This code also handles None, which in JSON is null
# If you just want to print the rate, this conversion is not needed.
rate = float(data)
print("Rate", rate)
break
except (ValueError, TypeError) as e:
print("Invalid exchange rate data", data, type(data))
else:
print("Failed to get BTC exchange rate")
typical output
Trying coindesk.com
Rate 6440.64
Update: I’ve improved the error-handling of this code.