cubehouse / themeparks

Unofficial API for accessing ride wait times and schedules for Disneyland, Disney World, Universal Studios, and many more parks
MIT License
542 stars 125 forks source link

Error from today getting WDW wait times #173

Closed parktrips closed 5 years ago

parktrips commented 5 years ago

Park All Disney parks are having issues with getting wait times responding with 403 error.

Here is the server response :

Access Denied

Access Denied

You don't have permission to access "http://api.wdpro.disney.go.com/global-pool-override-B/facility-service/theme-parks/80007944/wait-times?" on this server.

Reference #18.573a3217.1560335802.e961fab

Context Latest version

Describe the bug Getting operating hours works fine but not wait times

cubehouse commented 5 years ago

What version are you using? Is this in 4.x or 5.x?

senorihl commented 5 years ago

@cubehouse same here with direct curl and for another Disney park:

curl --request GET \
  --url 'https://api.wdpro.disney.go.com/facility-service/theme-parks/P1;destination=dlp/wait-times?region=fr' \
  --header 'accept: application/json;apiversion=1' \
  --header 'authorization: Bearer 10818a22ec164220a5f62aea9c1e74c4' \
  --header 'x-app-id: WDW-MDX-ANDROID-3.4.1' \
  --header 'x-conversation-id: WDPRO-MOBILE.MDX.CLIENT-PROD' \
  --header 'x-correlation-id: 1560338893870'
pklooster commented 5 years ago

Getting the same error using 4.7.15

parktrips commented 5 years ago

Hi Cubehouse, I do not think it has to do with the version but with the Disney API that has new restriction or needs new parameters in the header

PhilippeP62 commented 5 years ago

Samer thing for Paris , but the official app also does not give wait times , so it might be something that is wrong on their side.

Le mer. 12 juin 2019 à 13:32, parktrips notifications@github.com a écrit :

Hi Cubehouse, I do not think it has to do with the version but with the Disney API that has new restriction or needs new parameters in the header

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/cubehouse/themeparks/issues/173?email_source=notifications&email_token=ACYETUXXHY3IDYTDVPZS7CLP2DNDJA5CNFSM4HXHUYFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODXQDOHQ#issuecomment-501233438, or mute the thread https://github.com/notifications/unsubscribe-auth/ACYETUTFGOJWP5SWOHLMYZ3P2DNDJANCNFSM4HXHUYFA .

parktrips commented 5 years ago

You are right @PhilippeP62 , there is no more wait times in the Disney World app displayed This has to be on their side

fmacq commented 5 years ago

Just looked at DLP app and wait times are showned for all attractions.

Wondering if they closed the access due to new app rollout ?

cubehouse commented 5 years ago

5.x uses a completely different API to connect to WDW, so I was interested if you were using latest 4.x or the latest beta (or source) of 5.x.

I'm seeing wait times on both DLP and WDW apps.

PhilippeP62 commented 5 years ago

I'm still on 4.x

Le mer. 12 juin 2019 à 15:45, Jamie Holding notifications@github.com a écrit :

5.x uses a completely different API to connect to WDW, so I was interested if you were using latest 4.x or the latest beta (or source) of 5.x.

I'm seeing wait times on both DLP and WDW apps.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/cubehouse/themeparks/issues/173?email_source=notifications&email_token=ACYETUXMOY2LUJRPCXVOWNDP2D4VZA5CNFSM4HXHUYFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODXQOZMQ#issuecomment-501279922, or mute the thread https://github.com/notifications/unsubscribe-auth/ACYETUVTOXHC3AGX2QXLAUTP2D4VZANCNFSM4HXHUYFA .

parktrips commented 5 years ago

Wait times for WDW have popped up on the WDW app. I'm still getting the 403 error on the endpoint mentionned. I've been trying with the url in the 4.x sources.

cubehouse commented 5 years ago

I might have to fast-forward the 5.x rollout plans, as 5.x is working fine. I'll see what I can do when I finish work tonight, but likely they have switched off this endpoint completely, and their new API requires the 5.x rewrite to work correctly as it is significantly different (it now runs a live connection to the API, which needs a local database to maintain sync state)

parktrips commented 5 years ago

Thanks @cubehouse. It would be great if you could explain that in details :)

cubehouse commented 5 years ago

About a year ago, the WDW changed it's API to use a live database to report wait times. This is a completely different setup to normal. But it allows some awesome features, like real-time wait time updates (no more polling every 5 minutes), and things like real-time attraction name changes, bus times etc. etc.

However, this is a very different approach than this library is setup for. Usually we make 1 or 2 HTTP requests and call it a day. Now, we need to download and keep a local database synchronised with the WDW API. This requires a lot more database management and means we need to keep a live connection open so we get updates in real time. To do this, the 5.x library now requires a small SQLite database to be created somewhere so it can store all this information. The initial sync with WDW takes about 20-30 seconds, and downloads 40MB or so. But once you've done that, you then get real-time updates of wait times, which is pretty cool.

