スナックelve 本店

バツイチ40代女の日記です

やりたいことはできなかった

自分の記憶が怪しい

twitterのDM検索したい

メールとかだと抜けがある

twitterのDMを取得してローカルに保存したい

アプリ普通にありそうだけどあえて - スナックelve 本店

というわけで、本当は全部のDMを取得したかったのだけど、送信、受信それぞれ200件くらいまでしか取れないみたい(´・ω・`)ショボーン

Specifies the number of direct messages to try and retrieve, up to a maximum of 200.

https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-messages

とりあえず「日付、時間、送信者、受信者、内容」をCSVで吐き出させて、後はエクセルで何とかしようと思った。
例によって例のごとく正常系しか見てないのでファイル書き込めないときとか止まると思うw
トークンのパーミッション(?)の設定しっかり反映させてからね~。

import datetime
import json
import sys

import twitter

from my_config import *

#ファイルに書き込む関数
def writeFileLine(myfilename,dms):
    myid = 0

    f = open(myfilename, 'ab')
    
    for dm in dms:
        myid = dm['id']
        mText = '"' + dm['text'] + '"'
        mSender = dm['sender']['name']
        mRecipient = dm['recipient']['name']
        mCreated_at = datetime.datetime.strptime(dm['created_at'],"%a %b %d %H:%M:%S +0000 %Y")

        f.write((mCreated_at.strftime("%Y/%m/%d,%H:%M:%S") + ',' + mSender + ',' + mRecipient + ',' + mText +'\n').encode("utf_8_sig", "ignore"))
    f.close
    return(myid)


#初期設定
auth = twitter.OAuth(ACCESS_TOKEN, ACCESS_TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET_KEY)
t = twitter.Twitter(auth=auth)

#ファイルクリア
myfilename = 'DmGetter.csv'
f = open(myfilename, 'wb')
f.close

#受信取得 
try:
    dms = t.direct_messages()
except:
    print('失敗じゃ\n')
    sys.exit()
if 'Error' in dms:
    print('失敗じゃ\n' + dms)

#ファイル書き込み
lID = writeFileLine(myfilename,dms)

#2回目以降
while lID != 0:

    try:
        dms = t.direct_messages(max_id = lID - 1)
    except:
        print('失敗じゃ\n')
        sys.exit()
    if 'Error' in dms:
        print('失敗じゃ\n' + dms)

    nID = writeFileLine(myfilename,dms)
    if nID != lID:
        lID = nID
    else:
        lID = 0 

#送信取得 
try:
    dms = t.direct_messages.sent()
except:
    print('失敗じゃ\n')
    sys.exit()
if 'Error' in dms:
    print('失敗じゃ\n' + dms)

myfilename = 'DmGetter.csv'
#ファイル書き込み
lID = writeFileLine(myfilename,dms)
#2回目以降
while lID != 0:

    try:
        dms = t.direct_messages.sent(max_id = lID - 1)
    except:
        print('失敗じゃ\n')
        sys.exit()
    if 'Error' in dms:
        print('失敗じゃ\n' + dms)

    nID =writeFileLine(myfilename,dms)
    if nID != lID:
        lID = nID
    else:
        lID = 0