fix costco
This commit is contained in:
parent
47507799d4
commit
32511344b7
2 changed files with 43 additions and 28 deletions
24
app.py
24
app.py
|
@ -1,6 +1,6 @@
|
||||||
from flask import Flask,render_template,send_from_directory
|
from flask import Flask,render_template,send_from_directory
|
||||||
from flask_caching import Cache
|
from flask_caching import Cache
|
||||||
import requests
|
import httpx
|
||||||
|
|
||||||
app=Flask(__name__)
|
app=Flask(__name__)
|
||||||
app.config['CACHE_TYPE']='SimpleCache'
|
app.config['CACHE_TYPE']='SimpleCache'
|
||||||
|
@ -14,14 +14,28 @@ def index():
|
||||||
def favicon():
|
def favicon():
|
||||||
return send_from_directory(app.static_folder,"gas.svg")
|
return send_from_directory(app.static_folder,"gas.svg")
|
||||||
|
|
||||||
@app.route("/gas.csv")
|
@app.route("/samsclub.csv")
|
||||||
@cache.cached(timeout=1800)
|
@cache.cached(timeout=1800)
|
||||||
def gas():
|
def sams():
|
||||||
result=["Sams https://www.samsclub.com/local/fuel-center/-/X"]
|
|
||||||
url='https://www.samsclub.com/api/node/vivaldi/browse/v2/clubfinder/list?distance=10000&nbrOfStores=1000&singleLineAddr=10001'
|
url='https://www.samsclub.com/api/node/vivaldi/browse/v2/clubfinder/list?distance=10000&nbrOfStores=1000&singleLineAddr=10001'
|
||||||
sams=requests.get(url,headers={'User-Agent':'Mozilla/5.0','Accept-Encoding':'ztsd'}).json()
|
headers={'User-Agent':'Mozilla/5.0','Accept-Encoding':'ztsd'}
|
||||||
|
sams=httpx.get(url,headers=headers,timeout=10).json()
|
||||||
|
result=[]
|
||||||
for s in sams:
|
for s in sams:
|
||||||
if 'gasPrices' in s:
|
if 'gasPrices' in s:
|
||||||
p={g['gradeId']:int(g['price']*100) for g in s['gasPrices']}
|
p={g['gradeId']:int(g['price']*100) for g in s['gasPrices']}
|
||||||
result.append(f"{p[11]},{p[16]},{s['geoPoint']['latitude']},{s['geoPoint']['longitude']},{s['id']}")
|
result.append(f"{p[11]},{p[16]},{s['geoPoint']['latitude']},{s['geoPoint']['longitude']},{s['id']}")
|
||||||
return "\n".join(result)
|
return "\n".join(result)
|
||||||
|
|
||||||
|
@app.route("/costco.csv")
|
||||||
|
@cache.cached(timeout=1800)
|
||||||
|
def costco():
|
||||||
|
url='https://www.costco.com/AjaxWarehouseBrowseLookupView?hasGas=true&populateWarehouseDetails=true'
|
||||||
|
headers={'Accept':'*/*','Accept-Encoding':'gzip,deflate,br,zstd','Accept-Language':'en','Referer':'costco.com','Sec-Fetch-Mode':'cors','User-Agent':'Mozilla/5.0 Firefox/140.0'}
|
||||||
|
costco=httpx.Client(http2=True).get(url,headers=headers,timeout=60).json()[1:]
|
||||||
|
result=[]
|
||||||
|
for s in costco:
|
||||||
|
if 'regular' in s['gasPrices'] and s['country']=='US':
|
||||||
|
p={g:int(float(s['gasPrices'][g])*100) for g in ['regular','premium']}
|
||||||
|
result.append(f"{p['regular']},{p['premium']},{s['latitude']},{s['longitude']},{s['displayName']}")
|
||||||
|
return "\n".join(result)
|
||||||
|
|
|
@ -14,44 +14,45 @@
|
||||||
color:black;
|
color:black;
|
||||||
text-decoration:none;
|
text-decoration:none;
|
||||||
}
|
}
|
||||||
.Sams{
|
.samsclub,.costco{
|
||||||
display:flex;
|
display:flex;
|
||||||
border-radius:33%;
|
border-radius:33%;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
align-items:center;
|
align-items:center;
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
font-weight:bold;
|
font-weight:bold;
|
||||||
background-color:rgba(0,103,160,0.5);
|
|
||||||
}
|
}
|
||||||
|
.samsclub{background-color:rgba(0,103,160,0.5);}
|
||||||
|
.costco{background-color:rgba(227,42,54,0.5);}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="map"></div>
|
<div id="map"></div>
|
||||||
<script>
|
<script>
|
||||||
let osm=L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")
|
let map=L.map("map",{center:[38.243,-85.647],zoom:11,layers:[L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png")]});
|
||||||
let map=L.map("map",{center:[38.243,-85.647],zoom:11,layers:[osm]});
|
let layerControl=L.control.layers(null,null,{collapsed:false}).addTo(map);
|
||||||
let layerControl=L.control.layers({"fetching gas prices...":osm},null,{collapsed:false}).addTo(map);
|
let chains={"Sam's Club":"https://www.samsclub.com/local/fuel-center/-/X","Costco":"https://www.costco.com/warehouse-locations-X.html#:~:text=Gas%20Station"};
|
||||||
fetch("gas.csv").then(response=>{
|
for (const [chain,url] of Object.entries(chains)){
|
||||||
layerControl.remove();
|
const chainId=chain.toLowerCase().replace(/[^a-z]/g,'');
|
||||||
|
chains[chain]=L.layerGroup().addTo(map);
|
||||||
|
layerControl.addOverlay(chains[chain],`${chain} loading...`)
|
||||||
|
fetch(chainId+".csv").then(response=>{
|
||||||
if(!response.ok){throw new Error(response.status)}
|
if(!response.ok){throw new Error(response.status)}
|
||||||
return response.text()
|
return response.text()
|
||||||
}).then(csv=>{
|
}).then(csv=>{
|
||||||
let storeLayers={},store,url;
|
|
||||||
csv.split("\n").forEach(line=>{
|
csv.split("\n").forEach(line=>{
|
||||||
if(line.includes(",")){
|
|
||||||
let [u,p,lat,lng,id]=line.split(",");
|
let [u,p,lat,lng,id]=line.split(",");
|
||||||
[u,p]=[u,p].map(cents=>"$"+(cents/100).toFixed(2));
|
[u,p]=[u,p].map(cents=>"$"+(cents/100).toFixed(2));
|
||||||
L.marker([lat,lng],{icon:L.divIcon({className:store,html:`<a href="${url.replace("X",id)}">${u}\n${p}</a>`,iconSize:[44,44]})}).addTo(storeLayers[store])
|
L.marker([lat,lng],{icon:L.divIcon({className:chainId,html:`<a href="${url.replace("X",id)}">${u}\n${p}</a>`,iconSize:[44,44]})}).addTo(chains[chain])
|
||||||
}else{
|
|
||||||
[store,url]=line.split(" ");
|
|
||||||
storeLayers[store]=L.layerGroup().addTo(map)
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
L.control.layers(null,storeLayers,{collapsed:false}).addTo(map)
|
layerControl.removeLayer(chains[chain]);
|
||||||
}).catch(error=>{
|
layerControl.addOverlay(chains[chain],`${chain} (${chains[chain].getLayers().length} locations)`)
|
||||||
L.control.layers({"fetch failed. you could try reloading, otherwise email me.":osm},null,{collapsed:false}).addTo(map);
|
}).catch(error=>{
|
||||||
console.error(error)
|
console.error(error);
|
||||||
})
|
layerControl.removeLayer(chains[chain]);
|
||||||
|
layerControl.addOverlay(L.layerGroup(),`${chain} request was blocked :(`)
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue