質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4874閲覧

PythonからGoogleDriveに作成したJSONファイルを読み込む方法

unity_level1

総合スコア8

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/20 06:33

編集2020/12/01 02:08

PythonでGoogleDriveに格納したJSONファイルアクセスし、そのJSONファイル内の内容をTwitterに投稿するための処理を記載したのですが、
decodeエラーが発生してしまい、うまくJSONファイルを読み込めない状況です。
現状、エラーの検討が付かないため、大変お手数ですが、お分かりになる方がおりましたら、ご教示いただけますと幸いです。
※GoogleDriveから以外でも実現できる方法がございましたらご教示いただけますと非常に助かります。

追記内容
2020/12/01
エラーログの追記
スクリプトの修正(def get_tweet_content(json_file_path)以下に追記)

実行環境

■Google Colaboratory
■JSON -ここにツイート内容、画像を定義
■Python -JSONを使用して、Tweetする処理
■スクリプト内でGoogleDriveをマウントしております

JSON内容

JSONファイル名:tweetcontent.json
ファイルパス:Googleドライブ内

JSON内容 ※ファイルパスはドライブのファイルパスになるため、対象ファイルのURLと記載させていただきます

{ "contents":[ { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" } ] }

Pythonファイル名:TwitterBot.ipynb ※Colaboratory内のため、.pyではありません

Python内容

import json #urlを使用するためのモジュール import urllib.request import random import re from requests_oauthlib import OAuth1Session #マイドライブをマウント from google.colab import drive drive.mount('/content/drive/') #下記TwitterのAPIキー、アクセスキーのため記載しておりません CONSUMER_KEY = '****************************' CONSUMER_SECRET = '****************************' ACCESS_TOKEN = '****************************' ACCESS_TOKEN_SECRET = '****************************' twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_TOKEN_SECRET) # url変換に使用する正規表現 pattern = re.compile(r".*/file/./(.*)/.*") # <-------追加 url_media = "https://upload.twitter.com/1.1/media/upload.json" url_text = "https://api.twitter.com/1.1/statuses/update.json" # Googleドライブ上のリンクを、twitter API等で直接取得できるurlに変換する関数 <-------追加 def convert_url(url): a = re.search(pattern, url) try: return "https://drive.google.com/uc?export=view&id=%s" % a.group(1) except (AttributeError, IndexError) as e: # パターンマッチしない場合はメッセージを出して、渡されたurlをそのまま返す。 print("[%s]はパターンにマッチしないため、そのまま返します。" % url) return url def get_tweet_content(json_file_path): #テキストファイルを読み込む file = open(json_file_path, 'r', encoding='utf-8') #開いたファイルをjson.load関数でJSONとして読み込む #json_data = json.load(file) <-------テストの際に不要のためコメントアウトしている #JSONとして読み込んだfile変数が格納されたjson_data変数に、jsonデータを格納 #random.choice()でリストからランダムに要素を一つ取得 ##下記追記スクリプト #JSONとして読み込んだfile変数が格納されたjson_data変数に、jsonデータを格納 try: json_data = json.load(file) except json.JSONDecodeError as e: print(str(e)) print(e.doc) exit(0) return random.choice(json_data["contents"]) #img_urlはJSONで指定した画像オブジェクト def upload_media(img_url): # urlを変換する # <-------回答追加時当初から追加しています img_url = convert_url(img_url) # <-------回答追加時当初から追加しています #urlをオープンする res = urllib.request.urlopen(img_url) img_data = res.read() img_files = {'media': img_data} res_media = twitter.post(url_media, files=img_files) if res_media.status_code == 200: return json.loads(res_media.text)['media_id'] else: print('Image upload failed: %s', res_media.text) exit() def post_tweet(tweet_text, media_id): params = {'status': tweet_text, 'media_ids': media_id} res = twitter.post(url_text, params=params) if res.status_code == 200: print('Auto Tweet Succeeded.') else: print('Failed. : %d' % res.status_code) def main(): json_file_path = 'tweetcontent.jsonのファイルパス直指定' tweet_content = get_tweet_content(json_file_path) media_id = upload_media(tweet_content['img_url']) post_tweet(tweet_content['tweet_text'], media_id) if __name__ == '__main__': main()

エラー内容 


JSONDecodeError Traceback (most recent call last)
<ipython-input-13-0f1ead28e8c2> in <module>()
1 if name == 'main':
----> 2 main()

4 frames
<ipython-input-12-37b9a2f30b06> in main()
1 def main():
2 json_file_path = 'tweetcontent.jsonのファイルパス直指定'
----> 3 tweet_content = get_tweet_content(json_file_path)
4 media_id = upload_media(tweet_content['img_url'])
5 post_tweet(tweet_content['tweet_text'], media_id)

<ipython-input-9-8d70d6a47637> in get_tweet_content(json_file_path)
3 file = open(json_file_path, 'r', encoding='utf-8')
4 #開いたファイルをjson.load関数でJSONとして読み込む
----> 5 json_data = json.load(file)
6 #JSONとして読み込んだfile変数が格納されたjson_data変数に、jsonデータを格納
7 #random.choice()でリストからランダムに要素を一つ取得

/usr/lib/python3.6/json/init.py in load(fp, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
297 cls=cls, object_hook=object_hook,
298 parse_float=parse_float, parse_int=parse_int,
--> 299 parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
300
301

/usr/lib/python3.6/json/init.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
352 parse_int is None and parse_float is None and
353 parse_constant is None and object_pairs_hook is None and not kw):
--> 354 return _default_decoder.decode(s)
355 if cls is None:
356 cls = JSONDecoder

/usr/lib/python3.6/json/decoder.py in decode(self, s, _w)
340 end = _w(s, end).end()
341 if end != len(s):
--> 342 raise JSONDecodeError("Extra data", s, end)
343 return obj
344

JSONDecodeError: Extra data: line 1 column 11 (char 10)

追記のエラーログ

Extra data: line 1 column 11 (char 10)
"contents":[
{
"img_url":"https://drive.google.com/file/d/ファイルID/view?usp=sharing",
"tweet_text":"ファイル名"

}, { "img_url":"https://drive.google.com/file/d/ファイルID/view?usp=sharing", "tweet_text":"ファイル名" }, { "img_url":"https://drive.google.com/file/d/ファイルID/view?usp=sharing", "tweet_text":"ファイル名" }, { "img_url":"https://drive.google.com/file/d/ファイルID/view?usp=sharing", "tweet_text":"ファイル名" } ]

}

UnboundLocalError Traceback (most recent call last)
<ipython-input-14-0f1ead28e8c2> in <module>()
1 if name == 'main':
----> 2 main()

1 frames
<ipython-input-13-37b9a2f30b06> in main()
1 def main():
2 json_file_path = 'tweetcontent.jsonのファイルパス'
----> 3 tweet_content = get_tweet_content(json_file_path)
4 media_id = upload_media(tweet_content['img_url'])
5 post_tweet(tweet_content['tweet_text'], media_id)

<ipython-input-10-bb7332d3f4d2> in get_tweet_content(json_file_path)
15 exit(0)
16
---> 17 return random.choice(json_data["contents"])

UnboundLocalError: local variable 'json_data' referenced before assignment

参照リンク

PythonとJSONで画像付きツイートを自動化する

Pythonで画像付きツイートをする方法について、過去に質問した内容

Cplaboratoryに、Google driveを紐づける方法

長くなってしまい申し訳ございませんが、ご教示のほど宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

(本来はコメント欄に入れるべき内容かもしれませんが、コメント欄では全角スペースを使わないとインデントがうまくできないため回答欄に記します)

エラーメッセージから察するに、元のjsonデータが正常に解釈されていないのですが、
どのような形でデータがjson.load関数に渡されているか探る必要があります。

def get_tweet_content(json_file_path)関数の内容を下記のように変えた場合、どのようなエラーメッセージが出るでしょうか。
(json.loadをtry~catchで囲んでエラー内容を表示するようにしています。)
出たエラーメッセージ全文を記載してください。

python

1def get_tweet_content(json_file_path): 2 #テキストファイルを読み込む 3 file = open(json_file_path, 'r', encoding='utf-8') 4 #開いたファイルをjson.load関数でJSONとして読み込む 5 6 #JSONとして読み込んだfile変数が格納されたjson_data変数に、jsonデータを格納 7 try: 8 json_data = json.load(file) 9 except json.JSONDecodeError as e: 10 print(str(e)) 11 print(e.doc) 12 exit(0) 13 #random.choice()でリストからランダムに要素を一つ取得 14 return random.choice(json_data["contents"])

追記

記載していただいたエラーメッセージから察するに、
元の:tweetcontent.jsonファイルの内容について
先頭の{が欠けていると同時に、
最後の}をコメント扱いにするため先頭に#をつけてしまっているのではないでしょうか。

ただしく読み込むためには、全体を{}で囲む必要があります。
(最後の「}」の前に#をつけているとエラーになるので削除してください)

現状の tweetcontent.json(推測):エラーになる。:

"contents":[ { "img_url":"https://drive.google.com/file/d/xxxxxxxxxx/view?usp=sharing", "tweet_text":"test" }, { "img_url":"https://drive.google.com/file/d/zzzzzzzzzzzzzz/view?usp=sharing", "tweet_text":"test" } ] #}

あるべき tweetcontent.jsonのフォーマット:正しく読み込まれるはず。:
(データ全体を{}で囲んでください)
(urlやファイル名は適当なので、質問者さんのものに合わせてください)

{ "contents":[ { "img_url":"https://drive.google.com/file/d/xxxxxxxxxx/view?usp=sharing", "tweet_text":"test" }, { "img_url":"https://drive.google.com/file/d/zzzzzzzzzzzz/view?usp=sharing", "tweet_text":"test" } ] }

投稿2020/11/20 15:30

編集2020/12/01 03:10
sfdust

総合スコア1137

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unity_level1

2020/12/01 01:57

sfdust様 お世話になっております。 本件、お返事が遅くなってしまい大変申し訳ございませんでした。 また、ご回答いただきありがとうございます。 ご教示いただきましたスクリプトを実行させていただきましたので、質問にエラーログを追記させていただきました。 大変お手数ですが、ご確認のほどよろしくお願いいたします。
sfdust

2020/12/01 03:08

追記しました。 tweetcontent.jsonの内容を回答のように修正してみてください。
unity_level1

2020/12/01 03:48

sfdust様 ご回答いただきありがとうございます。 ご教示いただきました内容確認させていただきます!
unity_level1

2020/12/01 04:00

sfdust様 本件確認させていただきました。 JSONの内容を確認させていただきましたところ、JSONの開始時に{の記載が漏れておりました。 稚拙な質問でお手を煩わせてしまい申し訳ございません。。。 おかげさまで本件問題も解決することができました。 重ね重ね本当に助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問