Вспомогательная библиотека Twilio Python. Как узнать, сколько страниц возвращено ресурса списка?

Я пытаюсь написать простой скрипт для загрузки информации о вызовах из Twilio с помощью вспомогательной библиотеки python. Пока кажется, что мой единственный вариант — использовать метод .iter() для получения всех вызовов, когда-либо сделанных для субсчета. Это может быть очень большое число.

Если я использую ресурс .list(), он, кажется, нигде не дает мне количество страниц, поэтому я не знаю, как долго продолжать пейджинг, чтобы получить все вызовы за период времени. Что мне не хватает?

Вот документы с примерами кода: http://readthedocs.org/docs/twilio-python/en/latest/usage/basics.html


person Sologoub    schedule 05.12.2011    source источник


Ответы (2)


На данный момент это не очень хорошо документировано, но вы можете использовать следующие вызовы API для просмотра списка:

import twilio.rest
client = twilio.rest.TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN)
# iterating vars
remaining_messages = client.calls.count()
current_page = 0
page_size = 50 # any number here up to 1000, although paging may be slow...
while remaining_messages > 0:
     calls_page = client.calls.list(page=current_page, page_size=page_size)
     # do something with the calls_page object...
     remaining_messages -= page_size
     current_page += 1

Вы можете передать аргументы page и page_size в функцию list(), чтобы контролировать, какие результаты вы видите. Я обновлю документацию сегодня, чтобы сделать это более понятным.

person Kevin Burke    schedule 05.12.2011
comment
Вы можете передавать аргументы даты? - person Sologoub; 06.12.2011
comment
Да, как Ended_after, Ended_before, Ended, Started_Before, Started_after или Started, как объекты даты и времени. Вот реализация функции: github.com/ twilio/twilio-python/blob/master/twilio/остальные/ - person Kevin Burke; 06.12.2011
comment
Ну, к сожалению, client.calls.count() всегда возвращает 50... так что этот код не работает. - person Sologoub; 10.12.2011
comment
Привет, Сологуб! Похоже, вы обнаружили ошибку в нашем API, которая неправильно возвращает общее количество вызовов, связанных с учетной записью. Сейчас мы работаем над исправлением, и вскоре наш API должен сообщить правильный номер. - person Kevin Burke; 10.12.2011
comment
Кевин, возможно, это так, но я бы все же предложил изменить библиотеку. Мне не имеет смысла листать страницы на основе общего количества звонков (которое может исчисляться миллионами). Разбиение по страницам должно выполняться по атрибуту numpages: twilio.com/docs /api/rest/response#response-formats-list - person Sologoub; 12.12.2011
comment
Привет, Сологуб. ​​Теперь это должно быть исправлено. Можете ли вы проверить это для своей учетной записи? Я не проверял это, но вы должны иметь возможность изменить приведенный выше пример, чтобы использовать атрибут num_pages. - person Kevin Burke; 27.12.2011

Как упоминалось в комментарии, приведенный выше код не работал, потому что rest_messages = client.calls.count() всегда возвращает 50, что делает его абсолютно бесполезным для пейджинга.

Вместо этого я просто пробовал следующую страницу, пока не потерпел неудачу, что довольно хакерски. Библиотека действительно должна включать numpages в ресурс списка для пейджинга.

import twilio.rest
import csv

account = <ACCOUNT_SID>
token = <ACCOUNT_TOKEN>

client = twilio.rest.TwilioRestClient(account, token)

csvout = open("calls.csv","wb")
writer = csv.writer(csvout)

current_page = 0
page_size = 50
started_after = "20111208"

test = True

while test:

     try:
         calls_page = client.calls.list(page=current_page, page_size=page_size, started_after=started_after)

         for calls in calls_page:
             writer.writerow( (calls.sid, calls.to, calls.duration, calls.start_time) )

         current_page += 1
     except:
         test = False
person Sologoub    schedule 09.12.2011
comment
Неверный подсчет был временной регрессией API, которая теперь исправлена. Исходный код теперь должен работать. - person amb; 17.12.2011
comment
Что ж, да, это исправлено, но если вы подумаете о том, что оно возвращает, вы, вероятно, увидите проблему, с которой я столкнулся. Для одного субаккаунта, который я запрашивал, он вернул 338452, тогда как набор результатов для определенного диапазона и критериев, которые я искал, составляет около 96000. Если бы я использовал указанный метод, я бы в конечном итоге попытался просмотреть дополнительные 242 000 записей, которые я никогда не собственно просил. Предписанный алгоритм листания подходит только для полного набора данных, а не для отфильтрованного. Дайте мне знать, если это не имеет смысла. Благодарю вас! - person Sologoub; 19.12.2011