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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

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

Q&A

解決済

1回答

3583閲覧

google APIを使ってPythonでスプレッドシートを操作する際、jsonファイルが読み込めない

Murasaki_PurPle

総合スコア37

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Python

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

0グッド

1クリップ

投稿2020/07/25 09:51

編集2020/07/25 12:37

前提・実現したいこと

Twitterのbotを作成しています。
ツイートを予め保管しておくために、スプレッドシートを使うことを考えています。流れは、スプレッドシートに保管した文字列をランダムで抽出しそれを呟く感じです。
ここで、認証に使うjsonファイルの中身を辞書型変数に保管しそれを利用します。最終的にHerokuへデプロイする予定なので、セキュアな内容は環境変数に保管しています。

発生している問題・エラーメッセージ

jsonファイルに格納されていた情報を.envに保管し それを辞書型変数の値にセットし

python

1credentials = ServiceAccountCredentials.from_json_keyfile_dict(CREDENTIAL, SCOPE_URL)

のようにしたところ、以下のようなエラーが出現しました。

Traceback (most recent call last): File "AutoTweet.py", line 60, in <module> credentials = ServiceAccountCredentials.from_json_keyfile_dict(CREDENTIAL, SCOPE_URL) File "/Users/ilovephys/.pyenv/versions/3.6.5/lib/python3.6/site-packages/oauth2client/service_account.py", line 253, in from_json_keyfile_dict revoke_uri=revoke_uri) File "/Users/ilovephys/.pyenv/versions/3.6.5/lib/python3.6/site-packages/oauth2client/service_account.py", line 185, in _from_parsed_json_keyfile signer = crypt.Signer.from_string(private_key_pkcs8_pem) File "/Users/ilovephys/.pyenv/versions/3.6.5/lib/python3.6/site-packages/oauth2client/_pure_python_crypt.py", line 182, in from_string raise ValueError('No key could be detected.') ValueError: No key could be detected. ERROR: exit status 1

該当のソースコード

python

1import gspread 2from oauth2client.service_account import ServiceAccountCredentials 3import tweepy 4import os 5import random as rnd 6 7#Twitter認証 8CK = os.environ["CK"] 9CS = os.environ["CS"] 10AT = os.environ["AT"] 11ATS = os.environ["ATS"] 12 13auth = tweepy.OAuthHandler(CK, CS) 14auth.set_access_token(AT, ATS) 15api = tweepy.API(auth) 16 17#gspread認証 18SCOPE_URL = 'https://spreadsheets.google.com/feeds' 19GID = os.environ["GID"] 20SHEET_NAME = '単発初心者向け' 21 22CREDENTIAL = { 23 "type": 24 "service_account", 25 "project_id": 26 os.environ['PROJECT_ID'], 27 "private_key_id": os.environ['PRIVATE_KEY_ID'], 28 "private_key": os.environ["PRIVATE_KEY"], 29 "client_email": os.environ['CLIENT_EMAIL'], 30 "client_id": 31 os.environ['CLIENT_ID'], 32 "auth_uri": 33 "https://accounts.google.com/o/oauth2/auth", 34 "token_uri": 35 "https://oauth2.googleapis.com/token", 36 "auth_provider_x509_cert_url": 37 "https://www.googleapis.com/oauth2/v1/certs", 38 "client_x509_cert_url": os.environ['CLIENT_X509_CERT_URL'] 39 } 40 41TEMPLATE_FILE_NAME = 'spread_sheet_credential_template.txt' 42 43credentials = ServiceAccountCredentials.from_json_keyfile_dict(CREDENTIAL, SCOPE_URL) 44client = gspread.authorize(credentials) 45sheet = client.open_by_key(gid) 46 47worksheet = sheet.worksheet(SHEET_NAME) 48 49#spreadSheet操作 50TWEET_CULUMN = 3 51TWEET_STR_COUNT = 4 52HASH_TAG = 13 53 54col_list = worksheet.col_values(TWEET_CULUMN) 55print(len(col_list)) 56tweet_text = col_list[rnd.randint(1, len(col_list)-1)] 57 58print(tweet_text) 59 60try: 61 api.update_status(status = tweet_text) 62 print("\nSuccess Of Tweeting!!") 63except tweepy.TweepError as error: 64 if error.api_code == 187: 65 # Do something special 66 print('duplicate message') 67 else: 68 raise error 69

調べたこと

Google検索しましたが、多くの方は「Herokuにデプロイした際」

raise ValueError('No key could be detected.') ValueError: No key could be detected. ERROR: exit status 1

が出たと言っていました。まだHerokuにデプロイしていない自分はその前段階のようです...

試したこと

JSON中のprivate keyには改行コード\nが含まれていますが、これが環境変数中では\nとなっている可能性があります。
とのご指摘を頂き

"private_key": os.environ.get('PRIVATE_KEY').replace('\n', '\n'),

を試しましたが、うまく動きませんでした。

助けて下さい!!

お忙しい中、誠に恐縮ですが どうかお時間のある際回答をいただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JSON中のprivate keyには改行コード\nが含まれていますが、これが環境変数中では\nとなっている可能性があります。

"private_key": os.environ.get('PRIVATE_KEY').replace('\n', '\n'),

としてみたらどうでしょうか。

投稿2020/07/25 12:14

patapi

総合スコア687

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

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

Murasaki_PurPle

2020/07/25 12:31

早速の回答ありがとうございます。 上記の方法で試してみましたがうまくいきませんでした。 何か別の方法をご存知ないでしょうか...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問