我试图使用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')
答案 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!')