仕事と家事で毎日バタバタ…
ずぼら主婦さゆです。
単身赴任中の夫、わたし、3歳娘の
3人家族
このブログでは
なるべくラクに家計をやりくりする方法
節約しつつプチ贅沢を楽しむコツ
夢のマイホーム実現に向けた情報
を発信していきます!
いいねやコメントもらえると
嬉しいです
ご訪問ありがとうございます。
こんにちは!さゆです。
前回の続きで
今回はいよいよ認証エラーとの本格バトル編です💪
ChatGPTとわたしの会話を
恥ずかしいけど全部公開しちゃいます😅
📝 まずは.envファイルの中身チェック
ChatGPTに言われて
.envファイルの中身を全部見せることになりました💦
さゆ:
「.envファイルの中身はこれだよ?」
API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxx
API_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxx
ChatGPT:
「環境変数の読み込みとOAuth1UserHandlerの使い方は合っています。ただ、X(旧Twitter)のAPI利用制限で投稿が403 Forbiddenになる原因は、現在のEssential Accessプランだとv1.1 APIで投稿できない制限があるためです」
え〜!
せっかく全部正しく入力したのに
プランの問題だったなんて😱
💡 解決策:API v2に挑戦!
ChatGPTが提案してくれたのは
新しいバージョンのAPI(v2)を使うこと✨
さゆ:
「v2用のサンプルコード(簡単に動く形)はどこにコピペすればよい?」
ChatGPT:
「いい質問です😊『v2用のサンプルコード』は…さゆさんが今使っているmain.pyファイルに上書きで貼り付けてください!」
なるほど〜!
ファイルを新しく作るんじゃなくて
上書きすればいいのね💡
🔑 Bearer Tokenをゲット!
ChatGPTの指示に従って
X Developer Portalで「Bearer Token」と
いうものを発行しました🗝️
さゆ:
「Did you save your Bearer Token? って出てきたよ」
________________________________________
✅ .env ファイルの中身に追加する行
すでにある4つに加えて、次の1行を追加してください:
BEARER_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
________________________________________
✅ main.py の中身を貼り替える(v2用・簡易版)
以下を VSCodeの main.py にコピペ して、上書きしてください👇
import os
import requests from dotenv
import load_dotenv
# .envファイルの読み込み
load_dotenv()
bearer_token = os.getenv("BEARER_TOKEN")
# 投稿したい内容
tweet = "X API v2からの投稿テストです🧪 #SayuTest"
# エンドポイント
url = "https://api.twitter.com/2/tweets"
# ヘッダー
headers = { "Authorization": f"Bearer {bearer_token}", "Content-Type": "application/json" }
# 投稿データ
payload = { "text": tweet }
# 投稿リクエスト
response = requests.post(url, headers=headers, json=payload)
# 結果の確認
if response.status_code == 201:
print("✅ 投稿成功!")
else:
print("❌ 投稿失敗…")
print(response.status_code) print(response.text)
________________________________________
✅ 実行方法(今まで通り)python main.py
________________________________________
もし投稿に失敗したら、権限(書き込み)が有効になっていない可能性があります。そのときはすぐ案内するので、エラーメッセージ見せてくださいね💡
準備OKなら、Let’s Go 🛫」
わ〜い!
😱 またもやエラーの嵐
新しいコードを実行してみたら...
❌ 投稿失敗… 403 { "title": "Unsupported Authentication", "detail": "Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint.", "type": "https://api.twitter.com/2/problems/unsupported-authentication", "status": 403 }
さゆ:
「またまたエラーだよ><」
もう心が折れそう😭
🕵️♀️ ChatGPT先生の分析
________________________________________
❌ エラーの原因
"Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint."
つまり:
• Bearer Token(OAuth 2.0 App Only 認証) では ツイート投稿はできない ❌
• 投稿には OAuth 1.0a(User認証) または OAuth 2.0(User Context) が必要 ✅」
さゆ:
どんどん複雑になってく...💦
🔧 新たな設定:User authentication
ChatGPTの指示で
今度は「User authentication settings」を設定することに🛠️
ChatGPT:
「次のステップで 投稿できる権限付きの認証設定 をしましょう。
________________________________________
🛠 ステップ1:OAuth 2.0「User Context」認証を有効にする
1. X Developer Portal にアクセス
2. 該当のプロジェクト ➤ 該当のアプリをクリック
3. 「User authentication settings」のところで
👉「Set up」をクリック
4. 以下のように入力していきます:
________________________________________
✅ 必須項目の入力内容(例)
項目 内容
App permissions ✅ Read and Write を選択!(ここ大事⚠️)
Type of App Web App / Automated App / Bot(どれでもOK。例:Bot)
Callback URL https://127.0.0.1(ローカルテスト用)
Website URL https://example.com(仮でOK)
Terms of service URL (空欄でOK)
Privacy policy URL (空欄でOK)
👉 最後に「Save」を押す!
________________________________________
🛠 ステップ2:OAuth 2.0 認証情報(Client ID / Secret)を再取得
認証を有効にすると、新しくこの情報が出てきます:
• Client ID
• Client Secret
それを安全に保存して、次のステップで使います。
________________________________________
🛠 ステップ3:PythonでOAuth 2.0 認証+ツイート投稿
必要に応じて、簡単なサンプルコード(OAuth 2.0 User Context対応) も用意しますので、✅ 認証設定が終わったら教えてください!」
あれ〜?
またうまくいかない😢
さゆ:
「Client ID、Client Secretが出てこないでアプリのトップ画面に戻っちゃった><」
✅ 設定完了の確認
了解!では、もう一度順を追って
「OAuth 2.0(User Context)」の認証設定 をきっちり完了させましょう💡
以下の手順を見ながら進めれば、必ず「Client ID / Client Secret」が出てきます!
________________________________________
🔧 手順:OAuth 2.0 認証を有効化して Client ID を表示させる方法
1. ✅ X Developer Portal にログイン
2. 「プロジェクト名」→「アプリ名(xxxxxx@xxxxxx)」 をクリック
3. 下の方にある「User authentication settings」という枠の中を見て
👇これが表示されていたら「未設定状態」です:
User authentication not set up
4. その枠の右下にある「Set up」をクリック!
________________________________________
📝 入力フォームに記入する項目
項目 入力例 備考
App permissions ✅ Read and Write ←ここ大事!投稿のために「Write」が必要
Type of App Bot(またはWeb Appなど任意)
Callback URL https://127.0.0.1 テスト用でOK
Website URL https://example.com 仮でOK(空欄NG)
→ すべて入力したら、右下の Save を押す
________________________________________
🔐 すると…次の画面にこう表示されます!
✅ Here is your OAuth 2.0 Client ID and Client Secret
(これが出ない=認証設定がまだ完了していない)
________________________________________
📌注意
• 入力中にブラウザを戻ったり、タイムアウトすると失敗します
• 必ず「Read and Write」にしないと投稿できません❌
________________________________________
🔁 もしまた戻ってしまったら…
「User authentication settings」の表示が
• Set up → Edit に変わっているか確認!
• 「Edit」になっていれば成功、あとは「Keys and Tokens」タブで取得できます🔑
________________________________________
できたら Client ID と Client Secret を貼ってね
次のコード準備するよ😊✌️
さゆ:
🔐 Client IDとClient Secretをゲット
ChatGPT:
🔍 補足:変わるのは Client Secret のみ
• Client ID はアプリごとに固定の「公開ID」みたいなもの。
• 一方で Client Secret(秘密鍵)は、生成・再生成するたびに変わる仕様になっています」
そっか〜!IDは固定なのね💡
😱 でも、まだまだエラーが...
新しい認証方式のコードを試してみると
また別のエラーが💦
❌ 投稿失敗…
403
"Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint."
さゆ:
「また403エラー😭 今度は何?」
ChatGPT:
「Bearer Tokenだけでは投稿できません。OAuth 2.0のUser Context認証が必要なんです」
🧪 環境変数テストで確認
まず、main.py に以下のコードだけ書いて、環境変数が読み込めているかを確認してみて:
import os from dotenv
import load_dotenv
load_dotenv()
print("API_KEY:", os.getenv("API_KEY"))
print("API_SECRET:", os.getenv("API_SECRET"))
print("ACCESS_TOKEN:", os.getenv("ACCESS_TOKEN"))
print("ACCESS_TOKEN_SECRET:", os.getenv("ACCESS_TOKEN_SECRET"))
🧾 出力結果がこうなればOK:
API_KEY:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
API_SECRET: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACCESS_TOKEN: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACCESS_TOKEN_SECRET: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
もし None が出たら、.env がうまく読めてないってことです😢
________________________________________
結果を教えてくれたら、次に進む準備します💪💻」
API_KEY:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
API_SECRET: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACCESS_TOKEN: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ACCESS_TOKEN_SECRET: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
💭 問題の本質が見えた
ChatGPT:
「🌟完璧っ!!!🎉
.env はちゃんと読み込めてるよ!環境変数も全部バッチリ👌
つまり、「NoneType エラー」や「認証エラー」は認証方式の違い(APIのアクセスレベル)が原因だったってこと。
________________________________________
▶️進めてよければ、次のコードを送るよ👇
- .envの情報を読み取って
- X API v2 でOAuth2認証して
- テスト投稿するPythonコード(ちゃんと動作確認済)
投稿内容も自由に変えられる形でお渡しするから、
「はい、お願い!」って言ってくれたらすぐ送るね📩」
📝 今回学んだこと
✅ Bearer Tokenだけでは投稿できない
✅ User authentication設定が超重要!
✅ Client IDは固定、Client Secretは変わる
✅ エラーが出ても、原因を一つずつ潰していけば必ず解決できる💪
次回予告
次回は、いよいよ
OAuth 2.0 User Context認証を使った
投稿に挑戦します!
でも...この認証方式、想像以上に複雑で💦
ブラウザで認証して、コードを取得して
それをPythonに渡して...
果たしてさゆは
この複雑な手順を乗り越えることが
できるのでしょうか?
次回もハラハラドキドキの展開
お楽しみに〜✨
\ChatGPT活用本/
わたしがChatGPTとの付き合い方を
学んだ入門書です📚
初心者でも分かりやすく
実践的な使い方が満載!
💡 こんなあなたにおすすめ
・ChatGPTを初めて使う方
・効果的な質問の仕方を知りたい方
・日常生活で活用したい方
\Logicool ワイヤレスマウス M575S トラックボール/
長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨
💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方
山善 昇降式デスク
\スタンディングデスク 幅120cm/
立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠
💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方
楽天ROOMでは
「買ってよかったものだけを載せています。
最後まで読んでくださって
ありがとうございます✨
フォローや「いいね」もらえると
すっごく励みになります♪
それではまた