スナックelve 本店

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

あばうとー  読者になる  follow us in feedly

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

自分の記憶が怪しい

twitterのDM検索したい

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

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

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

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

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

GET direct_messages (deprecated) — Twitter Developers

とりあえず「日付、時間、送信者、受信者、内容」を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