In this quick guide, we'll walk through the utilities necessary to make an HTTP request to Twilio's API, which is secured with HTTP basic authentication. We go over Invoke-WebRequest
and finish by sending an outgoing SMS message.
PowerShell allows developers to write command line scripts using the full power of the .NET framework. However, some tasks you may be used to performing in *nix environments, like making an authenticated HTTP request with curl, are not as straightforward.
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$token = $env:TWILIO_AUTH_TOKEN4$number = $env:TWILIO_NUMBER56# Twilio API endpoint and POST params7$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"8$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }910# Create a credential object for HTTP basic auth11$p = $token | ConvertTo-SecureString -asPlainText -Force12$credential = New-Object System.Management.Automation.PSCredential($sid, $p)1314# Make API request, selecting JSON properties from the response15Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |16ConvertFrom-Json | Select sid, body
Let's break down the moving parts of this script.
The first bit you'll need to do is export your Twilio account credentials and phone number, which you'll need to send an outbound SMS. Your account SID and auth token can be found on your Console dashboard, and you can use one of your existing phone numbers (or buy one to use) in the console as well.
There are a number of ways to configure system environment variables on Windows, but you can set user-level environment variables in PowerShell with the following commands. Replace the strings below with the relevant values from your account.
1[Environment]::SetEnvironmentVariable("TWILIO_ACCOUNT_SID", "your_account_sid", "User")2[Environment]::SetEnvironmentVariable("TWILIO_AUTH_TOKEN", "your_auth_token", "User")3[Environment]::SetEnvironmentVariable("TWILIO_NUMBER", "+16518675309", "User")
In the example script at the beginning of the article, we access these variables through the $env
variable.
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$token = $env:TWILIO_AUTH_TOKEN4$number = $env:TWILIO_NUMBER
After exporting our Twilio account info, we need to configure a URL for the API endpoint we want to hit.
$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"
We substitute a variable that holds our account SID, which is also necessary for the API URL. We append the .json
extension to the URL to get the response back in JSON format.
Next, we create a hash table with the POST
parameters we need to send with our request.
$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }
What are those parameters for?
To
: The phone number you want to send the SMS toFrom
: A Twilio-powered phone number the SMS message will come fromBody
: The actual text of the outbound messageNow comes a slightly wonky bit we need to do to pass our HTTP basic auth credentials to Twilio in this API request. We need to create a PSCredential to pass into the Invoke-WebRequest
command.
1$p = $token | ConvertTo-SecureString -asPlainText -Force2$credential = New-Object System.Management.Automation.PSCredential($sid, $p)
Now that we have all our configuration ready, we use the Invoke-WebRequest
command to actually send the SMS. Don't forget the -UseBasicParsing
option to prevent creating a DOM from the results, and to avoid errors on systems without Internet Explorer installed (server core, and Windows 10 systems only running Edge browsers).
We also use the ConvertFrom-Json
command to parse the JSON response from the Twilio API, and Select
command to extract properties from the resulting object.
1Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |2ConvertFrom-Json | Select sid, body
And there we have it! Let's run that whole thing back one more time.
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$token = $env:TWILIO_AUTH_TOKEN4$number = $env:TWILIO_NUMBER56# Twilio API endpoint and POST params7$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"8$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }910# Create a credential object for HTTP basic auth11$p = $token | ConvertTo-SecureString -asPlainText -Force12$credential = New-Object System.Management.Automation.PSCredential($sid, $p)1314# Make API request, selecting JSON properties from the response15Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |16ConvertFrom-Json | Select sid, body
With this code, we can make a REST API request, authenticated with HTTP basic, from PowerShell scripts. If you've run it, you've seen the interesting conclusion - a nice outgoing text message without leaving the comfort of PS.
Want to try something more complex? Try Twilio's Documentation landing page to see our extensive collection of guides, tutorials, and quickstarts.