5.x is available in another branch on this Git repo if you want to check it out. It has generally had a big rewrite to tidy things up, but it does mean the API has changed a bit.

Let me know if you have any other questions. I'll try and look into this for 4.x tonight, but I suspect the service might just be gone. We'll see.

DougSisk commented 5 years ago

Can confirm 4.x is broken, but 5.x is fine. Lots of wait time trackers around the web are kaput, so the theory that they finally turned off legacy is probably correct.

cubehouse commented 5 years ago

If you change your package dependency to point directly to the 5.0 experimental branch, you may have some success. Eg: "themeparks": "cubehouse/themeparks#42853a9",

Beware though, 5.x isn't quite finished yet! But it should be working for Disney Parks. 5.x has a bunch of changes to encourage better practices and more cache usage, so there may be some migration quirks.

jtmaddux commented 5 years ago

do you have any examples for using the 5.0 branch? i have something very similar to your example on the main page, when I switch to 5.0 it runs and downloads all the wait times (hooray!) but then the script never exits.

bluesolarflare commented 5 years ago

I have 5.0 running but also it seems that fast pass is not supported yet?

cubehouse commented 5 years ago

I've pushed some slightly tidied up sample code to the 5.x branch README for it's intended use.

https://github.com/cubehouse/themeparks/blob/5/README.md

cubehouse commented 5 years ago

If you sync to 45d2d71 Disney parks should know about fastpass now. It's something I want to do a full sweep of all the supported parks and make sure we're doing it right.

bluesolarflare commented 5 years ago

If you sync to 45d2d71 Disney parks should know about fastpass now. It's something I want to do a full sweep of all the supported parks and make sure we're doing it right.

Thanks. Disney World Fast Passes are showing up but not Disneyland.

ericksummers commented 5 years ago

So is there a new WDW api? or did the criteria/payload/auth change?

cubehouse commented 5 years ago

So is there a new WDW api? or did the criteria/payload/auth change?

Yes, the API changed a while ago, which kick-started 5.x of this library to handle the new changes.

See above for a longer but less concise explanation :)

I'll aim to roll out 5.0.0 properly today once I've fixed up a few more things. I want it to be as close to feature parity with 4.x before I do that. My original plan was to add all the fun new features before release, but I guess it's too late for that now and that will have to come in 5.1.x!

Polygenetic commented 5 years ago

So I am testing my project with version 5.0.0 Getting the Park hours from Disneyland Paris works. But pasting your sample code in my project to get the attractions wait list I get this error:

Magic hours test: 8:30 2019-06-13 [2019-06-13] Open from 2019-06-13T10:00:00+02:00 until 2019-06-13T19:00:00+02:00 503: { "errors": [ { "typeId": "SERVICE_CALL_ERROR", "message": "Error calling Facility Service.", "systemErrorCode": "220038" } ] } 503: { "errors": [ { "typeId": "SERVICE_CALL_ERROR", "message": "Error calling Facility Service.", "systemErrorCode": "220038" } ] } (node:13688) UnhandledPromiseRejectionWarning: 503: { "errors": [ { "typeId": "SERVICE_CALL_ERROR", "message": "Error calling Facility Service.", "systemErrorCode": "220038" } ] } (node:13688) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:13688) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

cubehouse commented 5 years ago

Please provide your package.json entry for themeparks

cubehouse commented 5 years ago

5.1.0 is now live on npm if people wish to try it without having to manually grab a git commit.

Readme on repo has been updated with new sample code to encourage caching and object re-use.

bluesolarflare commented 5 years ago

FastPasses are showing up now. Thanks for the quick fix. The only thing missing seems to be the object for fast pass return times. Did the object change?

cubehouse commented 5 years ago

These are now in 5.1.1 under the new "meta" field for rides.

There are often requests to add random features to specific parks, and I don't want to add all these hundreds of fields to all rides to all parks, so I've decided to add a "meta" section where parks can add whatever they want into there without compromising the clean structure of the main ride time.

So you should now have ride.meta.fastPassStartTime and ride.meta.fastPassEndTime for rides with fastPass times left.

Polygenetic commented 5 years ago

Please provide your package.json entry for themeparks

package.zip

Here you go. Thx

cubehouse commented 5 years ago

Please update your module to the latest version and try again to reproduce the issue, your package is using an old version.

PhilippeP62 commented 5 years ago

So I'm trying the current (5.1.6) version , I've made a test js file using the sample from the README to get the wait times. The script runs nice , but doesn't close.On another shell I see that the DB has been created and is changing in size constantly , it seems the push works.

With 4.x , i started the script every x minutes , which got me a json file which I parsed to fill my sql db, which then is used by my app..

With 5.x , do I have to run the script to 'sync' with the server , then query the sqlite db every x minutes to populate my sql db? How do I know that the sqlite db is still in sync with the server ? I'm a little confused .... need help :/

Philippe

cubehouse commented 5 years ago

The sample code checks for updated wait times every 5 minutes on a loop, which is why it isn't exiting. Do you logic in the function that is called every 5 minutes, and everything should be good.

