Last active
August 16, 2018 00:02
-
-
Save Yunaka12/c486bd57eaf6af21cf36e6deae7695a2 to your computer and use it in GitHub Desktop.
ツイッターの任意のユーザーの画像・動画・GIFをDLする。これらのメディア投稿時のツイートもエクセルファイルに保存する。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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