Skip to content

Commit af22005

Browse files
author
marcel corso gonzalez
authored
Merge pull request #51 from yulia-burykina/feature-yulia-numbers-api
methods for querying numbers api
2 parents ebee1c3 + 58b18e6 commit af22005

File tree

9 files changed

+437
-2
lines changed

9 files changed

+437
-2
lines changed

examples/number_available_list.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#!/usr/bin/env python
2+
3+
import sys
4+
import os
5+
import argparse
6+
import requests
7+
8+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
9+
10+
import messagebird
11+
12+
parser = argparse.ArgumentParser()
13+
parser.add_argument('--accessKey', help='access key for MessageBird API', type=str, required=True)
14+
args = vars(parser.parse_args())
15+
16+
try:
17+
# Create a MessageBird client with the specified accessKey.
18+
client = messagebird.Client(args['accessKey'])
19+
20+
# Fetch the NumberList object with specified params, limit, offset.
21+
params = {'features': ['sms', 'voice'], 'number': 319}
22+
numbers = client.available_numbers_list('NL', params, 2, 0)
23+
24+
# Print the object information.
25+
print('\nThe following information was returned as a %s object:\n' % numbers.__class__)
26+
if numbers.items is not None:
27+
print(' Containing the the following items:')
28+
for item in numbers.items:
29+
print(' {')
30+
print(' number : %s' % item.number)
31+
print(' country : %s' % item.country)
32+
print(' region : %s' % item.region)
33+
print(' locality : %s' % item.locality)
34+
print(' features : %s' % item.features)
35+
print(' tags : %s' % item.tags)
36+
print(' type : %s' % item.type)
37+
print(' status : %s' % item.status)
38+
print(' },')
39+
else:
40+
print(' With an empty response.')
41+
42+
except messagebird.client.ErrorException as e:
43+
print('\nAn error occured while requesting a NumberList object:\n')
44+
45+
for error in e.errors:
46+
print(' code : %d' % error.code)
47+
print(' description : %s' % error.description)
48+
print(' parameter : %s\n' % error.parameter)
49+
50+
except requests.exceptions.HTTPError as e:
51+
print('\nAn HTTP exception occurred while fetching all purchased phone numbers:')
52+
print(' ', e)
53+
print(' Http request body: ', e.request.body)
54+
print(' Http response status: ', e.response.status_code)
55+
print(' Http response body: ', e.response.content.decode())
56+
57+
except Exception as e:
58+
print('\nAn ', e.__class__, ' exception occurred while :')
59+
print(e)

examples/number_purchase.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/usr/bin/env python
2+
3+
import sys
4+
import os
5+
import argparse
6+
import requests
7+
8+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
9+
10+
import messagebird
11+
12+
parser = argparse.ArgumentParser()
13+
parser.add_argument('--accessKey', help='access key for MessageBird API', type=str, required=True)
14+
args = vars(parser.parse_args())
15+
16+
try:
17+
# Create a MessageBird client with the specified accessKey.
18+
client = messagebird.Client(args['accessKey'])
19+
20+
# Purchase number
21+
number = client.purchase_number('3197010240126', 'NL', 3)
22+
23+
# Print the object information.
24+
print('\nThe following information was returned as a Number object:\n')
25+
print(' number : %s' % number.number)
26+
print(' country : %s' % number.country)
27+
print(' region : %s' % number.region)
28+
print(' locality : %s' % number.locality)
29+
print(' features : %s' % number.features)
30+
print(' tags : %s' % number.tags)
31+
print(' type : %s' % number.type)
32+
print(' status : %s' % number.status)
33+
34+
except messagebird.client.ErrorException as e:
35+
print('\nAn error occured while requesting a NumberList object:\n')
36+
37+
for error in e.errors:
38+
print(' code : %d' % error.code)
39+
print(' description : %s' % error.description)
40+
print(' parameter : %s\n' % error.parameter)
41+
42+
except requests.exceptions.HTTPError as e:
43+
print('\nAn HTTP exception occurred while fetching all purchased phone numbers:')
44+
print(' ', e)
45+
print(' Http request body: ', e.request.body)
46+
print(' Http response status: ', e.response.status_code)
47+
print(' Http response body: ', e.response.content.decode())
48+
49+
except Exception as e:
50+
print('\nAn ', e.__class__, ' exception occurred while :')
51+
print(e)

examples/number_purchased_list.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
import argparse
5+
import requests
6+
7+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
8+
import messagebird
9+
10+
parser = argparse.ArgumentParser()
11+
parser.add_argument('--accessKey', help='Access key for MessageBird API.', type=str, required=True)
12+
parser.add_argument('--limit', help='Limit the amount of results per page.', type=int, required=False, default=20)
13+
parser.add_argument('--offset', help='Skip first n results.', type=int, required=False, default=0)
14+
parser.add_argument('--features', help='Features for which search is done.', type=str, required=False, default=None)
15+
parser.add_argument('--tags', help='Tags for which search is done.', type=str, required=False, default=None)
16+
parser.add_argument('--number', help='Fragment of number.', type=str, required=False, default=None)
17+
parser.add_argument('--region', help='Fragment of region data.', type=str, required=False, default=None)
18+
parser.add_argument('--locality', help='Fragment of locality data.', type=str, required=False, default=None)
19+
parser.add_argument('--type', help='Number type.', type=str, required=False, default=None)
20+
args = vars(parser.parse_args())
21+
22+
try:
23+
# Create a MessageBird client with the specified accessKey.
24+
client = messagebird.Client(args['accessKey'])
25+
del(args['accessKey'])
26+
27+
limit = 20
28+
offset = 0
29+
if args['limit'] is not None:
30+
limit = args['limit']
31+
del(args['limit'])
32+
if args['offset'] is not None:
33+
offset = args['offset']
34+
del(args['offset'])
35+
36+
# Fetching all purchased phone numbers.
37+
numbers = client.purchased_numbers_list(args, limit, offset)
38+
39+
# Print the object information.
40+
print('\nThe following information was returned as a %s object:\n' % numbers.__class__)
41+
if numbers.items is not None:
42+
print(' Containing the the following items:')
43+
for item in numbers.items:
44+
print(' {')
45+
print(' number : %s' % item.number)
46+
print(' country : %s' % item.country)
47+
print(' region : %s' % item.region)
48+
print(' locality : %s' % item.locality)
49+
print(' features : %s' % item.features)
50+
print(' tags : %s' % item.tags)
51+
print(' type : %s' % item.type)
52+
print(' status : %s' % item.status)
53+
print(' },')
54+
else:
55+
print(' With an empty response.')
56+
57+
except messagebird.client.ErrorException as e:
58+
print('\nAn error occurred while fetching all purchased phone numbers:\n')
59+
60+
for error in e.errors:
61+
print(' code : %d' % error.code)
62+
print(' description : %s' % error.description)
63+
print(' parameter : %s' % error.parameter)
64+
print(' type : %s' % error.__class__)
65+
66+
except requests.exceptions.HTTPError as e:
67+
print('\nAn HTTP exception occurred while fetching all purchased phone numbers:')
68+
print(' ', e)
69+
print(' Http request body: ', e.request.body)
70+
print(' Http response status: ', e.response.status_code)
71+
print(' Http response body: ', e.response.content.decode())
72+
73+
except Exception as e:
74+
print('\nAn ', e.__class__, ' exception occurred while :')
75+
print(e)
76+
77+
78+

