【Python,Twitter】GoogleDriveにアップロードした画像を添付してツイートする方法

Python

こんにちはなおです!!

この記事ではPythonを使用してGoogleDriveにアップロードした画像を使ってツイートする方法を紹介します。

ちなみにTwitterAPI登録、GoogleDriveAPI登録を済ませている前提で進めるので、
まだ登録ができていない人はネットで調べて準備しましょう!!

 

[この記事での目標]
・Pythonを使用して画像1枚添付してツイートする
・Pythonを使用して複数画像添付してツイートする

[スポンサーリンク]


実行手順

以下のように①~③の手順でGoogleDriveの画像を使ってツイートしてみます。

①pydriveを使用してGoogleDriveに画像をアップロード
②①の時に作成したフォルダを共有設定にする
③GoogleDriveにアップロードした画像を添付してツイート

ちなみに今回使用するコードはgithubに公開しています。
https://github.com/ameiba/image_tweet

 

①pydriveを使用してGoogleDriveにアップロード

以下のdrive_upload.pyを用いてGoogleDriveに画像をアップロードします。
path変数はローカルで画像が入っているフォルダのパスを指定してください。
なおこの時にglob.globが動作するようにアップロードしたい拡張子を指定しましょう。

例えばC:\Users\user\desktopにあるjpgの画像をアップロードする場合のpath変数は以下のようになります。
path = r”C:\Users\user\desktop\*jpg”

# -*- coding: utf-8 -*-
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import os
import glob

#例:r"C:\Users\user\desktop\*jpg
#########変更箇所#############
path="path名 + \*jpg"
#############################

#drive準備
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)

#ファイル取得
file_list=glob.glob(path)
print(file_list)

#フォルダ作成
f_folder = drive.CreateFile({'title': 'image_folder','mimeType': 'application/vnd.google-apps.folder'})
f_folder.Upload()
folder_id = drive.ListFile({'q': 'title = "image_folder"'}).GetList()[0]['id']

#GoogleDriveに画像をアップロード
for file in file_list:
    name = os.path.basename(file)
    f = drive.CreateFile({'title': name , 'mimeType': 'image/jpeg', 'parents': [{'kind': 'drive#fileLink','id': folder_id}]})
    f.SetContentFile(file)
    f.Upload()

GoogleDriveでimage_folderというフォルダが作成され、フォルダ内に画像がアップロードされていたら成功です。

 

②①の時に作成したフォルダを共有設定にする

pydriveで画像をアップロードした時、アップロードした画像は特定のユーザー以外見れないように設定されています。
この状態だとツイートする時に画像が使えないので必ず誰でも見れる共有設定にする必要があります。
つまるところ画像のURLを知っていれば誰でも見れる状態にするわけです。

ちなみに今回のように画像を公開する目的の場合は共有設定にしても問題ありませんが、
公開する気がないファイルに関しては初期のまま共有設定をオフにしておきましょう。

 

ということで共有設定をするためにGoogleDriveのマイドライブを開きます。
マイドライブには①で作成したimage_folderがあると思います。

image_folderを右クリックして共有を選択してください。

次にリンクを知っている全員が観覧可にして、完了を押しましょう。

これでimage_folder内の画像全てが共有設定になりました。

[スポンサーリンク]


③GoogleDriveにアップロードした画像を添付してツイート

以下のimage_tweet.pyを使用して画像を添付してツイートを行います。
なおtwitterAPIの各種KEYとツイートに添付したい画像名は変更してください。
image_tweet.pyでは指定の1枚の画像を用いてツイートするようにしています。

# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import sys
import json

#########変更箇所#############
CONSUMER_KEY=""
CONSUMER_SECRET=""
ACCESS_TOKEN_KEY=""
ACCESS_TOKEN_SECRET=""
#ツイートに添付したいファイル名
file_name="000.jpg" 
#############################

#pydriveインスタンス作成
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth) 

#GoogleDriveのファイルリストを取得
file_list = drive.ListFile().GetList()
for f in file_list:
    print(f["title"])

image_id = ""
for f in file_list:
    #指定ファイル名があったらID取得
    if f['title'] == file_name:
        image_id = f['id']
        break

#OAuth1Sessionインスタンス作成
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)

#GoogleDriveの画像をTwitterサーバーにアップロード
image_url = "https://drive.google.com/uc?id=" + image_id
response = requests.get(image_url)
image = response.content
files = {"media" : image}
req_media = twitter.post("https://upload.twitter.com/1.1/media/upload.json", files = files)

if req_media.status_code != 200:
    print ("画像アップロード失敗: %s", req_media.text)
    sys.exit()

#アップロードした画像のID取得
media_id = json.loads(req_media.text)['media_id']

#ツイート(複数画像をアップロードする場合は["test1.jpg,test2.jpg"])みたいな感じ
params = {'status': "テスト","media_ids": [media_id]}
req=twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

if req.status_code != 200:
    print ("ツイート失敗: %s", req.text)
    sys.exit()
print("完了")

実行して無事画像を添付してツイートが行えたら成功です。

[番外編] 複数の画像を使ってツイート

先ほどは1枚でツイートをしていましたが、複数枚の画像をツイートする場合は以下のmulti_image_tweet.pyを使用します。

変更箇所は③の時と同じくTwitterAPIの各種キーと添付する画像名です。
今回は3枚をツイートしますが、最大4枚まで可能です。

# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import requests
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
import sys
import json

#####変更箇所#################
CONSUMER_KEY=""
CONSUMER_SECRET=""
ACCESS_TOKEN_KEY=""
ACCESS_TOKEN_SECRET=""
#ツイートに添付したいファイル名のリスト
image_file_list=["000.jpg","001.jpg","002.jpg"] 
############################

#pydriveインスタンス作成
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth) 

#OAuth1Sessionインスタンス作成
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)

#GoogleDriveのファイルリストを取得
file_list = drive.ListFile().GetList()
for f in file_list:
    print(f["title"])

tweet_media_id = ""
for file_name in image_file_list:
    image_id = ""
    for f in file_list:
        #指定ファイル名があったらID取得
        if f['title'] == file_name:
            image_id = f['id']
            break

#GoogleDriveの画像をTwitterサーバーにアップロード
image_url = "https://drive.google.com/uc?id=" + image_id
response = requests.get(image_url)
image = response.content
files = {"media" : image}
req_media = twitter.post("https://upload.twitter.com/1.1/media/upload.json", files = files)

if req_media.status_code != 200:
    print ("画像アップロード失敗: %s", req_media.text)
    sys.exit()

#アップロードした画像のID取得
media_id = json.loads(req_media.text)['media_id']

#ツイートする時のmedia_id作成("id1,id2,id3"のようにしないとツイートできない)
if tweet_media_id == "":
    tweet_media_id = str(media_id)
else:
    tweet_media_id = tweet_media_id + "," + str(media_id)

#ツイート(複数画像をアップロードする場合は["test1.jpg,test2.jpg"])みたいな感じ
params = {'status': "テスト","media_ids": [tweet_media_id]}
req=twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

if req.status_code != 200:
    print ("ツイート失敗: %s", req.text)
    sys.exit()
print("完了")

3枚の画像が添付されてツイートできたら成功です!!

 

冒頭でも紹介しましたが今回使用したコードはgithubに公開しています。
https://github.com/ameiba/image_tweet

では!!

[スポンサーリンク]


コメント

タイトルとURLをコピーしました