Skip to content

Instantly share code, notes, and snippets.

@Yunaka12
Last active August 16, 2018 00:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yunaka12/c486bd57eaf6af21cf36e6deae7695a2 to your computer and use it in GitHub Desktop.
Save Yunaka12/c486bd57eaf6af21cf36e6deae7695a2 to your computer and use it in GitHub Desktop.
ツイッターの任意のユーザーの画像・動画・GIFをDLする。これらのメディア投稿時のツイートもエクセルファイルに保存する。
from twython import Twython, TwythonError
import urllib.request
import re
import time
import os
import emoji
import openpyxl
#ファイル名をツイート日時(日本時間)に設定
def change_name(date):
date_modify = re.sub("\+|-|:| ", "", date)
date_year = date_modify[18:23]
date_month = date_modify[3:6]
date_day = date_modify[6:8]
date_time = str(int(date_modify[8:14])+90000)
month =["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
date_month = str(int(month.index(date_month)) + 1)
return date_year+"_"+date_month+"_"+date_day+"_"+date_time
#動画ダウンロード--すべてのgifおよび動画をmp4形式で保存
def movieDL(check_url):
movie_url = []
movie_size = []
new_file = change_name(content[j]["created_at"])
for k in range(len(check_url)):
movie_url.append(str(check_url[k]["url"]))
movie_size.append(int(urllib.request.urlopen(movie_url[k]).info()['Content-Length']))
max_size = max(movie_size)
max_size_index = movie_size.index(max_size)
urllib.request.urlretrieve(movie_url[max_size_index],new_file+".mp4")
#画像ダウンロード--複数枚対応
def picDL(check_url):
new_file = change_name(content[j]["created_at"])
title =["a","b","c","d"]
for i in range(len(check_url)):
image_url = check_url[i]["media_url"]
urllib.request.urlretrieve(image_url,new_file+"_"+title[i]+".jpg")
#ユーザーごとにフォルダを作成
def makeDIR(name):
document_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Documents"
path = document_path+"/"+name+"さんのフォルダ"
if not os.path.exists(path):
os.mkdir(path)
os.chdir(path)
#ツイートに含まれる絵文字を除去
def remove_emoji(src_str):
return ''.join(c for c in src_str if c not in emoji.UNICODE_EMOJI)
#ツイートを配列化
def make_tweet_arr(tweet):
#ツイート日時(日本時間)
tweet_time = change_name(tweet["created_at"])
#絵文字を除いたツイート本文
tweet_text = "\n"+remove_emoji(tweet["full_text"])+"\n"
tweet_arr.append([tweet_time,tweet_text])
print(tweet_text)
#ツイート書き込み
def write_tweet(tweet_arr,name):
tweet_arr.append(["ツイート日時","ツイート内容"])
tweet = tweet_arr[::-1]
document_path = os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") + "\\Documents"
tweet_path = document_path+"/"+name+"さんのフォルダ/Tweet.xlsx"
if os.path.exists(tweet_path):
#エクセルファイルが存在する場合
wb =openpyxl.load_workbook(tweet_path)
ws = wb['Tweet_sheet']
tweet_time = []
i=0
exist = True
while exist:
value = ws.cell(row=i+1,column=1).value
if value != None:
tweet_time.append(value)
i = i + 1
elif value == None:
tweet_number = i
exist = False
tweet_add_row = 1
for i in range(len(tweet)):
if tweet[i][0] not in tweet_time:
ws.cell(row=tweet_add_row+tweet_number,column=1).value = tweet[i][0]
ws.cell(row=tweet_add_row+tweet_number,column=1).alignment = openpyxl.styles.Alignment(vertical='center')
ws.cell(row=tweet_add_row+tweet_number,column=2).value = tweet[i][1]
ws.cell(row=tweet_add_row+tweet_number,column=2).alignment = openpyxl.styles.Alignment(wrap_text=True,vertical='center')
tweet_add_row = tweet_add_row + 1
wb.save(tweet_path)
else:
#エクセルファイルが存在しない場合
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Tweet_sheet"
ws.column_dimensions['A'].width = 16
ws.column_dimensions['B'].width = 100
for i in range(len(tweet)):
ws.cell(row=i+1,column=1).value = tweet[i][0]
ws.cell(row=i+1,column=1).alignment = openpyxl.styles.Alignment(vertical='center')
ws.cell(row=i+1,column=2).value = tweet[i][1]
ws.cell(row=i+1,column=2).alignment = openpyxl.styles.Alignment(wrap_text=True,vertical='center')
wb.save(tweet_path)
#認証
APP_KEY = "" #各自設定する
APP_SECRET = "" #各自設定する
twitter = Twython(APP_KEY, APP_SECRET, oauth_version = 2)
ACCESS_TOKEN = twitter.obtain_access_token()
twitter = Twython(APP_KEY, access_token=ACCESS_TOKEN)
#ユーザーIDの入力、画像をDLするか選択
print("---")
print("メディアを総DLするアカウントのユーザーID")
userId = input(">>>")
print("---\n・画像のみDLする場合:photoと入力してEnterキーを押してください。\n・動画のみDLする場合:videoと入力してEnterキーを押してください。\n・画像も動画もDLする場合:allと入力してEnterキーを押してください。")
which_DL = input(">>>")
#最新ツイートを1件取得
latestTwi = twitter.get_user_timeline(screen_name=userId,
count=1,include_entities="True",exclude_replies="False",include_rts="False")
max_id = latestTwi[0]["id"]
#フォルダの作成
makeDIR(userId)
Tweet_count = 0
Pic_count = 0
Video_count = 0
tweet_arr = []
for i in range(32):
try:
content = twitter.get_user_timeline(screen_name=userId,
count=100,include_entities="True",exclude_replies="False",include_rts="False",max_id=max_id,tweet_mode='extended')
except:
print("ツイート取得時に何らかのエラー")
break
for j in range(len(content)):
Tweet_count = Tweet_count + 1
if "extended_entities" in content[j]:
check = content[j]["extended_entities"]["media"][0]["type"]
try:
if (check == "video" or check == "animated_gif") and (which_DL == "video" or which_DL == "all") : #動画とgif
movieDL(content[j]["extended_entities"]["media"][0]["video_info"]["variants"])
make_tweet_arr(content[j])
Video_count = Video_count + 1
elif check == "photo" and (which_DL == "photo" or which_DL == "all"): #画像
picDL(content[j]["extended_entities"]["media"])
make_tweet_arr(content[j])
Pic_count = Pic_count + 1
except:
print("メディアダウンロード時に何らかのエラー")
max_id = content[len(content)-1]["id"]
if len(content) == 1:
break
try:
write_tweet(tweet_arr,userId)
except:
print("ツイート書き出し時にエラー")
print("終了しました。\nチェックしたツイート件数:{}\nダウンロードした動画数:{}\nダウンロードした画像数:{}\n".format(Tweet_count,Video_count,Pic_count))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment