I LOVE Video Games
Maybe that sounds very unprofessional to talk about on a side of my blog that is dedicated to the techy nerd aspect of my life but it's the honest truth. I love video games and that tends to bleed into other aspects of my life, such as programs I work on. As this blog gets more posts there will probably be a lot of video game talk here due to the tools I have created to enhance or educate myself on that world that I hold so dear to my heart.
However, video games can have a lot of FOMO (Fear Of Missing Out) events, stuff where you have to be in the know, checking up daily on that games status to figure out if an event is about to happen that might have limited time rewards that you can't get afterwards, which sucks for those who end up getting busy with life from time to time (so basically everyone. it sucks for everyone). Monster Hunter Wilds is one of those games.
I love playing it, hopping on when my best friend is free and we grind out some hunts while searching for the largest and smallest versions of the monsters for the little shiny crowns that show on collection books. Despite these fun grind sessions, there is a glaring issue with the game for me, it's the fact that they'll sometimes run events for cute little items that you can ONLY get from that event, and while any event can return it's not guaranteed so if you're not vigilant enough you may miss out on a freebie.
Luckily, there is a website that allows you to see ongoing and upcoming events, the only issue with this is the website doesn't feature a way to setup notifications for an event and honestly, it's hard to read the text on the website sometimes, feels very "retro internet"

So... What's The Solution?
I use the communication platform Discord a lot, it's basically my modern whatsapp/text messaging platform of choice, one thing I love about discord is the ability to create my own bots that can send me notifications when something I specifically tell it to notify me about happens. I used to have a more complicated setup of having my email text my phone number about changes but there's something special about Discord with it allowing you to make things look pretty and less like a text message wanting you to click a shady link to renew your cars extended warranty.
With that said, I created a standalone python script that would read the content on the Monster Hunter Wilds event webpage, convert it into a pretty and more modern image, and post it to discord, showcasing all of the details for me and honestly it was way easier than I intended it to be.
Usually with website scraping you have to battle against the likes of Cloudflare, and while I have managed to bypass Cloudflare before, whenever I host a bot on a dedicated server it doesn't seem to play nicely, causing a huge painful headache trying to work around it without spiking my usage on the server over and over and over. With the Monster Hunter Wilds Event page however, they don't use Cloudflare at all, this means that as long as you're not spamming a million requests to the website, you can casually snoop and grab the data as many times as you want, extracting the html without any bot detector yelling at you.
Due to this I was able to use a mix of Beautiful Soup and Requests in python to search for these specific elements: tr.t1, tr.t2, tr.t3 which are tables that include the events for this week (t1), next week (t2), and the week after that (t3). The hardest part with that data is just sorting it but inside of each tr class is information that specifies the level requirement, title, terms, description, and all the other information I would need, you can see an example below:
<tr class=" t3 ">
<td class="image">
<img src ="https://info.monsterhunter.com/wilds/event-quest/thumbnail/mst-quest/March2025/Vdweo3pi1grYMOpD1Uxo.jpg" />
</td>
<td class="level"><span>5★</span></td>
<td class="quest">
<div class="title">
<div>
</div>
<span>Where You'd Least Expect</span>
</div>
<p class="terms"><span>Event Time</span>
12-02 16:00 〜 12-09 15:59<br>
</p>
<p class="txt">An event quest for gathering Sild Garlic that you can use as additional ingredients when cooking on the BBQ Grill!</p>
<ul>
<!-- <li class="btn event"><span>Quest Info</span></li> -->
</ul>
</td>
As you can see above, the information for each event gets grouped up into nice chunks that when understood by a program can be turned into images for a discord bot, and below is what the finalized output looks like when all that data is properly converted:

Life Is Good, But It Can Be Better
This looks nice and everything but there is one more change I want to make, and I thought i'd try it here while I type out this blog post. Discord has a relatively new feature which allow for stylized Unix Timestamps to be shown, automatically changing the time to show your local timezone. I tried this before with my Monster Hunter Tracker because "Thursday, November 20, 2025 2:00 PM" would look like a better output compared to what we currently see ("12-02 20:00 〜 12-09 19:59") but I ran into some issues.
I'm used to translating a very specific format into Discord timestamps, times with the format of "2023-11-03T00:00:00Z" so changing it around to detecting two dates using a different style just threw me off a bit the one late night I worked on it, but it's not impossible and it's actually very easy looking when you've done it before.
We take the messy text from the Monster Hunter Website, extract two date/time pairs, assume they're in Eastern Time Zone (because it's what the timezone of my server is in), and then convert everything into proper Unix timestamps. It should not have taken me this long but somehow it did so below you can see a snippet of code that explains the very heavy lifting that was done, as well as a butt-load of comments made specifically for this blog so you can understand every moving cog.
eastern = pytz.timezone('US/Eastern') # Get Eastern Timezone for datetime
now = datetime.now(eastern) # this is just the current time lol
year = now.year # figure out what year we live in
try:
# Build datetime objects
start_dt = datetime(year, sm, sd, sh, smin)
end_dt = datetime(year, em, ed, eh, emin)
# Localize these to Eastern Timezone
start_dt = eastern.localize(start_dt)
end_dt = eastern.localize(end_dt)
# If the end date is a month BEFORE the start date, assume it's next year
if end_dt <= start_dt:
end_dt = end_dt.replace(year=year + 1)
# Convert to Unix timestamp and format for discord
return f"Start: <t:{int(start_dt.timestamp())}:F>\nEnd: <t:{int(end_dt.timestamp())}:F>"
except Exception as e:
print("Timestamp conversion failed:", e)
return text # curl in a ball and cry when it breaks :)
Due to this being a small modified snippet there may be some explanations missing, but it should still give a good idea of the heavy lifting that had to be done.
The reason it broke before was because I didn't calculate the fact that "Event Period:" was included in the time due to being in a <span> element of that <p> class, meaning it never got converted because "Event Period" is not a time...
But hey, this goes to show that maybe taking a break from coding for a bit can sometimes cause you to spot the obvious later down the line, so I will leave you all off with one final piece, a snippet of the fixed version of my event tracker!


