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で画像付きツイートをする方法について、過去に質問した内容
Cplaboratoryに、Google driveを紐づける方法
長くなってしまい申し訳ございませんが、ご教示のほど宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/01 01:57
2020/12/01 03:08
2020/12/01 03:48
2020/12/01 04:00