tekrop / overfast-api Goto Github PK
View Code? Open in Web Editor NEW⚡ Unofficial Overwatch 2 API, built with FastAPI, provides data on heroes, game modes, maps, and player careers
Home Page: https://overfast-api.tekrop.fr
License: MIT License
⚡ Unofficial Overwatch 2 API, built with FastAPI, provides data on heroes, game modes, maps, and player careers
Home Page: https://overfast-api.tekrop.fr
License: MIT License
Originally posted by davidetacchini May 15, 2023
Hi @TeKrop, nice API; can't wait to make the switch for my project and use it in production!
Wouldn't it be better using a dictionary of dictionaries than a list of dictionaries in the following section?
"career_stats": {
"all-heroes": [
{
"category": "best",
"label": "Best",
"stats": [
{
"key": "eliminations_most_in_game",
"label": "Eliminations - Most in Game",
"value": 62
},
]
},
{
"category": "average",
"label": "Average",
"stats": [
{
"key": "objective_kills_avg_per_10_min",
"label": "Objective Kills - Avg per 10 Min",
"value": 5.9
},
]
}
]
}
Personally, I think it is better in case someone wants to get a specific category (e.g. "best") without having to iterate through the entire list each time, so the time complexity would be O(1) instead of the actual O(n).
"career_stats": {
"all-heroes": {
"best": {
"eliminations_most_in_game": 62,
"final_blows_most_in_game": 38,
"all_damage_done_most_in_game": 21507,
all the other stats...
},
"average": {
"objective_kills_avg_per_10_min": 5.9,
all the other stats...
},
}
}
I see that you can have multiple key/value pairs per object by using a list of objects, thus adding more information. However, in this specific case, it's pretty easy to get the label
out of the key if a dictionary of dictionaries is used by simply formatting it. Thanks for the attention, keep up the good work :)
Can't even do a simple player request
import requests
player_id = "name-number"
x = requests.get(f'https://overfast-api.tekrop.fr/players/{player_id}/summary')
print(x.status_code)
Always 404
Currentley if you'll try to request a plyayer who achieved Champion rank API will crush with an error:
ValueError: 'ultimate' is not a valid CompetitiveDivision
Example: https://overfast-api.tekrop.fr/players/FDGod-2444/summary
Is your feature request related to a problem? Please describe.
HTTP 429 errors are not documented in the API, they should be at least for the live instance.
Describe the solution you'd like
Add HTTP 429 responses in documentation
Describe the bug
Follow-up of this PR : #109
age
and birthday
are not properly retrievedage
and birthday
are not retrieved in other languages than englishFirst of all - really nice api!
But can you provide some more informations about the heroes?
First of all can you create an endpoint where you can fetch all hero specific data with 1 api call? Atm i need to loop threw each hero to get the complete data. E.g. heroes/ana -> then heroes/ashe etc.
Maybe an endpoint heroes/all would be nice.
I have created an external json with some more informations needed for the heroes.
Would be really nice if this can be integraded into the normal heroes/all - heroes/ana request
[
{
"name": "Ana",
"totalhp": 200,
"hp": 200,
"armor": 0,
"shield": 0,
"abilities": [
{
"name": "Biotic Rifle",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltc56d4d9789a018d0/63390487ed7dcc6a0028039c/ANA_BIOTICRIFLE.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt90138e57c4b91c94/6339047e64fe5a7d4481a05c/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AnaBioticRifle_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "Sleep Dart",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltb27e2783f517c7fe/63390487e3c2a2741688cba3/ANA_SLEEPDART.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltb6b9ecf5d9a2ec69/6339047ef87c00687e8ef222/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AnaSleepDart_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "Biotic Grenade",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltcd66dcc6eb196187/633904873922a2677fc88cfa/ANA_BIOTICGRENADE.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt73fcfa06c4272760/6339047d3922a2677fc88cf6/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AnaBioticGrenade_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "Nano Boost",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt5901c5f790bb82f9/63390487da1d806602f83eee/ANA_NANOBOOST.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt557e93a659cf572c/6339047e1a0b5e7d3d1ec595/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AnaNanoBoost_WEB_16x9_1920x1080p30_WEBM.webm"
}
]
},
{
"name": "Ashe",
"totalhp": 200,
"hp": 200,
"armor": 0,
"shield": 0,
"abilities": [
{
"name": "The Viper",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltde449a1db082c1a1/633904ac64fe5a7d4481a060/ASHE_THE_VIPER.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltfb9b1667be81b34b/633904bab8dbde69f52798ee/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AsheTheViper_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "Coach Gun",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt0f6057298d1c0012/633904ac3922a2677fc88cfe/ASHE_COACH_GUN.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt65112ab5e888622d/633904b91a0b5e7d3d1ec599/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AsheCoachGun_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "Dynamite",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltbbcb722a61594c10/633904acf87c00687e8ef226/ASHE_DYNAMITE.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt9de32278cc1b4ea0/633904ba399a07678557c13d/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AsheDynamite_WEB_16x9_1920x1080p30_WEBM.webm"
},
{
"name": "B.O.B.",
"thumbnail": "https://images.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/blt171114cdbf544989/633904aced7dcc6a002803a0/ASHE_BOB.jpg",
"video": "https://assets.blz-contentstack.com/v3/assets/blt2477dcaf4ebd440c/bltc1dff03c9903dad0/633904baec7e18758be51042/OVERWATCH_WEBSITE_CHARACTER_CAPTURE_AsheBOB_WEB_16x9_1920x1080p30_WEBM.webm"
}
]
},
{
}
]
Blizzard has changed something on the page DOM, working on it
Some player profiles are not properly returned (ex: JohnV1-1190) because something changed in HTML content structure from Blizzard (HTTP 500).
Will investigate.
EDIT : Found the issue, Blizzard changed the way they show that a profile doesn't have any title ingame, fixing.
Following a Blizzard update (structure change) on profile pages, career endpoints are down (HTTP 500). I'm working on it.
Some career pages are not working since a update from today, because of some changes made by Blizzard.
Hello,
i found that torbjon and junkrat are missing.
Why?
Describe the bug*
Feedback by Keedosuul :
The API returns null for
weapon_accuracy
,critical_hit_accuracy
andobjective_kills
. My profile also does not have these categories. Similar categories that do exist for me would be "weapon accuracy - best in game" and "objective kills - avg per 10min". I knowweapon_accuracy
exists in the client but not on the website it seems (at least for me). I'm not sure if these stats are really needed by anyone but I just wanted to let you know.
I'll make a proper update.
To Reproduce
Go on a player profile page
Haven't found anything in the docs and im not sure if blizzard even exposes this, but it would be cool if you could get a players top 500 standing or the global top 500 leaderboard for each region, is there a way to do this?
I mentioned this briefly in my previous issue. From the profile page it is possible to know from which competitive season stats on the page are. blz-section.competitive-view
block contains 2 data atribbutes: data-latestherostatrankseason
and data-latestherostatrankseasonow2
which contains last season of OW1 and OW2 player has played respectively. I suggest to expose this data into API as it could be used in multiple useful ways. For example, to filter old \ irrelevant data or to track when player started to play new season.
In the "career stats" section of the career pages, there is a dropdown on right side allowing to display stats for a specific hero if the player has played him (or the statistics for all heroes). Sometimes, there is a hero in the list for which there is no stat to display (see the attached screenshot). Example (as of today), for Lùcio in competitive : https://overwatch.blizzard.com/en-us/career/copypasting-1216/
As the API enforces at least one item in this career stats list, the user is redirected to an HTTP 500 error page.
Sorry for creating an issuse, this is actually a question about the rank icons.
I want to collect all rank icons, wonder if it can be done via the OverFast API.
Use GM3 icon as example, heres the URL of it:
https://static.playoverwatch.com/img/pages/career/icons/rank/GrandmasterTier-3-e55e61f68f.png
I noticed that the file name is followed by something like hash code? I mean the e55e61f68f
, but I wasn't able to figure out how the hashing of it works.
Thank you!
https://overfast-api.tekrop.fr/players/Backxtar-2493/summary
The playerdata didn’t get updated since 5 days…
I’m gold 2 in tank (ranked).
Maybe an issue? Or is Blizzard down?
It results in an HTTP 500 error from the API. Example taken from this profile which resulted in error : https://overwatch.blizzard.com/en-us/career/PA%C5%B6P%C6%97%C5%A6%C7%BE-2234/
Seems like stats for all heroes are frozen after Mystery Heroes was released (i.e time_played is really easy to see).
I am guessing this is on blizzards side, and not something in the API, but I figured I might post it.
Adding Sourcery to explore and fix minor bugfixes in the projects might be a good thing to have. I only tested a few files but I found the following errors, not sure all of them are right, I let you decide 😄
value
in update_parser_cache
is dict | list
parser_data
in test_update_and_get_parser_cache
is list[dict[str, str]]
Hello,
I just installed your api on my VPS, using the docker-compose install. I encountered several issues during the installation, I fixed most of them, but i'm still facing a little one.
build-base
is not found, i replaced it with g++ make
and it seems to workoverfast-app-1 | 2023-04-10 12:06:05.423 | INFO | app.handlers.api_request_handler - Filtering the data using query...
overfast-app-1 | 2023-04-10 12:06:05.435 | WARNING | app.common.cache_manager - Redis server error : Error 111 connecting to 127.0.0.1:6379. Connection refused.
overfast-app-1 | 2023-04-10 12:06:05.436 | INFO | app.handlers.api_request_handler - Done ! Returning filtered data...
overfast-app-1 | 2023-04-10 12:06:05.998 | INFO | logging - 172.18.0.2:34734 - "GET /players/Navalex-21525 HTTP/1.0" 200
Even if i put on for redis cache on the env file. I will try to fix it, and keep you in touch, but you can still comment if you know what's going wrong.
I'll also add namecard URL (if any) and player title (if any)
I've just started looking through the API; it's super cool.
I'd love to have to opportunity to also see damage values for abilities/weapons. I think it'd be fun for assembling together teams with the most/least damage. Perhaps I've missed it and this feature already exists, if so, please point it out.
It may be that there isn't a Blizzard-run page for these values, if that's the case, I understand why it can't be scraped reliably into the API.
TY :)
{
"error": "Couldn't get Blizzard page (HTTP 502 error) : <html>\r\n<head><title>502 Bad Gateway</title></head>\r\n<body>\r\n<center><h1>502 Bad Gateway</h1></center>\r\n</body>\r\n</html>\r\n"
}
Is Blizzard down right now?
Noticed this today, Overwatch's website is now redirecting profiles from the name to a UID. For example mine redirects from Zencep-1489
to c85ba289b661d6fcbda82e|58a8345296109e00bdcb2af89f4118e3
now. It seems to not impact the API yet? although I can't tell with my profile:
I haven't played in season 9 so not sure if it's actually broken yet. Just informing early.
Also complete sidenote, I was wanting to start using Overfast's live instance for collecting player data. I'm not seeing anything about rate limits to the live instance, but is there a rational requests per second you expect without overloading your server?
New season now, will it be possible to query specific seasons, or only all competitive history as one big bulk?
I have noticed that sometimes players/{player_id}/stats/summary
endpoint returns empty response for competitive data despite Blizzard profile page actually shows some competitive stats. So far, I only found 2 such cases and both times the common denominator is players only played in open competitive queue.
It could be intended behaviour in which case it probably should be added in the docs, but I'm more inclined to think it's a bug as I don't really now how you can reliably remove Open Queue stats. The only two options I could think of is either remove heroes by role, if player doesn't have rank, or to use data-attribute latestherostatrankseason
(btw: can be useful to add it somewhere into api). I quickly glanced over the code and couldn't find any traces of such filtering. Moreover, /players/{player_id}
enpoint returns this data just fine.
Profiles in question:
https://overwatch.blizzard.com/en-us/career/Progresso-2749/
https://overfast-api.tekrop.fr/players/Progresso-2749/stats/summary?gamemode=competitive&platform=pc
https://overwatch.blizzard.com/en-us/career/fluffy-24694/
https://overfast-api.tekrop.fr/players/fluffy-24694/stats/summary?gamemode=competitive&platform=pc
(Why Blizzard even mixes up Role Queue with Open queue on their site is a different question but it is what it is, I guess)
Describe the bug
API not working since recent Blizzard pages changes
What do you think about specific herodata? I think about
Hero: Ana
Synergy: Genji, ...
Strong against: Junker Queen
Weak against: Kiriko
Maybe we could add those informations to the csv. If you give me the csv data structure i can add those information to it and you can put this into the api.
Those informations are really helpful but no given by blizzard and overwatch. Would make our wiki a lot better or do you think i need to implement this into my code?
Btw: there is a beta version out for android if you wanna test it with your api :)
https://github.com/Backxtar/watch-over-support/releases/tag/v1.0.0%2B33
Critical errors are encountered when trying to parse Blizzard career pages. It seems Blizzard made some changes 1 hour ago, I'm investigating.
As a result, users may encounter HTTP 500 errors while calling players careers related endpoints on the API.
Background cache update is disabled on the live version in the meantime.
I'm not sure if this was overlooked, but the Portrait value for a hero is only available on /heroes endpoint and not on the heroes/{hero_key} endpoint, which I find odd. It might just be a simple overlook from your part and nothing beyond that. And its also fairly simple to workaround this and obtain it either way. But as I noticed that you accept contributions/suggestions I decided to pass on my thoughts about this matter.
As I build a Discord bot, its not hard to fetch the portrait from the /heroes endpoint matching the key value with whatever hero and add that to the new object (could use index too, but you never know when the index order might change). But, looking at it from a resource-intensive perspective, it is one API call too much for a single portrait value, so it would be nice to find it where it should originally belong.
Is there any reason why only winrate percentage is shown in the summary endpoint?
I feel like showing actual number of games won\loss along with winrate percentage is fairly common practice for progress tracking and as this values is already used to calculate winrate I think it would only be fair to expose them in the final response.
Describe the bug
Errored when trying to run overfast-api in production
To Reproduce
git clone https://github.com/TeKrop/overfast-api && cd overfast-api
.env
and changed APP_PORT
, APP_BASE_URL
apt install make
(GNU make 4.3)overfast-api
)root@itzdrli-dev-armv8:/home/dev/overfast-api# make up
Building OverFastAPI (production mode)...
docker compose build
WARN[0000] /home/dev/overfast-api/docker-compose.yml: `version` is obsolete
[+] Building 43.4s (37/44) docker:default
=> [redis internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 109B 0.0s
=> [redis internal] load metadata for docker.io/library/redis:alpine 1.2s
=> [redis internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [redis 1/4] FROM docker.io/library/redis:alpine@sha256:0389bb8416d7c6ed065c25745179bf5d358e5d9472dd30a687ab36ffbb650262 1.3s
=> => resolve docker.io/library/redis:alpine@sha256:0389bb8416d7c6ed065c25745179bf5d358e5d9472dd30a687ab36ffbb650262 0.0s
=> => sha256:0389bb8416d7c6ed065c25745179bf5d358e5d9472dd30a687ab36ffbb650262 10.20kB / 10.20kB 0.0s
=> => sha256:94747bd812346354fd5042870b6e44e5406880a4e6b5736a9cf9c753110df11b 4.09MB / 4.09MB 0.3s
=> => sha256:cdfbf2aae844ce899e13c8e08b524cfba67d9ddd6c5ca10be36c85aac3dc2ce7 961B / 961B 0.1s
=> => sha256:16098e28f60cd9af53fb043cf88a98958b3760bc0ac96b7a4e8ee40ce1e3e7d3 2.48kB / 2.48kB 0.0s
=> => sha256:cdb453bbf44653b2fff791f1950bc858a4156551f0a99eb868a81e17144a5297 7.92kB / 7.92kB 0.0s
=> => sha256:510e151e1774050d5f5bb60a85736a80fa6c006791db5cebe6d506d65dec84a1 178.15kB / 178.15kB 0.3s
=> => sha256:70498b03edf90991b22ce539adf5694ff45163da2c71ec1501e5611fd228913e 934.59kB / 934.59kB 0.4s
=> => extracting sha256:94747bd812346354fd5042870b6e44e5406880a4e6b5736a9cf9c753110df11b 0.2s
=> => sha256:b4a58c1d515ac6de0babaf7b798a89ae1a6707d9b0a70b647b735060b7da96cd 12.14MB / 12.14MB 0.5s
=> => sha256:f5bb1f316352fd460172c7e484e857550bb23940c213e90eeda6853f5c7f80dc 97B / 97B 0.5s
=> => extracting sha256:cdfbf2aae844ce899e13c8e08b524cfba67d9ddd6c5ca10be36c85aac3dc2ce7 0.0s
=> => sha256:8e79f523a11aead29e92102b8b50db1bca63e4571c30cda9b899fdee8177ed98 573B / 573B 0.6s
=> => sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 32B / 32B 0.5s
=> => extracting sha256:510e151e1774050d5f5bb60a85736a80fa6c006791db5cebe6d506d65dec84a1 0.1s
=> => extracting sha256:70498b03edf90991b22ce539adf5694ff45163da2c71ec1501e5611fd228913e 0.1s
=> => extracting sha256:b4a58c1d515ac6de0babaf7b798a89ae1a6707d9b0a70b647b735060b7da96cd 0.5s
=> => extracting sha256:f5bb1f316352fd460172c7e484e857550bb23940c213e90eeda6853f5c7f80dc 0.0s
=> => extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 0.0s
=> => extracting sha256:8e79f523a11aead29e92102b8b50db1bca63e4571c30cda9b899fdee8177ed98 0.0s
=> [redis internal] load build context 0.0s
=> => transferring context: 878B 0.0s
=> [redis 2/4] WORKDIR /redis 0.1s
=> [redis 3/4] COPY init.sh ./ 0.0s
=> [redis 4/4] RUN chmod +x init.sh 0.2s
=> [redis] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:2c92f9ca2855eb09cbfdea5edabec9d27a207e0ca51a6d7dd5a51a1263b2e513 0.0s
=> => naming to docker.io/library/overfast-api-redis 0.0s
=> [app internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.04kB 0.0s
=> [worker internal] load metadata for docker.io/library/python:3.12-alpine 1.2s
=> [worker internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.04kB 0.0s
=> [app internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [worker internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [app main 1/10] FROM docker.io/library/python:3.12-alpine@sha256:d24ed567ee3b972478a232ceff84b0d002e18ee9f5d38234ecbffece23dfa084 1.8s
=> => resolve docker.io/library/python:3.12-alpine@sha256:d24ed567ee3b972478a232ceff84b0d002e18ee9f5d38234ecbffece23dfa084 0.0s
=> => sha256:d24ed567ee3b972478a232ceff84b0d002e18ee9f5d38234ecbffece23dfa084 1.65kB / 1.65kB 0.0s
=> => sha256:6714e211c290dc39908616ed0befdcc8f9097b69ee62d17f2f1833d764b93ef0 1.37kB / 1.37kB 0.0s
=> => sha256:0fe205a492b75b71368b95db211dc148d50240d50752f04b34d1024084561296 6.64kB / 6.64kB 0.0s
=> => sha256:820650aa2f5b8e795b04058fa617fb87ad3397f0fc2582400f9855b84f2d4401 465.47kB / 465.47kB 0.4s
=> => sha256:4e0f3549117ae48d35d3cbea60bca5ef0d654723e8065274c93137c3f2b44a60 14.68MB / 14.68MB 0.4s
=> => sha256:a5b6895e2863b5497adb5d68fe8e5241835c9624c9a31fd2b8532b08da56b638 242B / 242B 0.1s
=> => sha256:629a421706977cd903f62bb22483a0fa6cba236a94d23543e616bf5c24516467 2.74MB / 2.74MB 0.5s
=> => extracting sha256:820650aa2f5b8e795b04058fa617fb87ad3397f0fc2582400f9855b84f2d4401 0.2s
=> => extracting sha256:4e0f3549117ae48d35d3cbea60bca5ef0d654723e8065274c93137c3f2b44a60 0.8s
=> => extracting sha256:a5b6895e2863b5497adb5d68fe8e5241835c9624c9a31fd2b8532b08da56b638 0.0s
=> => extracting sha256:629a421706977cd903f62bb22483a0fa6cba236a94d23543e616bf5c24516467 0.3s
=> [app internal] load build context 0.1s
=> => transferring context: 10.25MB 0.1s
=> [worker internal] load build context 0.1s
=> => transferring context: 10.25MB 0.1s
=> [app main 2/10] WORKDIR /code 0.1s
=> [app main 3/10] RUN apk add build-base && apk add libffi-dev && pip install poetry==1.8.2 24.3s
=> [app main 4/10] COPY pyproject.toml /code/ 0.0s
=> [app main 5/10] COPY poetry.lock /code/ 0.0s
=> [app main 6/10] RUN poetry config virtualenvs.create false && poetry install --only main --no-interaction --no-ansi 8.7s
=> [app main 7/10] COPY ./app /code/app 0.0s
=> [worker main 8/10] COPY ./static /code/static 0.1s
=> [app main 9/10] COPY ./build/overfast-crontab /etc/crontabs/root 0.0s
=> [app main 10/10] RUN chmod +x /etc/crontabs/root 0.2s
=> [worker] exporting to image 1.3s
=> => exporting layers 1.2s
=> => writing image sha256:097b9c11ac8d43b68212e99b3aaa27c6faaa9496a4a56c2dd17d1e8e7bf5b007 0.0s
=> => naming to docker.io/library/overfast-api-worker 0.0s
=> [app] exporting to image 1.3s
=> => exporting layers 1.2s
=> => writing image sha256:0d945663dff46a7417e3bee5a459b9bdbe73b8b0bf075392d2382d10e3253569 0.0s
=> => naming to docker.io/library/overfast-api-app 0.0s
=> [nginx internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 284B 0.0s
=> [nginx internal] load metadata for docker.io/library/nginx:1.20.2-alpine 1.2s
=> [nginx internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [nginx 1/4] FROM docker.io/library/nginx:1.20.2-alpine@sha256:016789c9a2d021b2dcb5e1c724c75ab0a57cc4e8cd7aab7bb28e69fec7c8c4fc 1.0s
=> => resolve docker.io/library/nginx:1.20.2-alpine@sha256:016789c9a2d021b2dcb5e1c724c75ab0a57cc4e8cd7aab7bb28e69fec7c8c4fc 0.0s
=> => sha256:455c02918c4592a9beeeae47df541266f3ea53ed573feb767e5e8ab8dcee146e 2.72MB / 2.72MB 0.2s
=> => sha256:08b6b842dcd703db7772921ad226048f2f8b0bec2e1fcaaa55a59b66c4772db3 7.14MB / 7.14MB 0.3s
=> => sha256:016789c9a2d021b2dcb5e1c724c75ab0a57cc4e8cd7aab7bb28e69fec7c8c4fc 1.65kB / 1.65kB 0.0s
=> => sha256:1a946edcecbd2fd3121946a05e978c3a03c5d94c67d2376d3fbb62ed0c470d90 1.57kB / 1.57kB 0.0s
=> => sha256:d6a1e2ab00f777c5cc735d3a1c78769cea2e2a220511c162907da2c6758e916f 8.76kB / 8.76kB 0.0s
=> => sha256:d49e54c17cd83bb015a10bea1e05084d9630afc9a4feac1aa3ceb5ae647dd9d8 603B / 603B 0.4s
=> => extracting sha256:455c02918c4592a9beeeae47df541266f3ea53ed573feb767e5e8ab8dcee146e 0.1s
=> => sha256:0263029b2ae8863b72df3f821517b4ac5cfaff6cd482cca560636edee07d91a2 894B / 894B 0.3s
=> => sha256:7a15a92d87b89cf5803fd585091af1cd8ba3216f8bb9639c7e7beb8358f88f4b 664B / 664B 0.4s
=> => extracting sha256:08b6b842dcd703db7772921ad226048f2f8b0bec2e1fcaaa55a59b66c4772db3 0.5s
=> => sha256:9fed390110deadba2d9f188f3d75b177f94ceababaf7d603ed64b30ad346ee0d 1.39kB / 1.39kB 0.5s
=> => extracting sha256:d49e54c17cd83bb015a10bea1e05084d9630afc9a4feac1aa3ceb5ae647dd9d8 0.0s
=> => extracting sha256:0263029b2ae8863b72df3f821517b4ac5cfaff6cd482cca560636edee07d91a2 0.0s
=> => extracting sha256:7a15a92d87b89cf5803fd585091af1cd8ba3216f8bb9639c7e7beb8358f88f4b 0.0s
=> => extracting sha256:9fed390110deadba2d9f188f3d75b177f94ceababaf7d603ed64b30ad346ee0d 0.0s
=> [nginx internal] load build context 0.0s
=> => transferring context: 92.88kB 0.0s
=> [nginx 2/4] COPY nginx.conf /etc/nginx/nginx.conf 0.0s
=> [nginx 3/4] COPY ngx_http_redis_module.so /usr/lib/nginx/modules/ngx_http_redis_module.so 0.0s
=> [nginx 4/4] COPY overfast-api.conf /etc/nginx/conf.d/default.conf 0.0s
=> [nginx] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b17cb20d6e98fc6abf923c2c485464ed198eae699a116e9fdddc583ea98ba96b 0.0s
=> => naming to docker.io/library/overfast-api-nginx 0.0s
Stopping OverFastAPI and cleaning containers...
docker compose down -v --remove-orphans
WARN[0000] /home/dev/overfast-api/docker-compose.yml: `version` is obsolete
Launching OverFastAPI (production mode)...
docker compose up -d
WARN[0000] /home/dev/overfast-api/docker-compose.yml: `version` is obsolete
[+] Running 5/5
✔ Network overfast-api_default Created 0.1s
✔ Container overfast-api-redis-1 Healthy 4.6s
✘ Container overfast-api-app-1 Error 19.6s
✔ Container overfast-api-worker-1 Started 4.1s
✔ Container overfast-api-nginx-1 Created 0.0s
dependency failed to start: container overfast-api-app-1 is unhealthy
make: *** [Makefile:65: up] Error 1
Expected behavior
overfast-api runs well
Screenshots
It seems Blizzard didn't update their main page with the new gamemode 🫠 ("Maps" section of https://overwatch.blizzard.com/en-us/).
I'll change the way I'm handling gamemodes by having a fixed list on my end instead of parsing Blizzard page.
Expected return:
A competitive rank and tier
{
"summary" : { ... },
"endorsement": { ... },
"competitive": {
"pc": {
"tank": {
"division": "diamond",
"tier": 3,
... ... ...
As expected from doc
What is returned:
Null
{
"summary": {
"competitive": null
I looked at the career profile site, it seems they removed the rank icon from peoples pages.
So idk if that is what broke it, or if its more from the response structure changing.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.