from twilio.rest import Client
from parsons.utilities import check_env, json_format
from parsons.etl import Table
import logging
logger = logging.getLogger(__name__)
[docs]class Twilio:
"""
Instantiate the Twilio class
`Args:`
account_sid: str
The Twilio account sid. Not required if ``TWILIO_ACCOUNT_SID`` env variable is
passed.
auth_token: str
The Twilio auth token. Not required if ``TWILIO_AUTH_TOKEN`` env variable is
passed.
`Returns`:
Twilio class
"""
def __init__(self, account_sid=None, auth_token=None):
self.account_sid = check_env.check("TWILIO_ACCOUNT_SID", account_sid)
self.auth_token = check_env.check("TWILIO_AUTH_TOKEN", auth_token)
self.client = Client(self.account_sid, self.auth_token)
def _table_convert(self, obj):
tbl = Table([x.__dict__["_properties"] for x in obj])
if "subresource_uris" in tbl.columns and "uri" in tbl.columns:
tbl.remove_column("subresource_uris", "uri")
return tbl
[docs] def get_account(self, account_sid):
"""
Get Twilio account
`Args:`
account_sid: str
The Twilio account sid
`Returns:`
dict
"""
r = self.client.api.accounts(account_sid)
logger.info(f"Retrieved {account_sid} account.")
return r.__dict__
[docs] def get_accounts(self, name=None, status=None):
"""
Get Twilio accounts including subaccounts.
`Args:`
name: str
Filter to name of the account
status: str
Filter to an account status of ``active``, ``closed`` or ``suspended``.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
r = self.client.api.accounts.list(friendly_name=name, status=status)
tbl = self._table_convert(r)
logger.info(f"Retrieved {tbl.num_rows} accounts.")
return tbl
[docs] def get_account_usage(
self,
category=None,
start_date=None,
end_date=None,
time_period=None,
group_by=None,
exclude_null=False,
):
"""
Get Twilio account usage.
`Args:`
category: str
Filter to a specific type of usage category. The list of possibilities can be found
`here <https://www.twilio.com/docs/usage/api/usage-record?code-sample=code-last-months-usage-for-all-usage-categories-4&code-language=Python&code-sdk-version=5.x#usage-all-categories>`_.
start_date: str
Filter to usage from a specific start date (ex. ``2019-01-01``).
end_date: str
Filter to usage from a specific end date (ex. ``2019-01-01``).
time_period: str
A convenience method to filter usage. Can be one of ``today``, ``yesterday``,
``this_month``, ``last_month``.
group_by: str
The time interval to group usage by. Can be one of ``daily``, ``monthly`` or
``yearly``.
exclude_null: boolean
Exclude rows that have no usage.
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
""" # noqa: E501,E261
# Add populated arguments
args = {"category": category, "start_date": start_date, "end_date": end_date}
args = json_format.remove_empty_keys(args)
# Parse out the time_periods
if time_period == "today":
r = self.client.usage.records.today.list(**args)
elif time_period == "yesterday":
r = self.client.usage.records.yesterday.list(**args)
elif time_period == "this_month":
r = self.client.usage.records.this_month.list(**args)
elif time_period == "last_month":
r = self.client.usage.records.last_month.list(**args)
# Parse out the group by
elif group_by == "daily":
r = self.client.usage.records.daily.list(**args)
elif group_by == "monthly":
r = self.client.usage.records.monthly.list(**args)
elif group_by == "yearly":
r = self.client.usage.records.yearly.list(**args)
else:
r = self.client.usage.records.list(**args)
tbl = self._table_convert(r)
if exclude_null:
tbl.remove_null_rows("count", null_value="0")
return tbl
[docs] def get_messages(
self,
to=None,
from_=None,
date_sent=None,
date_sent_before=None,
date_sent_after=None,
):
"""
Get Twilio messages.
`Args:`
to: str
Filter to messages only sent to the specified phone number.
from_: str
Filter to messages only sent from the specified phone number.
date_sent: str
Filter to messages only sent on the specified date (ex. ``2019-01-01``).
date_sent_before: str
Filter to messages only sent before the specified date (ex. ``2019-01-01``).
date_sent_after: str
Filter to messages only sent after the specified date (ex. ``2019-01-01``).
`Returns:`
Parsons Table
See :ref:`parsons-table` for output options.
"""
r = self.client.messages.list(
to=to,
from_=from_,
date_sent=date_sent,
date_sent_before=date_sent_before,
date_sent_after=date_sent_after,
)
tbl = self._table_convert(r)
logger.info(f"Retrieved {tbl.num_rows} messages.")
return tbl