diff --git a/.gitattributes b/.gitattributes index f2d419ba5757825e5e52d0a5a3c74515035f5301..e96f7b602980f36af727e4f81382eed09891a0c4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text db.sqlite3 filter=lfs diff=lfs merge=lfs -text +main/main_products.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md index 1f24d7a6592b27c97cc5596e0691d773ed2fce96..6910db069c37af8fc33b6c58030b1fb873cd3852 100644 --- a/README.md +++ b/README.md @@ -1,10 +1 @@ ---- -license: apache-2.0 -title: Procom -sdk: docker -emoji: 📚 -colorFrom: blue -colorTo: yellow -pinned: true ---- -# procomBackend \ No newline at end of file +# procomBackend diff --git a/amazon/__pycache__/views.cpython-311.pyc b/amazon/__pycache__/views.cpython-311.pyc index 9c8cce4b985cdb72570931c14f61865319014f8a..31aaf6fb05d4e84a2ea4c866f73aef3f01482d6a 100644 Binary files a/amazon/__pycache__/views.cpython-311.pyc and b/amazon/__pycache__/views.cpython-311.pyc differ diff --git a/amazon/views.py b/amazon/views.py index e916953c8ed8465e1f14ebf6468a2716037104c3..01f7e27e5cd549d7b0cfc1f200c0c53c5f7fcf0f 100644 --- a/amazon/views.py +++ b/amazon/views.py @@ -7,8 +7,6 @@ import requests from bs4 import BeautifulSoup # Create your views here. -ue_sid_global = "" -ue_mid_global = "" def sessionIdGenrator(): conn = http.client.HTTPSConnection("www.amazon.in") @@ -27,8 +25,7 @@ def searchAPI(ue_sid, ue_mid, query): conn = http.client.HTTPSConnection("completion.amazon.in") payload = '' headers = {} - conn.request("GET", "/api/2017/suggestions?prefix="+query.replace(" ", "+") + - "&alias=aps&session-id="+ue_sid+"&mid="+ue_mid, payload, headers) + conn.request("GET", "/api/2017/suggestions?prefix="+query.replace(" ", "+") + "&alias=aps&session-id="+ue_sid+"&mid="+ue_mid, payload, headers) res = conn.getresponse() data = res.read() response = data.decode("utf-8") @@ -39,8 +36,7 @@ def getAllProduct(query, page): conn = http.client.HTTPSConnection("www.amazon.in") payload = '' headers = {} - conn.request("POST", "/s/query?k="+query + - "&page="+str(page), payload, headers) + conn.request("POST", "/s/query?k="+query + "&page="+str(page), payload, headers) res = conn.getresponse() data = res.read() response = data.decode("utf-8") @@ -62,8 +58,7 @@ def getAllProduct(query, page): except: pass try: - title = soup.find_all( - "img", {"class", "s-image"})[0]['alt'].replace("Sponsored Ad - ", "") + title = soup.find_all("img", {"class", "s-image"})[0]['alt'].replace("Sponsored Ad - ", "") tempProduct["title"] = title except: pass @@ -73,26 +68,22 @@ def getAllProduct(query, page): except: pass try: - symbol = soup.find_all( - "span", {"class", "a-price-symbol"})[0].text + symbol = soup.find_all("span", {"class", "a-price-symbol"})[0].text tempProduct["symbol"] = symbol except: pass try: - price = soup.find_all( - "span", {"class", "a-price-whole"})[0].text + price = soup.find_all("span", {"class", "a-price-whole"})[0].text tempProduct["price"] = price except: pass try: - fullPrice = soup.find_all( - "span", {"class", "a-offscreen"})[1].text - tempProduct["fullPrice"] = fullPrice + fullPrice = soup.find_all("span", {"class", "a-offscreen"})[1].text + tempProduct["fullPrice"] = fullPrice[1:] except: pass try: - offer = soup.find_all( - "span", {"class", "a-truncate-full"})[0].text + offer = soup.find_all("span", {"class", "a-truncate-full"})[0].text tempProduct["offer"] = offer except: pass @@ -115,6 +106,8 @@ def getProductsList(request): page = (request.GET.get('page')) except: page = 1 + if page == None: + page = 1 data = getAllProduct(query, page) return Response({"data": data}) @@ -132,27 +125,22 @@ def getProductDetail(request): data = {} soup = BeautifulSoup(response, features="html5lib") #title = response.split('id="productTitle"')[1].split(">")[1].split("")[1].split("")[1].split("")[1].split("")[1].split("/', views.getProductData), path('search/', views.searchQuery), path('fetchCategory/', views.fetchCategory), - path('hello/', views.hello), + path('getComparisonChart/', views.getComparisonChart), + path('dataManipulator/', views.dataManipulator), + path('dataAdder/', views.dataAdder), + path('comparisionData/', views.comparisionData), + path('fetchPriceData/', views.fetchPriceData) ] diff --git a/main/views.py b/main/views.py index cf6c6016680dc22f039249d9003078a0ad508750..ffbe318d8bf8631d7dad4e2e4ff0564d472703a8 100644 --- a/main/views.py +++ b/main/views.py @@ -4,22 +4,36 @@ from rest_framework.decorators import api_view import json from .models import Products, Categories import os +import requests +from django.http import HttpResponse +from django.template import loader +from concurrent.futures import ThreadPoolExecutor # Create your views here. @api_view(['GET']) def getProductData(request, category): - category = category.replace("-", " ").lower() - obj = Products.objects.filter(category=category).all() + page = request.GET.get('page') + obj = Products.objects.filter(category=Categories.objects.filter(link=category).first()).all() data = {"data": []} for i in obj: temp = {} temp["name"] = i.name temp["score"] = i.score temp["image"] = i.image - temp["propGroups"] = i.propGroups + temp["propGroups"] = i.propGroupsMini temp["propScore"] = i.propScore + temp["link"] = i.link data["data"].append(temp) + data["data"] = sorted(data["data"], key=lambda k: k['score'] if k['score'] is not None else 0, reverse=True) + if page != None: + start = (int(page)-1)*50 + end = int(page)*50 + data["data"] = data["data"][start:end] + else: + data["data"] = data["data"][:50] + if data["data"] == []: + return Response({"msg": "No Data Found"}) return Response(data) @@ -33,16 +47,13 @@ def searchQuery(request): temp["name"] = i.name temp["score"] = i.score temp["image"] = i.image - temp["propGroups"] = i.propGroups + temp["propGroups"] = i.propGroupsMini temp["propScore"] = i.propScore + temp["link"] = i.link data["data"].append(temp) return Response(data) -@api_view(['GET']) -def hello(request): - return Response({"data":"Hello World"}) - @api_view(['GET']) def fetchCategory(request): obj = Categories.objects.all() @@ -54,6 +65,29 @@ def fetchCategory(request): data["data"].append(temp) return Response(data) +@api_view(['GET']) +def comparisionData(request): + try: + compare = request.GET.get('compare') + url = "https://versus.com/api/store/en/"+compare+"?ts=9980526090123&userId=&type=json" + response = requests.request("GET", url) + return HttpResponse(json.dumps(response.json()), content_type="application/json") + except: + return Response({"error": "No Data Found"}) + +@api_view(['GET']) +def fetchPriceData(request): + try: + compare = request.GET.get('compare') + url = "https://versus.com/api/prices/"+compare+"/IN?type=json" + headers = { + 'Accept': 'application/json' + } + response = requests.request("GET", url, headers=headers) + return HttpResponse(json.dumps(response.json()), content_type="application/json") + except: + return Response({"error": "No Data Found"}) + # path = "./data/" # dir_list = os.listdir(path) # print(dir_list) @@ -77,3 +111,89 @@ def fetchCategory(request): # obj = Categories(name=path.split(".json")[0].replace("-", " ").title()) # obj.save() # print(path) + + +def getComparisonChart(request): + compare = request.GET.get('compare') + url = "https://versus.com/share/summary/en/"+compare + response = requests.get(url) + template ="
" + data = (response.text) + data = data.split("")[0] + template = template.replace("'%%INITIAL_DATA%%'", data) + return HttpResponse(template) + + +def dataManipulator(request): + # list all files from ./data/ + path = "./data/" + dir_list = os.listdir(path) + categorys = Categories.objects.all() + count = 0 + for i in dir_list: + products = Products.objects.filter(category=categorys[count]).all() + count += 1 + data = json.loads(open(path+i, "r").read()) + for product in products: + for j in data["data"]: + if j["name"] == product.name: + print(product.name) + product.propGroupsMini = j["propGroups"] + Products.objects.bulk_update(products, ["propGroupsMini"]) + return HttpResponse("Done") + +def threadFunc(product,count): + if product.terms == {}: + try: + url = "https://versus.com/api/store/en/"+product.link+"?ts=9980526090123&userId=&type=json" + response = requests.request("GET", url) + data = response.json() + product.terms = data["terms"] + product.suggestions = data["searchOverlay"]["suggestions"] + product.tldr = data["comparison"]["tldr"][0] + product.propGroups = data["comparison"]["propGroups"] + product.notApplicableProps = data["comparison"]["notApplicableProps"] + product.cheapAlternatives = data["comparison"]["cheapAlternatives"] + product.topProps = data["comparison"]["topProps"] + product.popularCompare = data["comparison"]["popular"] + product.toplist = data["comparison"]["toplist"] + print(count," : ",product.name) + except: + print("Error : ",product.name) + else: + print("Already Done : ",product.name) + +import threading +def dataAdder(request): + products = Products.objects.order_by("name").all() + count = 0 + for i in range(0,len(products),5): + count += 1 + t1 = threading.Thread(target=threadFunc, args=(products[i],count)) + count += 1 + t2 = threading.Thread(target=threadFunc, args=(products[i+1],count)) + count += 1 + t3 = threading.Thread(target=threadFunc, args=(products[i+2],count)) + count += 1 + t4 = threading.Thread(target=threadFunc, args=(products[i+3],count)) + count += 1 + t5 = threading.Thread(target=threadFunc, args=(products[i+4],count)) + t1.start() + t2.start() + t3.start() + t4.start() + t5.start() + t1.join() + t2.join() + t3.join() + t4.join() + t5.join() + if count > 14400: + products[i].save() + products[i+1].save() + products[i+2].save() + products[i+3].save() + products[i+4].save() + + + return HttpResponse("Done") \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000000000000000000000000000000000000..b207dd8dd16032ee57aa9d65d034eb352880fb16 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "procom.settings") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == "__main__": + main() diff --git a/procom/__pycache__/settings.cpython-311.pyc b/procom/__pycache__/settings.cpython-311.pyc index a8a260130a584fba143babebab74f54750c723a4..ec915833b0ad39b27e50bc0c13bf75b5c6adc328 100644 Binary files a/procom/__pycache__/settings.cpython-311.pyc and b/procom/__pycache__/settings.cpython-311.pyc differ diff --git a/procom/__pycache__/urls.cpython-311.pyc b/procom/__pycache__/urls.cpython-311.pyc index f4a201a8cc5c0b68377ac678cec33e2de74466e1..b7fcd2256f849859ffacd0d3a0ca41bdf8524d10 100644 Binary files a/procom/__pycache__/urls.cpython-311.pyc and b/procom/__pycache__/urls.cpython-311.pyc differ diff --git a/procom/settings.py b/procom/settings.py index a6222e8303d053623e0bed9c4dd92eaa9cbc7a64..15e6fb9207b56875992e57c9c0fee82858b36fac 100644 --- a/procom/settings.py +++ b/procom/settings.py @@ -11,11 +11,13 @@ https://docs.djangoproject.com/en/4.1/ref/settings/ """ from pathlib import Path - +import os # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +X_FRAME_OPTIONS = 'ALLOWALL' +XS_SHARING_ALLOWED_METHODS = ['POST','GET','OPTIONS', 'PUT', 'DELETE'] # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ @@ -25,14 +27,16 @@ SECRET_KEY = "django-insecure-5p!s7ni0udj)mby7v$q)c3t=%6m7mkxl=%+__^u!ae+(h1+pcq # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['localhost', '127.0.0.1','thejagstudio-procom.hf.space','productcompare.vercel.app'] +ALLOWED_HOSTS = ['localhost', '127.0.0.1','thejagstudio-procom.hf.space','productcompare.vercel.app','www.amazon.in','www.flipkart.com','www.croma.com'] CORS_ALLOWED_ORIGINS = [ 'http://localhost:3000', 'http://127.0.0.1:3000', + 'http://127.0.0.1:3002', 'https://productcompare.vercel.app', 'https://thejagstudio-procom.hf.space', - 'https://procom-h875tncwu-thejagstudio.vercel.app', - 'https://procom-git-main-thejagstudio.vercel.app' + 'https://www.amazon.in', + 'https://www.flipkart.com', + 'https://www.croma.com', ] # Application definition @@ -44,11 +48,12 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", - "corsheaders", "main", + "corsheaders", "rest_framework", "flipkart", - "amazon" + "amazon", + "croma", ] MIDDLEWARE = [ @@ -67,7 +72,7 @@ ROOT_URLCONF = "procom.urls" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [], + "DIRS": ["templates"], "APP_DIRS": True, "OPTIONS": { "context_processors": [ @@ -128,7 +133,10 @@ USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ -STATIC_URL = "static/" +STATIC_URL = '/static/' +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "static") +] # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field diff --git a/procom/urls.py b/procom/urls.py index 1b580a4293b71119de9fa357c11efd7a132f71aa..97d59701aa033006f0574c77c579f0812f65957e 100644 --- a/procom/urls.py +++ b/procom/urls.py @@ -21,4 +21,5 @@ urlpatterns = [ path('', include('main.urls')), path('api/amazon/', include('amazon.urls')), path('api/flipkart/', include('flipkart.urls')), + path('api/croma/', include('croma.urls')), ] diff --git a/static/chart/chartScript1.mjs b/static/chart/chartScript1.mjs new file mode 100644 index 0000000000000000000000000000000000000000..e0f817e5cb485a3cf58e888c5b7874db616baa4a --- /dev/null +++ b/static/chart/chartScript1.mjs @@ -0,0 +1,2268 @@ +/*! For license information please see 817-3e271030583f90d540c298f49d0c0c80bdbef9ad.min.mjs.LICENSE.txt */ +(self.__LOADABLE_LOADED_CHUNKS__ = self.__LOADABLE_LOADED_CHUNKS__ || []).push([ + [817], + { + 2495: (t, e) => { + var r; + !(function () { + "use strict"; + var n = {}.hasOwnProperty; + function o() { + for (var t = [], e = 0; e < arguments.length; e++) { + var r = arguments[e]; + if (r) { + var i = typeof r; + if ("string" === i || "number" === i) t.push((this && this[r]) || r); + else if (Array.isArray(r)) t.push(o.apply(this, r)); + else if ("object" === i) for (var u in r) n.call(r, u) && r[u] && t.push((this && this[u]) || u); + } + } + return t.join(" "); + } + t.exports + ? (t.exports = o) + : void 0 === + (r = function () { + return o; + }.apply(e, [])) || (t.exports = r); + })(); + }, + 9257: (t, e, r) => { + var n = r(6121), + o = r(5222), + i = r(3120), + u = n.TypeError; + t.exports = function (t) { + if (o(t)) return t; + throw u(i(t) + " is not a function"); + }; + }, + 2193: (t, e, r) => { + var n = r(6121), + o = r(5222), + i = n.String, + u = n.TypeError; + t.exports = function (t) { + if ("object" == typeof t || o(t)) return t; + throw u("Can't set " + i(t) + " as a prototype"); + }; + }, + 9690: (t, e, r) => { + var n = r(1386), + o = r(3571), + i = r(7455), + u = n("unscopables"), + a = Array.prototype; + null == a[u] && i.f(a, u, { configurable: !0, value: o(null) }), + (t.exports = function (t) { + a[u][t] = !0; + }); + }, + 7675: (t, e, r) => { + "use strict"; + var n = r(3832).charAt; + t.exports = function (t, e, r) { + return e + (r ? n(t, e).length : 1); + }; + }, + 6956: (t, e, r) => { + var n = r(6121), + o = r(2521), + i = n.String, + u = n.TypeError; + t.exports = function (t) { + if (o(t)) return t; + throw u(i(t) + " is not an object"); + }; + }, + 9729: (t, e, r) => { + var n = r(9969), + o = r(1588), + i = r(5902), + u = function (t) { + return function (e, r, u) { + var a, + c = n(e), + s = i(c), + l = o(u, s); + if (t && r != r) { + for (; s > l; ) if ((a = c[l++]) != a) return !0; + } else for (; s > l; l++) if ((t || l in c) && c[l] === r) return t || l || 0; + return !t && -1; + }; + }; + t.exports = { includes: u(!0), indexOf: u(!1) }; + }, + 1939: (t, e, r) => { + var n = r(7585); + t.exports = n([].slice); + }, + 2849: (t, e, r) => { + var n = r(7585), + o = n({}.toString), + i = n("".slice); + t.exports = function (t) { + return i(o(t), 8, -1); + }; + }, + 9538: (t, e, r) => { + var n = r(6121), + o = r(6395), + i = r(5222), + u = r(2849), + a = r(1386)("toStringTag"), + c = n.Object, + s = + "Arguments" == + u( + (function () { + return arguments; + })() + ); + t.exports = o + ? u + : function (t) { + var e, r, n; + return void 0 === t + ? "Undefined" + : null === t + ? "Null" + : "string" == + typeof (r = (function (t, e) { + try { + return t[e]; + } catch (r) {} + })((e = c(t)), a)) + ? r + : s + ? u(e) + : "Object" == (n = u(e)) && i(e.callee) + ? "Arguments" + : n; + }; + }, + 4488: (t, e, r) => { + var n = r(9146), + o = r(9593), + i = r(8769), + u = r(7455); + t.exports = function (t, e, r) { + for (var a = o(e), c = u.f, s = i.f, l = 0; l < a.length; l++) { + var f = a[l]; + n(t, f) || (r && n(r, f)) || c(t, f, s(e, f)); + } + }; + }, + 4264: (t, e, r) => { + var n = r(2763); + t.exports = !n(function () { + function t() {} + return (t.prototype.constructor = null), Object.getPrototypeOf(new t()) !== t.prototype; + }); + }, + 4427: (t, e, r) => { + "use strict"; + var n = r(4109).IteratorPrototype, + o = r(3571), + i = r(5938), + u = r(4849), + a = r(3403), + c = function () { + return this; + }; + t.exports = function (t, e, r, s) { + var l = e + " Iterator"; + return (t.prototype = o(n, { next: i(+!s, r) })), u(t, l, !1, !0), (a[l] = c), t; + }; + }, + 1471: (t, e, r) => { + var n = r(7703), + o = r(7455), + i = r(5938); + t.exports = n + ? function (t, e, r) { + return o.f(t, e, i(1, r)); + } + : function (t, e, r) { + return (t[e] = r), t; + }; + }, + 5938: (t) => { + t.exports = function (t, e) { + return { enumerable: !(1 & t), configurable: !(2 & t), writable: !(4 & t), value: e }; + }; + }, + 4247: (t, e, r) => { + "use strict"; + var n = r(7309), + o = r(7702), + i = r(8451), + u = r(3343), + a = r(5222), + c = r(4427), + s = r(9366), + l = r(6594), + f = r(4849), + p = r(1471), + v = r(2327), + y = r(1386), + d = r(3403), + b = r(4109), + h = u.PROPER, + m = u.CONFIGURABLE, + g = b.IteratorPrototype, + x = b.BUGGY_SAFARI_ITERATORS, + w = y("iterator"), + O = "keys", + S = "values", + _ = "entries", + j = function () { + return this; + }; + t.exports = function (t, e, r, u, y, b, E) { + c(r, e, u); + var k, + P, + T, + I = function (t) { + if (t === y && M) return M; + if (!x && t in A) return A[t]; + switch (t) { + case O: + case S: + case _: + return function () { + return new r(this, t); + }; + } + return function () { + return new r(this); + }; + }, + C = e + " Iterator", + R = !1, + A = t.prototype, + L = A[w] || A["@@iterator"] || (y && A[y]), + M = (!x && L) || I(y), + $ = ("Array" == e && A.entries) || L; + if ( + ($ && (k = s($.call(new t()))) !== Object.prototype && k.next && (i || s(k) === g || (l ? l(k, g) : a(k[w]) || v(k, w, j)), f(k, C, !0, !0), i && (d[C] = j)), + h && + y == S && + L && + L.name !== S && + (!i && m + ? p(A, "name", S) + : ((R = !0), + (M = function () { + return o(L, this); + }))), + y) + ) + if (((P = { values: I(S), keys: b ? M : I(O), entries: I(_) }), E)) for (T in P) (x || R || !(T in A)) && v(A, T, P[T]); + else n({ target: e, proto: !0, forced: x || R }, P); + return (i && !E) || A[w] === M || v(A, w, M, { name: y }), (d[e] = M), P; + }; + }, + 7703: (t, e, r) => { + var n = r(2763); + t.exports = !n(function () { + return ( + 7 != + Object.defineProperty({}, 1, { + get: function () { + return 7; + }, + })[1] + ); + }); + }, + 6004: (t, e, r) => { + var n = r(6121), + o = r(2521), + i = n.document, + u = o(i) && o(i.createElement); + t.exports = function (t) { + return u ? i.createElement(t) : {}; + }; + }, + 3729: (t) => { + t.exports = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }; + }, + 2825: (t, e, r) => { + var n = r(6004)("span").classList, + o = n && n.constructor && n.constructor.prototype; + t.exports = o === Object.prototype ? void 0 : o; + }, + 987: (t, e, r) => { + var n = r(8635); + t.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(n); + }, + 1441: (t, e, r) => { + var n = r(2849), + o = r(6121); + t.exports = "process" == n(o.process); + }, + 8635: (t, e, r) => { + var n = r(7642); + t.exports = n("navigator", "userAgent") || ""; + }, + 6962: (t, e, r) => { + var n, + o, + i = r(6121), + u = r(8635), + a = i.process, + c = i.Deno, + s = (a && a.versions) || (c && c.version), + l = s && s.v8; + l && (o = (n = l.split("."))[0] > 0 && n[0] < 4 ? 1 : +(n[0] + n[1])), !o && u && (!(n = u.match(/Edge\/(\d+)/)) || n[1] >= 74) && (n = u.match(/Chrome\/(\d+)/)) && (o = +n[1]), (t.exports = o); + }, + 4731: (t) => { + t.exports = ["constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf"]; + }, + 7309: (t, e, r) => { + var n = r(6121), + o = r(8769).f, + i = r(1471), + u = r(2327), + a = r(6565), + c = r(4488), + s = r(676); + t.exports = function (t, e) { + var r, + l, + f, + p, + v, + y = t.target, + d = t.global, + b = t.stat; + if ((r = d ? n : b ? n[y] || a(y, {}) : (n[y] || {}).prototype)) + for (l in e) { + if (((p = e[l]), (f = t.noTargetGet ? (v = o(r, l)) && v.value : r[l]), !s(d ? l : y + (b ? "." : "#") + l, t.forced) && void 0 !== f)) { + if (typeof p == typeof f) continue; + c(p, f); + } + (t.sham || (f && f.sham)) && i(p, "sham", !0), u(r, l, p, t); + } + }; + }, + 2763: (t) => { + t.exports = function (t) { + try { + return !!t(); + } catch (e) { + return !0; + } + }; + }, + 1325: (t, e, r) => { + "use strict"; + r(8775); + var n = r(7585), + o = r(2327), + i = r(3546), + u = r(2763), + a = r(1386), + c = r(1471), + s = a("species"), + l = RegExp.prototype; + t.exports = function (t, e, r, f) { + var p = a(t), + v = !u(function () { + var e = {}; + return ( + (e[p] = function () { + return 7; + }), + 7 != ""[t](e) + ); + }), + y = + v && + !u(function () { + var e = !1, + r = /a/; + return ( + "split" === t && + (((r = {}).constructor = {}), + (r.constructor[s] = function () { + return r; + }), + (r.flags = ""), + (r[p] = /./[p])), + (r.exec = function () { + return (e = !0), null; + }), + r[p](""), + !e + ); + }); + if (!v || !y || r) { + var d = n(/./[p]), + b = e(p, ""[t], function (t, e, r, o, u) { + var a = n(t), + c = e.exec; + return c === i || c === l.exec ? (v && !u ? { done: !0, value: d(e, r, o) } : { done: !0, value: a(r, e, o) }) : { done: !1 }; + }); + o(String.prototype, t, b[0]), o(l, p, b[1]); + } + f && c(l[p], "sham", !0); + }; + }, + 9102: (t, e, r) => { + var n = r(4893), + o = Function.prototype, + i = o.apply, + u = o.call; + t.exports = + ("object" == typeof Reflect && Reflect.apply) || + (n + ? u.bind(i) + : function () { + return u.apply(i, arguments); + }); + }, + 3322: (t, e, r) => { + var n = r(7585), + o = r(9257), + i = r(4893), + u = n(n.bind); + t.exports = function (t, e) { + return ( + o(t), + void 0 === e + ? t + : i + ? u(t, e) + : function () { + return t.apply(e, arguments); + } + ); + }; + }, + 4893: (t, e, r) => { + var n = r(2763); + t.exports = !n(function () { + var t = function () {}.bind(); + return "function" != typeof t || t.hasOwnProperty("prototype"); + }); + }, + 7702: (t, e, r) => { + var n = r(4893), + o = Function.prototype.call; + t.exports = n + ? o.bind(o) + : function () { + return o.apply(o, arguments); + }; + }, + 3343: (t, e, r) => { + var n = r(7703), + o = r(9146), + i = Function.prototype, + u = n && Object.getOwnPropertyDescriptor, + a = o(i, "name"), + c = a && "something" === function () {}.name, + s = a && (!n || (n && u(i, "name").configurable)); + t.exports = { EXISTS: a, PROPER: c, CONFIGURABLE: s }; + }, + 7585: (t, e, r) => { + var n = r(4893), + o = Function.prototype, + i = o.bind, + u = o.call, + a = n && i.bind(u, u); + t.exports = n + ? function (t) { + return t && a(t); + } + : function (t) { + return ( + t && + function () { + return u.apply(t, arguments); + } + ); + }; + }, + 7642: (t, e, r) => { + var n = r(6121), + o = r(5222), + i = function (t) { + return o(t) ? t : void 0; + }; + t.exports = function (t, e) { + return arguments.length < 2 ? i(n[t]) : n[t] && n[t][e]; + }; + }, + 4692: (t, e, r) => { + var n = r(9257); + t.exports = function (t, e) { + var r = t[e]; + return null == r ? void 0 : n(r); + }; + }, + 4008: (t, e, r) => { + var n = r(7585), + o = r(4766), + i = Math.floor, + u = n("".charAt), + a = n("".replace), + c = n("".slice), + s = /\$([$&'`]|\d{1,2}|<[^>]*>)/g, + l = /\$([$&'`]|\d{1,2})/g; + t.exports = function (t, e, r, n, f, p) { + var v = r + t.length, + y = n.length, + d = l; + return ( + void 0 !== f && ((f = o(f)), (d = s)), + a(p, d, function (o, a) { + var s; + switch (u(a, 0)) { + case "$": + return "$"; + case "&": + return t; + case "`": + return c(e, 0, r); + case "'": + return c(e, v); + case "<": + s = f[c(a, 1, -1)]; + break; + default: + var l = +a; + if (0 === l) return o; + if (l > y) { + var p = i(l / 10); + return 0 === p ? o : p <= y ? (void 0 === n[p - 1] ? u(a, 1) : n[p - 1] + u(a, 1)) : o; + } + s = n[l - 1]; + } + return void 0 === s ? "" : s; + }) + ); + }; + }, + 6121: (t, e, r) => { + var n = function (t) { + return t && t.Math == Math && t; + }; + t.exports = + n("object" == typeof globalThis && globalThis) || + n("object" == typeof window && window) || + n("object" == typeof self && self) || + n("object" == typeof r.g && r.g) || + (function () { + return this; + })() || + Function("return this")(); + }, + 9146: (t, e, r) => { + var n = r(7585), + o = r(4766), + i = n({}.hasOwnProperty); + t.exports = + Object.hasOwn || + function (t, e) { + return i(o(t), e); + }; + }, + 2048: (t) => { + t.exports = {}; + }, + 4174: (t, e, r) => { + var n = r(7642); + t.exports = n("document", "documentElement"); + }, + 7226: (t, e, r) => { + var n = r(7703), + o = r(2763), + i = r(6004); + t.exports = + !n && + !o(function () { + return ( + 7 != + Object.defineProperty(i("div"), "a", { + get: function () { + return 7; + }, + }).a + ); + }); + }, + 3169: (t, e, r) => { + var n = r(6121), + o = r(7585), + i = r(2763), + u = r(2849), + a = n.Object, + c = o("".split); + t.exports = i(function () { + return !a("z").propertyIsEnumerable(0); + }) + ? function (t) { + return "String" == u(t) ? c(t, "") : a(t); + } + : a; + }, + 9835: (t, e, r) => { + var n = r(7585), + o = r(5222), + i = r(4682), + u = n(Function.toString); + o(i.inspectSource) || + (i.inspectSource = function (t) { + return u(t); + }), + (t.exports = i.inspectSource); + }, + 2995: (t, e, r) => { + var n, + o, + i, + u = r(5546), + a = r(6121), + c = r(7585), + s = r(2521), + l = r(1471), + f = r(9146), + p = r(4682), + v = r(2562), + y = r(2048), + d = "Object already initialized", + b = a.TypeError, + h = a.WeakMap; + if (u || p.state) { + var m = p.state || (p.state = new h()), + g = c(m.get), + x = c(m.has), + w = c(m.set); + (n = function (t, e) { + if (x(m, t)) throw new b(d); + return (e.facade = t), w(m, t, e), e; + }), + (o = function (t) { + return g(m, t) || {}; + }), + (i = function (t) { + return x(m, t); + }); + } else { + var O = v("state"); + (y[O] = !0), + (n = function (t, e) { + if (f(t, O)) throw new b(d); + return (e.facade = t), l(t, O, e), e; + }), + (o = function (t) { + return f(t, O) ? t[O] : {}; + }), + (i = function (t) { + return f(t, O); + }); + } + t.exports = { + set: n, + get: o, + has: i, + enforce: function (t) { + return i(t) ? o(t) : n(t, {}); + }, + getterFor: function (t) { + return function (e) { + var r; + if (!s(e) || (r = o(e)).type !== t) throw b("Incompatible receiver, " + t + " required"); + return r; + }; + }, + }; + }, + 5222: (t) => { + t.exports = function (t) { + return "function" == typeof t; + }; + }, + 676: (t, e, r) => { + var n = r(2763), + o = r(5222), + i = /#|\.prototype\./, + u = function (t, e) { + var r = c[a(t)]; + return r == l || (r != s && (o(e) ? n(e) : !!e)); + }, + a = (u.normalize = function (t) { + return String(t).replace(i, ".").toLowerCase(); + }), + c = (u.data = {}), + s = (u.NATIVE = "N"), + l = (u.POLYFILL = "P"); + t.exports = u; + }, + 2521: (t, e, r) => { + var n = r(5222); + t.exports = function (t) { + return "object" == typeof t ? null !== t : n(t); + }; + }, + 8451: (t) => { + t.exports = !1; + }, + 5057: (t, e, r) => { + var n = r(6121), + o = r(7642), + i = r(5222), + u = r(8449), + a = r(2020), + c = n.Object; + t.exports = a + ? function (t) { + return "symbol" == typeof t; + } + : function (t) { + var e = o("Symbol"); + return i(e) && u(e.prototype, c(t)); + }; + }, + 4109: (t, e, r) => { + "use strict"; + var n, + o, + i, + u = r(2763), + a = r(5222), + c = r(3571), + s = r(9366), + l = r(2327), + f = r(1386), + p = r(8451), + v = f("iterator"), + y = !1; + [].keys && ("next" in (i = [].keys()) ? (o = s(s(i))) !== Object.prototype && (n = o) : (y = !0)), + null == n || + u(function () { + var t = {}; + return n[v].call(t) !== t; + }) + ? (n = {}) + : p && (n = c(n)), + a(n[v]) || + l(n, v, function () { + return this; + }), + (t.exports = { IteratorPrototype: n, BUGGY_SAFARI_ITERATORS: y }); + }, + 3403: (t) => { + t.exports = {}; + }, + 5902: (t, e, r) => { + var n = r(8331); + t.exports = function (t) { + return n(t.length); + }; + }, + 4020: (t, e, r) => { + var n = r(6962), + o = r(2763); + t.exports = + !!Object.getOwnPropertySymbols && + !o(function () { + var t = Symbol(); + return !String(t) || !(Object(t) instanceof Symbol) || (!Symbol.sham && n && n < 41); + }); + }, + 5546: (t, e, r) => { + var n = r(6121), + o = r(5222), + i = r(9835), + u = n.WeakMap; + t.exports = o(u) && /native code/.test(i(u)); + }, + 3571: (t, e, r) => { + var n, + o = r(6956), + i = r(7532), + u = r(4731), + a = r(2048), + c = r(4174), + s = r(6004), + l = r(2562), + f = l("IE_PROTO"), + p = function () {}, + v = function (t) { + return " + + + +
+
+ +

The fastest CORS Proxy you'll find. It's free!

+ +
+
100% free
+

A fast & simple way to fix CORS Errors

+

All you have to do is prefix the destination URL with the URL of our proxy and it will handle the + request on your behalf with appropriate CORS headers. Paste your URL and try:

+
+

+ https://corsproxy.io/? + + + +

+

Please enter a valid url!

+
+
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Secured by SSL

+
+
+
+
+ + + + + + + + + + + + + +

Global CDN

+
+
+
+
+ + + + + + + + + + + +

No Logs

+
+
+
+
+ + + + + + + + + + + + + +

99,9% Uptime

+
+
+
+
+ +
+

That's how to use it in your code:

+ const url = 'https://corsproxy.io/?' + encodeURIComponent('https://api.domain.com/...'); +
+ +
+ + + +
+ + + + + + diff --git a/templates/chart.html b/templates/chart.html new file mode 100644 index 0000000000000000000000000000000000000000..9b587615d30179a4dc3a1669a2b97759ea599fc5 --- /dev/null +++ b/templates/chart.html @@ -0,0 +1,38 @@ + + + + + + + + + + + +
+
+ + + + \ No newline at end of file