This repo contains a couple scripts I've made to download or convert data from the Nintendo Today mobile app.
Each script has it's own dependencies, however pip install -r requirements.txt
gets the dependencies for all of them.
Downloads all the entries in a feed, such as the "Artworks Archive" or game lore pages.
python get_feed.py [-b] [-l locale] first_post_id
The locale is in the form en-US
(default), many locales are not supported by
the app yet.
The -b
flag will add all found entries to your account's "Browsing History"
The first_post_id
is the id of the first entry in the feed. This script will
download all posts afterwards
After running the command it will ask for an access token, please see the section on intercepting phone traffic for guidance.
Requests to the app will often contain an authorization
header which begins
with Bearer
(do not include "Bearer").
It should also be in the response of requests to a url ending in "auth/refresh"
Requires requests, beautifulsoup4
modules, and a system install of ffmpeg
(check if running the command by itself works).
Converts your Calendar in the nintendo app to a set of .ics files, to be imported into a calendar app of your choice. If hosted on a server, the files can be updated and the calendar will update in the app.
python nintendical.py [-s start_date] [-e end_date] [-l locale]
The start and end date must be in the form YYYY-MM-DD.
If omitted, the start date will be one month from the current day, the end date
will be a year from the current date, and the locale will be en-US
.
Locale and access token is the same as get_feed
Requires requests, icalendar
modules
Downloads all the daily videos for all app themes. Will also include the birthday videos for the day of the month your birthday is. The access token is the same as the Nintendical one.
python get_calendar_videos.py [-l locale]
Locale and access token is the same as get_feed
Requires requests
module
Some of the news posts are html files, this will download the html file, along with any css and images linked. This will also upgrade the quality to the "large" format.
python get_page.py
The web request for the html file on the app includes a cookie header, which
begins with __token__=exp=
, include the full cookie.
Requires requests, beautifulsoup4
modules.
No script needed, the video files are "master.m3u8" and can be downloaded with ffmpeg:
ffmpeg -headers "cookie: __token__=[add token here]" -i https://[link/to]/master.m3u8 -c copy output.mp4`
The token needed is inside of the header for the web request.
-c copy
is optional, if you remove it, ffmpeg will slightly compress and optimize the video.
Not for Nintendo Today specifically but it is needed to get the links and tokens for all of the scripts.
iOS users can install certificates without root, and you can follow the guide Setting up mitmproxy with iOS. I've not tried it out but others have said it worked for them.
A rooted android device can also install System CA certificates, if you have access to neither, an android Emulator on your computer should work.
I have had luck with Waydroid on Linux and Android Studio on Windows. I have
heard others had success with mumuplayer. If you're on android studio, set the
AVD to be Pixel 6, API 33 Tiramisu
. For any android emulator try to download
it without google services.
- Install mitmproxy to your computer, and add the System CA certificate to the device
If you install and run mitmproxy, a .mitmproxy
should appear in your home
directory containing mitmproxy-ca-cert.pem
. Adding the certificate is
different for every device and emulator.
- Android studio
- Waydroid (see "install a self signed certificate)
- mumuplayer
- Install the Nintendo today app
The app comes as a split apk, so you may need something such as an xapk installer, AntiSplit M, or you can install the app directly from Aurora Store (try version 4.2.5 if it crashes on the emulator).
- Run mitmweb and connect the device to it
You can connect the device to mitmweb by adding it as a proxy on your phone.
Find the local ip address of your computer and the port (8080 by default) and
you can use adb shell settings put global http_proxy "[ip of device running proxy]:8080"
. You can also run mitmweb as a wireguard server, and you can
install the wireguard app on the device, and connect to it there.
- Confirm you're intercepting web traffic
As you use your device and the app the "Flow List" tab of mitmweb should start to fill with entries. These are the requests, you can click on one and view the request (includes the headers, tokens, cookies) and the response (data received back from the server, such as images)
If you're not receiving data on mitmweb, it's likely you need to configure your connection to the proxy or your computer's firewall. If you are receiving data, but you're unable to use the app or any https websites, it's likely your device doesn't have the certificate.