examples/number_purchased_view.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#!/usr/bin/env python
2+
import os
3+
import sys
4+
import argparse
5+
import requests
6+
7+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
8+
import messagebird
9+
10+
parser = argparse.ArgumentParser()
11+
parser.add_argument('--accessKey', help='Access key for MessageBird API.', type=str, required=True)
12+
parser.add_argument('--phoneNumber', help='Phone number.', type=str, required=True)
13+
args = vars(parser.parse_args())
14+
15+
try:
16+
# Create a MessageBird client with the specified accessKey.
17+
client = messagebird.Client(args['accessKey'])
18+
19+
# Fetching all purchased phone numbers.
20+
item = client.purchased_number(args['phoneNumber'])
21+
22+
# Print the object information.
23+
print('\nThe following information was returned as a %s object:\n' % item.__class__)
24+
if item is not None:
25+
print(' {')
26+
print(' number : %s' % item.number)
27+
print(' country : %s' % item.country)
28+
print(' region : %s' % item.region)
29+
print(' locality : %s' % item.locality)
30+
print(' features : %s' % item.features)
31+
print(' tags : %s' % item.tags)
32+
print(' type : %s' % item.type)
33+
print(' status : %s' % item.status)
34+
print(' },')
35+
else:
36+
print(' With an empty response.')
37+
38+
except messagebird.client.ErrorException as e:
39+
print('\nAn error occurred while fetching all purchased phone numbers:\n')
40+
41+
for error in e.errors:
42+
print(' code : %d' % error.code)
43+
print(' description : %s' % error.description)
44+
print(' parameter : %s' % error.parameter)
45+
print(' type : %s' % error.__class__)
46+
47+
except requests.exceptions.HTTPError as e:
48+
print('\nAn HTTP exception occurred while fetching all purchased phone numbers:')
49+
print(' ', e)
50+
print(' Http request body: ', e.request.body)
51+
print(' Http response status: ', e.response.status_code)
52+
print(' Http response body: ', e.response.content.decode())
53+
54+
except Exception as e:
55+
print('\nAn ', e.__class__, ' exception occurred while :')
56+
print(e)
57+
58+
59+

examples/number_update.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env python
2+
3+
import sys
4+
import os
5+
import argparse
6+
import requests
7+
8+
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
9+
10+
import messagebird
11+
12+
parser = argparse.ArgumentParser()
13+
parser.add_argument('--accessKey', help='access key for MessageBird API', type=str, required=True)
14+
args = vars(parser.parse_args())
15+
16+
try:
17+
# Create a MessageBird client with the specified accessKey.
18+
client = messagebird.Client(args['accessKey'])
19+
20+
# Update number
21+
# Note: at the moment, we only support updating tags that can be used to group or label numbers
22+
tags = ['tag1']
23+
number = client.update_number('3197010240126', tags)
24+
25+
# Print the object information.
26+
print('\nThe following information was returned as a Number object:\n')
27+
print(' number : %s' % number.number)
28+
print(' country : %s' % number.country)
29+
print(' region : %s' % number.region)
30+
print(' locality : %s' % number.locality)
31+
print(' features : %s' % number.features)
32+
print(' tags : %s' % number.tags)
33+
print(' type : %s' % number.type)
34+
print(' status : %s' % number.status)
35+
36+
except messagebird.client.ErrorException as e:
37+
print('\nAn error occured while requesting a NumberList object:\n')
38+
39+
for error in e.errors:
40+
print(' code : %d' % error.code)
41+
print(' description : %s' % error.description)
42+
print(' parameter : %s\n' % error.parameter)
43+
44+
except requests.exceptions.HTTPError as e:
45+
print('\nAn HTTP exception occurred while fetching all purchased phone numbers:')
46+
print(' ', e)
47+
print(' Http request body: ', e.request.body)
48+
print(' Http response status: ', e.response.status_code)
49+
print(' Http response body: ', e.response.content.decode())
50+
51+
except Exception as e:
52+
print('\nAn ', e.__class__, ' exception occurred while :')
53+
print(e)

messagebird/base_list.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ def items(self):
3939
def items(self, value):
4040
"""Create typed objects from the dicts."""
4141
items = []
42-
for item in value:
43-
items.append(self.itemType().load(item))
42+
if value is not None:
43+
for item in value:
44+
items.append(self.itemType().load(item))
4445

4546
self._items = items
4647

