I am using Twilio to send and receive SMS messages from a Python application. The issue is that their tutorials use ngrok as a way to get through the firewall but I don't want to have to run ngrok every time I run my app and the URL changes every time ngrok runs so I have to change the webhook url on Twilio every time. Is there a better way around this? Is this something that requires a server?
There are two options that you have.

The paid option of ngrok allows you to set a persistent url so that you don't have to chance the webhook url on Twilio each time.
If you have a server, then you would also be able to set a persistent url to your server.

Unfortunately, the free version of ngrok does not allow you to set a persistent url.
How to generate fixed webhook url?