This is the recommended way of using the library, by keeping a process running and letting it maintain cached information to not require huge network spikes each time you want to get the wait times again.

There is no need to be checking the sqlite db manually, the library will handle that for you. When you call "GetWaitTimes", the library will ensure everything is syncronised before returning the Promise result.

PhilippeP62 commented 5 years ago

Ok Thanks for your very quick answer:)

Le dim. 16 juin 2019 à 18:05, Jamie Holding notifications@github.com a écrit :

The sample code checks for updated wait times every 5 minutes on a loop, which is why it isn't exiting. Do you logic in the function that is called every 5 minutes, and everything should be good.

This is the recommended way of using the library, by keeping a process running and letting it maintain cached information to not require huge network spikes each time you want to get the wait times again.

There is no need to be checking the sqlite db manually, the library will handle that for you. When you call "GetWaitTimes", the library will ensure everything is syncronised before returning the Promise result.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/cubehouse/themeparks/issues/173?email_source=notifications&email_token=ACYETUT7R4R3AVXQOZ5FKFLP2ZQFXA5CNFSM4HXHUYFKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGODXZQCVI#issuecomment-502464853, or mute the thread https://github.com/notifications/unsubscribe-auth/ACYETUQ2FFCMIMPEPY6WCLTP2ZQFXANCNFSM4HXHUYFA .

jaguar36 commented 5 years ago

I updated to 5.1.6 however I'm now getting this error running the sample.

Long-Polling error: Error: socket hang up (starting long-poll again in 10 seconds}

cubehouse commented 5 years ago

That error is harmless, it will spin-up the long poll again and continue in 10 seconds.

jaguar36 commented 5 years ago

It just repeats that error at ever longer intervals though.

tjonesrobotics commented 5 years ago

I'm running 5.1.6 and I don't get that error. However, it doesn't look like it's getting all wait times. Example: when I run the example tasks, I don't get wait times for The Seven Dwarfs Mine Train, Haunted Mansion, Thunder Mountain, others. I reduced the cycle time from your example to from 5 minutes to 5 seconds to be able to monitor it more often. Here's the printed output.

Sorcerers of the Magic Kingdom: 0 minutes wait (Operating) Under the Sea ~ Journey of The Little Mermaid: 10 minutes wait (Operating) Enchanted Tales with Belle: 55 minutes wait (Operating) A Pirate's Adventure ~ Treasures of the Seven Seas: 0 minutes wait (Operating) Meet Tinker Bell at Town Square Theater: 40 minutes wait (Operating) Meet Cinderella and Elena at Princess Fairytale Hall: 40 minutes wait (Operating) Buzz Lightyear's Space Ranger Spin: 50 minutes wait (Operating) Liberty Square Riverboat: 0 minutes wait (Operating) Mad Tea Party: 10 minutes wait (Operating) Peter Pan's Flight: 65 minutes wait (Operating) Pirates of the Caribbean: 10 minutes wait (Operating) Space Mountain: 65 minutes wait (Operating) Splash Mountain: 45 minutes wait (Operating) Tomorrowland Speedway: 25 minutes wait (Operating) Walt Disney's Carousel of Progress: 0 minutes wait (Operating)

jaguar36 commented 5 years ago

Tried it again now (10pm EST) and I'm not getting any errors now, but I'm only getting a few rides, similar to tjonesrobotics, but worse: getting wait times Under the Sea ~ Journey of The Little Mermaid: 5 minutes wait (Operating) Splash Mountain: 5 minutes wait (Operating)

Polygenetic commented 5 years ago

Please update your module to the latest version and try again to reproduce the issue, your package is using an old version.

Solved after updating to 5.1.7 Thanks

Polygenetic commented 5 years ago

I'm seeing that the order of attractions in the database can be completely different on 2 machines.

That is kind of a problem because I only need 10 attractions from the list. So the order must be the same every time. var dpa = [rides[0], rides[5], rides[3], rides[7], rides[6], rides[10], rides[1]]

Is it possible to order the database alphabetically?

cubehouse commented 5 years ago

Order is not guaranteed to be the same, they will be returned in whatever order we get them from the parks.

You can very easily order them yourself, but I would not recommend for your purpose since a new attraction may appear at any time and alphabetise differently (eg. Smuggler's Run's ID alphabetises before most older rides because its ID is so large it gained a digit and now starts with '1').

Use a JavaScript sort function on the data before you use it when it's returned if you want to sort it though.

Polygenetic commented 5 years ago

Ok this what I use now:

function dynamicSort(property) { var sortOrder = 1; if(property[0] === "-") { sortOrder = -1; property = property.substr(1); } return function (a,b) { var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; return result * sortOrder; } } rides.sort(dynamicSort("name"));

tjonesrobotics commented 5 years ago

I'm getting all the attractions now, too. Looks good!

cubehouse commented 5 years ago

I think this issue has run its course now. Parks work again in 5.0, and to avoid this issue becoming catch-all for every library/JavaScript issue, I'm now going to close it :)