messagebird/client.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from messagebird.voice_recording import VoiceRecordingsList, VoiceRecording
2424
from messagebird.voice_transcription import VoiceTranscriptionsList, VoiceTranscriptionsView
2525
from messagebird.call_flow import CallFlow, CallFlowList, CallFlowNumberList
26+
from messagebird.number import Number, NumberList
2627

2728
ENDPOINT = 'https://rest.messagebird.com'
2829
CLIENT_VERSION = '1.4.1'
@@ -46,6 +47,11 @@
4647
VOICE_TRANSCRIPTIONS_PATH = 'transcriptions'
4748
VOICE_WEB_HOOKS_PATH = 'webhooks'
4849

50+
NUMBER_TYPE = 'number'
51+
NUMBER_API_ROOT = 'https://numbers.messagebird.com/v1/'
52+
NUMBER_PATH = 'phone-numbers'
53+
NUMBER_AVAILABLE_PATH = 'available-phone-numbers'
54+
4955

5056
class ErrorException(Exception):
5157
def __init__(self, errors):
@@ -81,6 +87,9 @@ def _get_http_client(self, type=REST_TYPE):
8187
if type == VOICE_TYPE:
8288
return HttpClient(VOICE_API_ROOT, self.access_key, USER_AGENT)
8389

90+
if type == NUMBER_TYPE:
91+
return HttpClient(NUMBER_API_ROOT, self.access_key, USER_AGENT)
92+
8493
return HttpClient(ENDPOINT, self.access_key, USER_AGENT)
8594

8695
def request(self, path, method='GET', params=None, type=REST_TYPE):
@@ -498,6 +507,31 @@ def call_flow_numbers_add(self, call_flow_id, numbers=()):
498507
def _format_query(self, limit, offset):
499508
return 'limit=' + str(limit) + '&offset=' + str(offset)
500509

510+
def available_numbers_list(self, country, params={}, limit=20, offset=0):
511+
"""Retrieve a list of phone numbers available for purchase."""
512+
params['limit'] = limit
513+
params['offset'] = offset
514+
return NumberList().load(self.request(NUMBER_AVAILABLE_PATH + '/' + str(country), 'GET', params, NUMBER_TYPE))
515+
516+
def purchase_number(self, number, country, billingIntervalMonths=1):
517+
params = {'number': str(number), 'countryCode': str(country), 'billingIntervalMonths': int(billingIntervalMonths)}
518+
return Number().load(self.request(NUMBER_PATH, 'POST', params, NUMBER_TYPE))
519+
520+
def update_number(self, number, tags):
521+
params = {'tags': tags}
522+
return Number().load(self.request(NUMBER_PATH + '/' + str(number), 'PATCH', params, NUMBER_TYPE))
523+
524+
def delete_number(self, number):
525+
self.request(NUMBER_PATH + '/' + str(number), 'DELETE', None, NUMBER_TYPE)
526+
527+
def purchased_numbers_list(self, params={}, limit=20, offset=0):
528+
params['limit'] = limit
529+
params['offset'] = offset
530+
return NumberList().load(self.request(NUMBER_PATH, 'GET', params, NUMBER_TYPE))
531+
532+
def purchased_number(self, number):
533+
return Number().load(self.request(NUMBER_PATH + '/' + number, 'GET', None, NUMBER_TYPE))
534+
501535
@staticmethod
502536
def generate_voice_calls_url(call_id=None, leg_id=None, recording_id=None):
503537
uri = VOICE_API_ROOT + '/' + VOICE_PATH + '/'

messagebird/number.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from messagebird.base import Base
2+
from messagebird.base_list import BaseList
3+
4+
5+
class NumberList(BaseList):
6+
def __init__(self):
7+
# We're expecting items of type Number
8+
super(NumberList, self).__init__(Number)
9+
10+
11+
class Number(Base):
12+
def __init__(self):
13+
self.number = None
14+
self.country = None
15+
self.region = None
16+
self.locality = None
17+
self.features = None
18+
self.tags = None
19+
self.type = None
20+
self.status = None

0 commit comments

Comments
 (0)