簡體   English   中英

twilio 通過 python 將消息日志導出到 csv

[英]twilio export message logs to csv via python

我正在嘗試使用 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')

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

Twilio 開發人員布道者在這里。

我這里有一個小技巧給你。 您實際上可以直接從 Twilio 獲取 CSV 您需要做的就是為您的數據構建 URL,然后在末尾添加.csv

編輯

要為您的消息構建 URL,您應該查看Messages 資源

該列表位於 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 末尾。

要執行日期范圍,例如 01/03/2017 之后和 02/03/2017 之前的示例,您的 URL 將如下所示:

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

查看使用 curl 列出消息的示例以更詳細地了解這一點。

如果您來這里是想了解如何提取通話記錄(而不是消息記錄),這里有一個示例。 您會注意到這與上面的答案非常接近(並且實際上是從它們派生出來的)。

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!')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM