twilio导出消息通过python登录到csv

时间:2017-04-20 22:23:50

标签: python twilio

我试图使用python从twilio中检索一个月的消息日志。检索一天或两天时,下面的代码工作正常,但在扩展日期范围时速度极慢。有更好的方法吗?

import pandas as pd
from datetime import date
from twilio.rest import Client

# Your Account Sid and Auth Token from twilio.com/user/account
account_sid = "####"
auth_token = "####"
client = Client(account_sid, auth_token)


messages = client.messages.list(
    date_sent_after=date(2017, 3, 1),
    date_sent_before=date(2017, 3, 2)
)


d = []
for message in messages:
   d.append((message.from_, message.to, message.body, message.status, 
   message.date_sent, message.price))

print(d)

df = pd.DataFrame(d, columns=('From', 'To', 'Body', 'Status', 'Sent Date', 'Price'))


print(df.dtypes)

df.to_csv('export.csv', index=False, encoding='utf-8')

3 个答案:

答案 0 :(得分:1)

Twilio在其日志页面上的“导出为CSV”选项将无法导出数十万个结果。为此,您将需要自己的脚本来对Twilio API的结果进行分页并生成一个CSV。

这是我建议这样做的方式:

import csv
import requests

account_sid = ""
auth_pass = ""

results_per_page = 1000
num_pages = 500
start_date = "2010-04-01"

base_url = "https://api.twilio.com"
initial_page = "/" + start_date + "/Accounts/" + account_sid + "/Messages.json?PageSize=" + str(results_per_page)

response = requests.get(base_url + initial_page, auth=(account_sid, auth_pass)).json()
next_page = response['next_page_uri']

page = 0
data = response['messages']

# print response['previous_page_uri']
# print response

if not next_page == None:
  while page < num_pages:
    response = requests.get(base_url + next_page, auth=(account_sid, auth_pass)).json()

    next_page = response['next_page_uri']

    print "On page: " + str(page)

    data = data + response['messages']
    page += 1

    if next_page == None:
      print "No more pages"
      break

csv_file = open('export.csv', 'w')
csvwriter = csv.writer(csv_file)

count = 0

for message in data:

  if count == 0:
    header = message.keys()
    csvwriter.writerow(header)
    count += 1

  #only include outbound sms because inbound ascii/emojis throws csv writer errors
  if message.values()[2] == "outbound-api":
    csvwriter.writerow(message.values())

csv_file.close()

print "Done!"

您将需要使用凭据输入account_sid和auth_pass。如果不确定这些内容,请检查Twilio API Explorer。创建一个包含以下代码的twilio.py文件,然后在Mac终端中运行脚本:python twilio.py

我遇到的一个已知问题:如果入站邮件包含表情符号或奇怪的字符,则csv编写将引发错误。通过过滤以仅写出站邮件来解决此问题。

如果您想为其他人改进此脚本,请访问github页面:https://github.com/benjitastic/twilio-export-messages

答案 1 :(得分:0)

Twilio开发者传道者在这里。

我在这里有一个小技巧。实际上你可以get CSVs straight from Twilio。您需要做的就是构建数据的网址,然后将.csv添加到最后。

修改

要构建邮件的网址,您应该查看Messages resource

列表位于URL:

https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages

并将其变为CSV,只需添加.csv

即可

https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.csv

您需要使用您的帐户SID和身份验证令牌作为身份验证请求URL,并且您可以将任何查询参数添加到您喜欢的URL的末尾。

要做日期范围,例如您在2017年3月1日之后和2017年2月2日之前的示例,您的网址将如下所示:

https://api.twilio.com/2010-04-01/Accounts/{AccountSid}/Messages.csv?DateSent>=2017-03-01&DateSent<=2017-03-02

查看listing messages with curl的示例,以便更详细地了解这一点。

答案 2 :(得分:0)

如果您来这里查看如何提取呼叫日志(而不是消息日志),请参考以下示例。您会注意到,这与上面的答案非常接近(实际上是从中得出的)。

import csv, json
import requests
account_sid = ''
auth_token = ''

results_per_page = 1000
num_pages = 1000
start_date = '2010-04-01'
base_url = 'https://api.twilio.com'
initial_page = '/' + start_date + '/Accounts/' + account_sid + '/Calls.json?PageSize=' + str(results_per_page)
response = requests.get(base_url + initial_page, auth=(account_sid, auth_token)).json()
next_page = response['next_page_uri']

page = 0
data = response['calls']

# print response['previous_page_uri']
# print response
while page < num_pages and next_page is not None:
    print('On page: ' + str(page))
    response = requests.get(base_url + next_page, auth=(account_sid, auth_token)).json()
    next_page = response['next_page_uri']
    data = data + response['calls']
    page += 1

csv_file = open('twilio-call-logs.csv', 'w')
csvwriter = csv.writer(csv_file)

count = 0
for message in data:
    if count == 0:
        header = message.keys()
        csvwriter.writerow(header)
        count += 1

    csvwriter.writerow(message.values())

csv_file.close()
print('Done!')