前提・実現したいこと
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'),
を試しましたが、うまく動きませんでした。
助けて下さい!!
お忙しい中、誠に恐縮ですが どうかお時間のある際回答をいただけると幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/25 12:31