PythonでJSONに記載した内容をTwitterに投稿するための処理を記載したのですが、下記のようなエラーが発生してしまい
上手く実行が行えない状況です。
当方プログラム初心者のため、Python、JSONの理解が及んでいないです。(本プログラムも理解できていない部分が結構あります)
お手数ですが、お分かりになる方がおりましたら、ご教示いただけますと幸いです。
追記(2020/11/18):
追加でエラーが発生してしまったため、そちらも合わせてご教示いただけますと非常に助かります。
お手数ですがよろしくお願いいたします。
追記2(2020/11/19):
確認したい内容とご教示いただきましたスクリプトをスクリプト内に追記させていただきましたので、お手数ですが、
ご教示いただけますと幸いです。
※ご教示いただきましたスクリプトはそのまま記載しました。convert_url(url)のurlをJSONで定義したimg_urlやファイルのパスを直書きしたり試したのですが、
Image upload failedを解消することができませんでした。
実行環境
■Google Colaboratory
■JSON -ここにツイート内容、画像を定義
■Python -JSONを使用して、Tweetする処理
※JSON、Pythonファイル共にGoogle Colaboratory内で記述しており、Googleドライブをマウントなどはしてません。
JSON内容
JSONファイル名:tweetcontent.json
ファイルパス:/content/sample_data/tweetcontent.json
JSON内容 ※ファイルパスはドライブのファイルパスになるため、対象ファイルのURLと記載させていただきます
{ "contents":[ { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" }, { "img_url":"対象ファイルのURL", "tweet_text":"画像名" } ] }
Python内容
Pythonファイル名:TwitterBot.ipynb ※Colaboratory内のため、.pyではありません
import json from requests_oauthlib import OAuth1Session #urlを使用するためのモジュール import urllib.request import re # <-------追加 #下記TwitterのAPIキー、アクセスキーのため記載しておりません CONSUMER_KEY = '****************************' CONSUMER_SECRET = '****************************' ACCESS_TOKEN = '****************************' ACCESS_TOKEN_SECRET = '****************************' #Twitterアクセスキーを変数へ格納 twitter = OAuth1Session(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_TOKEN_SECRET) # url変換に使用する正規表現 pattern = re.compile(r".*/file/./(.*)/.*") # <-------追加 #メディアアップロードに使用するURL url_media = "https://upload.twitter.com/1.1/media/upload.json" #テキストアップロードに使用するURL 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 #jsonファイルからツイート本文と画像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()でリストからランダムに要素を一つ取得 return random.choice(json_data["contents"]) #画像をTwitterにアップロードし、media_idをリターン #img_urlはJSONで指定した画像オブジェクト def upload__media(img_url): #urlをオープンする res = unllib.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() #ツイート本文とアップロード済みの画像のmedia_idを引数にツイート 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 = '/content/sample_data/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()
エラー内容
※JSONに記載された内容を読み取れていないと考えております。
NameError Traceback (most recent call last)
<ipython-input-25-174f78df48e2> in <module>()
1 if name == 'main':
----> 2 main()
1 frames
<ipython-input-24-d2f2ce4bbe66> in main()
1 def main():
2 json_file_path = '/content/sample_data/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-21-8d70d6a47637> in get_tweet_content(json_file_path)
6 #JSONとして読み込んだfile変数が格納されたjson_data変数に、jsonデータを格納
7 #random.choice()でリストからランダムに要素を一つ取得
----> 8 return random.choice(json_data["contents"])
NameError: name 'random' is not defined
参照リンク
追加で発生したエラー
上記のエラーの「NameError: name 'random' is not defined」は解消でき、ツイートもテキストツイートは成功しました。
ですが、画像ツイートが下記のエラーにより、失敗してしまいます。
お手数ですが、引き続きご教示いただけますと幸いです。
宜しくお願い致します。
■一回目実行
画像投稿失敗ログ:
GoogleDriveをマウントしました→セッションがクラッシュしました
↓ 下記ログが出力
Image upload failed: %s {"request":"/1.1/media/upload.json","error":"media type unrecognized."}
Auto Tweet Succeeded.
■二回目実行
一回目実行後再実行すると下記のエラーが発生再発します。
NameError Traceback (most recent call last)
<ipython-input-1-0f1ead28e8c2> in <module>()
1 if name == 'main':
----> 2 main()
NameError: name 'main' is not defined
確認したい内容
・convert_url(url)の引数urlはreturnされた「"https://drive.google.com/uc?export=view&id=%s" % a.group(1)」の値が記載されている認識でよろしいでしょうか。認識が間違っている場合、引数にはどの値(ファイルパス指定、JSONに記載したファイルパスの変数を指定など)を定義するべきでしょうか。
・main()関数にはconvert_url(url)を呼び出す関数がないようですが、こちらの関数はどのように呼び出せばよろしいでしょうか。
・main()関数に記載したjson_file_pathにjsonファイルのパスを直指定しているのですが、こちらはjsonファイル名を記載するのが正しいのでしょうか。
・Pythonの実行方法として、定義された関数をmainから実行していくという認識であっているのでしょうか。※初歩的な質問で申し訳ございません
長くなってしまい申し訳ございませんが、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/18 08:53
2020/11/18 15:03
2020/11/19 03:04 編集
2020/11/19 05:31 編集
2020/11/19 06:29
2020/11/19 10:35
2020/11/20 06:40
2020/11/20 14:44 編集