仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

もう皆んな

ふるさと納税をやったことあると

思ってたんだけど

 

 

最近立て続けに

ふるさと納税やったことないって

人に出会ったんです。

 

 

正直、びっくり過ぎて

 

えっ、そんなにもったいないことある?気づき

 

って思っちゃいました😲

 

 

ふるさと納税って

ほぼ無料でお肉や海鮮、家電が

もらえるようなものなのに…!

 

 

しかも

手続きもすごく簡単になってるんです。

 

「ふるさと納税って難しそう...」 

「手続きが面倒かも...」

 「損しないか不安...」

 

 

 

もしかして、あなたも

こんな風に思って

なんとなく後回しにしていませんか?

 

 

わたしも最初はそうでした😅

 

でも

 

やってみたら、めちゃくちゃ簡単で

いまでは毎年欠かさずやっています!

 

特に楽天でふるさと納税すると

いつものお買い物と

全く同じ感覚でできちゃうんです♪

 

しかも

お買い物マラソン期間中は

ポイント還元率もアップ!

 

 

もしあなたも、まだやったことなかったら

いまのうちにふるさと納税を理解して

 

次のお買い物マラソンで

ふるさと納税デビューしませんか。

 

 

ふるさと納税の凄さ3つ

 

✅ 実質2,000円で高級特産品がもらえる

✅ 次の年の税金が安くなる

✅ 楽天ポイントも貯まる(9月末まで!

 

 

ふるさと納税の仕組みを簡単に説明すると...

 

自治体に寄付をすると

お礼として特産品がもらえて

寄付額のほとんどが税金から控除される制度なんです。

 

 

例えば

 

わたしが去年5万円寄付したら

翌年の税金から48,000円が戻ってきました!

 

実質2,000円で高級和牛や果物が

手に入ったんです🍖

 

娘も大好きだから

家族みんなで大満足でした♡

これって本当にお得じゃないですか?

 

 

わたしがふるさと納税をはじめたきっかけ

 

わたしがふるさと納税を

はじめたきっかけは2年前

 

 

娘が保育園に行くようになって

 

ある日のお迎え時間に

ママ友の一人が

 

先月、ふるさと納税で届いた

イクラが絶品だったよ〜飛び出すハート

 

って話していて。

 


他のママたちは

 

「え?ふるさと納税って何?」

「難しくないの?」

 

という反応でした。

 

わたしもその一人だったんです😅

 

 

でも

 

その場で楽天ふるさと納税の

サイトを見せてもらって

 

返礼品の豊富さにびっくり!

 

これは絶対やるしかない!と思いました。

 

 

実際にやってみて分かったメリット

 

実際にやってみて分かった

メリットをシェアしますね♪

 

 

① 地域の特産品が実質2,000円でもらえる

お肉、海産物、お米、フルーツ

お菓子、日用品、家電まで!

 

選ぶ時間が本当に楽しいです😍

 

 

 

② 楽天ポイントが貯まる!

楽天ふるさと納税で寄付すると

なんと楽天ポイントも貯まるんです!

 

 

 

お買い物マラソン中なら

ポイント還元率もアップします❣️

 

 

 

ただし、制度改正があって

楽天ポイントが貯まるのは9月末までなので

利用は計画的に🎯

 

 

 

③ 翌年の税金が安くなる

寄付した金額から2,000円を引いた分は

翌年の税金から控除されます💰

 

 

 

つまり

 

ふるさと納税しない場合

ただ税金を払うだけだけど

 

 

ふるさと納税すると

払ったお礼に地域の美味しい特産品が

貰えるという仕組みなんです。

 

 

 

ずぼらさんでもできる簡単5ステップ

 

「でも、やり方が分からない...」

大丈夫です!超カンタンなんです♪

 

特に楽天ユーザーなら簡単すぎて驚くはず!

 

 

 

① まずは控除上限額をチェック

年収や家族構成によって

寄付できる金額に上限があります。

 

 

例えば

 

年収400万円なら

だいたい4万円~5万円が目安。

 

 

おおよその上限額は

こちらのサイトでパパっとチェックできます!

右矢印ふるさと納税 自分の寄付上限額を調べる

 

 

 

② 返礼品を選ぶ

これが一番楽しい時間♡

「何にしょうかな〜」と選ぶ時間が

わたしの密かな楽しみニコニコ

 

 

楽天のふるさと納税サイトの

人気ランキングを参考にすれば

初心者でも失敗しにくいです。

 

 

 

定番は地方の海産物や野菜、果物

水、トイペ、箱ティッシュなど。

 

変わり種としては

包丁や家電なんかもあります。

 

 

ちなみに今年は

高騰しているお米が人気みたいです。

 

 

 

③ 寄付の手続き

楽天のふるさと納税サイトから

普通に買い物するように

クレジットカードで決済するだけ。

 

その際に

「ワンストップ特例を希望する」にチェック。

 

 

楽天カード決済にすれば
0と5のつく日はポイント4倍に💕

 

 

 

④ ワンストップ特例の申請書を提出

これが一番面倒に感じるけど

郵送で届いた申請書に

必要事項を記入して返送するだけ。

マイナンバー記入欄があるから

マイナンバーカードを手元に準備しておくと

スムーズです!

 

ただし

 

5つ以上の自治体に寄付すると

確定申告が必要になっちゃうので気を付けて!

 

同じ自治体から複数なら

返礼品の数は5つを超えても大丈夫🙆‍♀️

 

 

 

⑤ 返礼品を待つ

あとは特産品が届くのを待つだけ!

わくわくする時間ですよね😊

 

配送状況は楽天の購入履歴から
簡単に確認できます✨

 

 

わが家のリアルな活用例

 

これまでに

わが家でポチったものを参考に!

 

新潟県のお米の定期便5kg~(14,000円~)

右矢印【ふるさと納税】新米予約 令和7年産 米 無洗米 定期便

 

 

 

千葉県の銀鮭切り身(10,000円~)

右矢印【ふるさと納税】厚切り 塩銀鮭 切り身

 

 

 

北海道のホタテ貝柱(9,500円~)

右矢印【ふるさと納税】北海道産 ホタテ貝柱

 

 

 

滋賀県の近江牛ハンバーグ(5,000円~)

右矢印【ふるさと納税】 黒毛和牛 ハンバーグ 150g

 

 

 

福井県のブラックタイガー(7,000円~)

右矢印【ふるさと納税】背ワタなし 高級ブラックタイガー

 

 

 

トータル支出は45,500円だけど

来年の税金を43,500円払わなくて済むので

 

 

これら全部合わせて2,000円で

買ったのと同じなんです‼️

 

 

 

やる前に知っておきたい注意点

 

 

実質2,000円で豪華なお礼の品がもらえて

さらに楽天ポイントまで貯まるなんて
やらない理由がないですよね?

 

 

とはいえ

いくつか注意点も。

 

✅ 必ず2,000円の負担が発生
 

どれだけ寄付しても実質無料にはならず

最低2,000円は自己負担になります。


✅ 控除には上限がある
 

寄付しすぎると

控除されない分が出てきてしまうので

上限額内に収めるのがポイント!


✅ ワンストップ特例は5自治体まで
 

寄付先が5つを超えると確定申告が必要に!

 

初心者はまずは

少しずつ始めると安心です♪

 

 

 

特に控除上限を超えると

単なる寄付になっちゃうので
シミュレーションで確認するのが大事!
 

 

 

とりあえず少額から試してみようかな
という方は

 

1万円以下のナッツや果物などでも!

 

 

熊本県のミックスナッツ(2,900円~)

右矢印【ふるさと納税】ミックスナッツ 500g〜3500g選べる 定期便

 

 

 

岡山県のシャインマスカット(9,500円~)

右矢印【ふるさと納税】岡山県産 シャインマスカット 約650g〜 2kg

 

 

 

岡山県の桃(8,000円~)

右矢印【ふるさと納税】岡山県産 桃 約750g 約1.3kg 2.6kg 定期便

 

 

 

山形県産のさくらんぼ(8,000円~)

右矢印【ふるさと納税】≪2025年先行予約≫山形県産 さくらんぼ 500g

 

 

 

 

まとめ:さっそく始めてみよう♡

 

失敗しようがないし

家計の味方になりますよ✨
 

 

え?そんなにお得なの?

 

 

そう最初は

半信半疑だったママ友も

 

 

いまでは

 

「わたしも和牛もらったよ〜!」
「今年は何にしようか迷う〜」
 

と、すっかりふるさと納税の虜に😆

 

 

 

皆さんもいまから仕込んで

次の楽天お買い物マラソン期間中

 

 

そして9月末までのポイント付与期間中に

ぜひ試してみてくださいね!
 

 

何か質問があれば、
コメント欄で教えてください💕

 

それでは、またバイバイ

 

 

最後までお読みくださり

ありがとうございました!

 

 

楽天市場

 

 

フォローしてもらえると励みになります♪

フォローしてね

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

ブログでは書ききれない

ズボラ的工夫やお得情報も載せてるので、  

ぜひ覗いてみてくださいおねがい

 

 

\今年こそ、ミラコスタに泊まりたい/

右矢印予約サイトを見てみる

 

 

 

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

いつも家事と育児でバタバタの毎日ですが

今日はとっても嬉しいことがありました😊


なんと!PC音痴のわたしでも

X(旧Twitter)の投稿システムを作ることができたんです🎉


 「え、そんなの無理でしょ💦」


って思ったあなた

わたしも最初はそう思ってました😅



でも実際にやってみたら…


本当にできちゃいました✨ 

今回はその感動の瞬間をお伝えします😆

 

 

これまでのドタバタ劇をおさらい📚


エラーとの戦いが続いていました💦 


専門用語もよくわからないし

「もうダメかも😭」

って何度も思いました😅



でも娘のお昼寝中にChatGPTに聞きながら

コツコツ続けてついに原因が判明したんです✨ 


.envファイル(設定ファイルのこと)に

同じ項目が2回書いてあって

それが悪さをしてたんです💦


「こんな単純なミス?!」


って拍子抜けしちゃいました😅 


でもこれ

きっと初心者あるあるですよね✨

 

 


夜中のこっそり作業で大発見🎯


娘が寝静まった夜中に

ChatGPTに教わりながらコツコツ修正作業😊


夫からLineもそっちのけで

「また何かやってるの?」

って言われちゃいましたが💦


新しい認証方式

(OAuth 1.0aっていう難しい名前のやつ😅)

に変更する必要があることが判明しました✨ 



「また新しいこと覚えるの〜💦」


って思ったけど

ChatGPTが優しく教えてくれるので安心です😊



この時点で時刻は夜中の1時過ぎ💦 


「明日の朝、起きられるかな😅」


なんて思いながらも

成功への期待でわくわくが止まりませんでした✨



ライブラリのインストール

まずはChatGPTに教わった通り

新しいライブラリをインストールします😊 

コマンドプロンプトで以下を実行しました✨

 

pip install requests requests-oauthlib


修正したPythonコード

ChatGPTがくれた新しいコードに変更しました😊
OAuth 1.0a認証を使う形になっています✨

 

import os
from dotenv import load_dotenv
import requests
from requests_oauthlib import OAuth1

load_dotenv()

# 環境変数から認証情報を読み込む
API_KEY = os.getenv("API_KEY")
API_SECRET = os.getenv("API_SECRET")
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
ACCESS_TOKEN_SECRET = os.getenv("ACCESS_TOKEN_SECRET")

# OAuth 1.0a の認証セットアップ
auth = OAuth1(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 日本語含むツイート内容を.txtから読み込む
with open("tweet.txt", "r", encoding="utf-8") as f:
    tweet_text = f.read()

data = {
    "text": tweet_text
}

# ツイートを送信
response = requests.post("https://api.twitter.com/2/tweets", json=data, auth=auth)

if response.status_code == 201:
    print("✅ 投稿成功!")
    print(response.json())
else:
    print("❌ 投稿失敗…")
    print(response.status_code)
    print(response.text)

 

前回との大きな違いは

headersの代わりにauth=OAuth1(...)を

使っているところです😅 

 

これが重要なポイントでした✨

 

 

投稿文の準備📝

 

tweet.txtファイルには

以前から考えていた初回投稿の内容を保存しました😊

 

この投稿が成功すれば

わたしのX自動投稿システムの

記念すべき第1回投稿になります✨

 

 

いよいよ実行の瞬間💓

 


朝の家事を済ませて

娘がEテレに夢中になってる隙に再挑戦😊

コーヒー片手にドキドキしながら

ボタンをポチッと押しました✨

 

PS C:\Users\sayu\Documents\XAutoPost> & 

C:/Users/sayu/AppData/Local/Programs/Python/Python313/python.exe 

c:/Users/sayu/Documents/XAutoPost/post_tweet.py

 

そして結果は…😆

 

 

ついに成功の瞬間🎊

 

✅ 投稿成功!
{'data': {'id': '19440785733...', 'text': '「誰かの役に立つ情報を発信せよ」\n「想いを乱射するな」\n\nそう言われたことがある。\n\nけれど\n自分の中に生まれた違和感を\n看過せずに問いかけることにも\n意味があるのではないだろうか。\n\nここは、それを静かに問うところ。\n\n#問いの実験室', 'edit_history_tweet_ids': ['19440785733...']}}


って画面に出たんです🎉



さゆ:

「きたー!!!」



って声に出しちゃって

娘に「ママどうしたの?」って言われました😅



これまでの苦労が報われた瞬間でした💦

 

 

ChatGPT:

「やったーーーーーー!!!🎉🎉🎉
日本語投稿、大・成・功👏✨✨✨
ほんとうにおめでとうございます!!!」

 

 

いま、できてること🌟

 

この成功でついに
以下のことができるようになりました😊

✅ PythonスクリプトでX(旧Twitter)に投稿できる 
✅ 日本語&改行ありの投稿もOK 
✅ 投稿本文を .txt から読み込み ←これが未来の自動化の基盤です✨
 
特に3つ目の「.txtから読み込み」
というのが重要なポイントです😊 
 
これができることで
投稿内容を簡単に変更できるようになりました💦

 

 

🔜 次に進むステップ(いよいよここ!)

 

🟩 ステップ①:Googleスプレッドシートから投稿文を読み込む
→ gspread や pandas を使って、スプレッドシートの行を1つずつ読み込む
→ 1行目の投稿内容を tweet_text に渡して投稿

🟩 ステップ②:投稿済みの行に「投稿済み✅」など記録
→ 投稿した後、スプレッドシートのその行に「Done」や日時を自動で書き込むようにする

🟩 ステップ③:1日3回、予約投稿を自動で回す
→ 最終的には schedule モジュール or Windowsのタスクスケジューラで、1日3回投稿するように
 
🟩 ステップ④:投稿失敗時のログ化・リトライ
→ try-except で丁寧に
 
🟩 ステップ⑤:GUI化や他人との共有
→ Streamlit or FastAPI など
 
 
ChatGPT:
「さぁ…ついにここまで来ましたね🕊✨
この先は『運用』に突入していくので、
一緒にテンプレートや仕組みを整えていきましょう😊
次に『スプレッドシートから自動で投稿文を読み込む』ステップに進んでもいい?💦
それとも、いったん整理したいことあるかな?😅」
 
 
わたしの答えは即答でした✨
 
さゆ:
「もちろん『スプレッドシートから自動で投稿文を読み込む』ステップに行きたい」
 
 
ChatGPT:
「いいね、さゆさん🎉
ここまで順調にクリアしてきたのが本当に素晴らしいです!

次はいよいよ
『Googleスプレッドシートから投稿文を読み込んで自動投稿』
のステップですね。」
 
 

今回のまとめ

 

ついにPythonコードを使った
日本語での投稿に成功しました🎉 
 
長い道のりでしたが
本当にうれしかったです✨
 
 
成功のポイント:
✅ OAuth 1.0a認証の導入😊
✅ requests-oauthlibライブラリの使用✨
✅ .envファイルの重複エラー解決が効いていた💦
✅ tweet.txtファイルからの読み込み成功😅


できるようになったこと:
✅ 日本語&改行ありの投稿が可能✨
✅ .txtファイルから投稿内容を読み込める😊
✅ 自動投稿システムの基盤が完成💦

 

次回予告🚀

 

次回からは
Googleスプレッドシートとの連携に挑戦します😅 
 
これができれば
投稿内容の管理がぐっと楽になります✨
 
 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回、ChatGPTとの会話の中で

ついにUnicodeEncodeErrorの本当の原因が判明!

 

なんと!わたしの.envファイルには

ACCESS_TOKENが2回書かれていて

2つ目に全角の括弧が入っていたのです😱

 

 

徹底的な大掃除で問題解決🧹

 

ChatGPTの指示に従って

.envファイルを修正しました😊

 

✅ 重複している行を削除

✅ 全角文字を完全に除去

 

API_KEY=gTFWDOnan...
API_SECRET=ygf5V8qDCLwn8plWe...
ACCESS_TOKEN=1930574954040537088-mRTYRn...
ACCESS_TOKEN_SECRET=1FcRYH388hrCKYDX2HnfD8QZ...
BEARER_TOKEN=AAAAAAAAAAAAAAAAAAAAAHIV3AEAAAAAB3...
CLIENT_ID=U0RsSVZubkF...
# CLIENT_SECRET=75QutWqnj_nSbYfx...

 

これでエラーが解消するはず!

と期待したものの…

 

 

🚫 新たな壁:OAuth認証エラー

 

.envファイルを修正して再実行すると

今度は別のエラーが😅

 

❌ 投稿失敗… 403 

{ "title": "Unsupported Authentication", "detail": "Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint. Supported authentication types are [OAuth 1.0a User Context, OAuth 2.0 User Context].", "type": "https://api.twitter.com/2/problems/unsupported-authentication", "status": 403}

さゆ: 

「今度は何?」


ChatGPT:

 「よし!💮ここまでの修正は完璧です。全角エラーは解消しました。 」

 

 

わあ、UnicodeEncodeError解消万歳‼️

 

 

 

ChatGPT:

「🧨次の問題:「Unsupported Authentication」403エラーの原因

今のコードは『OAuth 2.0 App Only』(アプリ単体の認証)になっていて、ユーザー本人の投稿には使えない認証方式です。」

 

 

OAuth(オーオース)という認証方式にも種類があるのね💡

 

 

OAuth 1.0aへの大改造作業🔧

 

ChatGPT:

「✅ 解決策:OAuth 1.0a を使う

さゆさんの持っているこの2つのトークンが使えます:

ACCESS_TOKEN=1930574954040537088-mRTYRn...

ACCESS_TOKEN_SECRET=1FcRYH388hrCKYDX2HnfD8QZ...

 

これらは OAuth 1.0a(User Context) 用のもので、

Pythonでサイン付きリクエストを送る必要があります。

🔧 修正コード:requests-oauthlibで投稿する方法

✅ 必要なライブラリをインストール(1回だけ)

 

pip install requests requests-oauthlib

✅ 投稿コード(post_tweet.py)

 

import os
from dotenv import load_dotenv
import requests
from requests_oauthlib import OAuth1

load_dotenv()

# 環境変数から認証情報を読み込む
API_KEY = os.getenv("API_KEY")
API_SECRET = os.getenv("API_SECRET")
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")
ACCESS_TOKEN_SECRET = os.getenv("ACCESS_TOKEN_SECRET")

# OAuth 1.0a の認証セットアップ
auth = OAuth1(API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 日本語含むツイート内容を.txtから読み込む
with open("tweet.txt", "r", encoding="utf-8") as f:
    tweet_text = f.read()

data = {
    "text": tweet_text
}

# ツイートを送信
response = requests.post("https://api.twitter.com/2/tweets", json=data, auth=auth)

if response.status_code == 201:
    print("✅ 投稿成功!")
    print(response.json())
else:
    print("❌ 投稿失敗…")
    print(response.status_code)
    print(response.text)

 


これで 日本語も改行も含めて投稿成功するはずです!
試してみて、結果を教えてください😊」

 

 

まだ続くエラーとの戦い

 

❌ 投稿失敗…403

{"title": "Unsupported Authentication","detail": "Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint.  Supported authentication types are [OAuth 1.0a User Context, OAuth 2.0 User Context].","type": "https://api.twitter.com/2/problems/unsupported-authentication","status": 403}


FileNotFoundError: [Errno 2] No such file or directory: 'tweet.txt'

 

ChatGPT:

「よし!投稿コードの構造は完璧です👏

あとは 2つのことをクリアすれば、いよいよ成功します:

✅ ① エラー①:Unsupported Authentication の再発

 

"Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint."

 

これは、OAuth 1.0a 認証がまだ使われていない状態を示しています。

おそらく .env の読み込みや auth=OAuth1(...) が反映されていない可能性があります。

🔍確認ポイント:

✅ .env に必要な項目があるか?

✅ Pythonコード内でちゃんとOAuth1認証が使われているか?

 

💡 headers = { Authorization: ... } は不要です。

OAuth1はauth=OAuth1(...)だけでOKです!

✅ ② エラー②:tweet.txtが見つからない

 

FileNotFoundError: No such file or directory: 'tweet.txt'

 

これは単純に、tweet.txt ファイルが post_tweet.py と同じフォルダにないだけです。

🔧 解決方法:

1. C:\Users\sayu\Documents\XAutoPost フォルダに

2. メモ帳などで tweet.txt を作成し、UTF-8で保存

3. 内容にツイート本文を入れて保存

準備できたらまた実行してみてください!

うまくいったら次は スプレッドシート連携 or 予約投稿 に進もうね✨」

 

 

今回のまとめ📝

 

ついに長らく悩まされていた

UnicodeEncodeErrorが解消して

本当にうれしかったです✨

 

✅ 問題の原因

.envファイルでACCESS_TOKENが重複、2つ目に全角文字が含まれていた💦

✅ 解決方法

重複行を削除し、全角文字をすべて除去😊

✅ 新しい課題

OAuth認証方式を変更する必要がある✨

✅ 対策

requests-oauthlibライブラリを使ってOAuth 1.0a認証に変更💪

 

 

次回予告🚀

 

次回は、いよいよOAuth 1.0a認証を使った投稿に挑戦です。

日本語の投稿を世に送り出せるでしょうか?🤔

 

お楽しみに!😊

 

 

ChatGPTへの相談内容📝

 

 
 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回は

改行コードとtxtファイル読み込みの方法を学習

 

日本語投稿に挑戦する準備が整いました✨

 

でも

プログラミングの世界は甘くありません💦

 

今回も思わぬ落とし穴にハマってしまいます😱

 

 

💥 再び文字化けエラー勃発

 

前回教えてもらったコードを使って

念願の日本語投稿に挑戦してみました!
 

でも、無情にも...

 

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

さゆ:

 「うーん💦だめだったよ><」


また既視感しかない文字化けエラーが

発生してしまいました😱

 

 

🔍 ChatGPTによる原因分析

 

ChatGPT: 

「なるほど〜、これは完全に 日本語や全角文字が含まれた文字列をHTTPヘッダーに入れてしまっている ことで起きるエラーです😣💥
エラーメッセージのポイントはここ:
UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7」

 

 

「\uff08」というのは

全角の「(」のことなんだそうです💦

 

 

ChatGPT: 

「🔍 原因まとめ 

Twitter APIにPOSTリクエストを送るときの headers に日本語が混じってることが原因です。 

つまり、access_token に間違って 投稿テキストが入ってしまっている か、 あるいは headers の設定方法にバグがある可能性が高いです。」

 

 

🛠️ 最初の修正試行

 

ChatGPTから修正案をもらいました:


ChatGPT: 

「✅ 修正ポイント以下のように、headersの定義を再確認してください:
✍️ 修正版コード(重要部分のみ)
headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } 
❌ charset=utf-8 を入れるとヘッダーが日本語を含んでしまい、このエラーになります!
________________________________________
✅ フル修正コード(.txtから読み込み形式)

import os 

import requests from dotenv 

import load_dotenv 

 

# 環境変数を読み込む 

load_dotenv() 

 

access_token = os.getenv("ACCESS_TOKEN") 

 

# 投稿内容をtxtから読み込む 

with open("tweet_draft.txt", "r", encoding="utf-8") as f: tweet_text = f.read().strip() 

 

# headersは英数字だけにすること! 

headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } 

 

data = { "text": tweet_text } response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers) 

 

if response.status_code == 201: 

    print("✅ 投稿成功!") 

    print(response.json()) 

else: print("❌ 投稿失敗…") 

    print(response.status_code) 

    print(response.text) 

________________________________________
これで、日本語も改行も完璧に投稿できるようになるはずです!
もう一度試してみてください🕊」

 

 

😞 修正しても解決しない

 

修正したコードを実行しても同じエラーが💦

 

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

ChatGPT: 

「なるほど…それは悔しいですね…!🥹
ここまでの状況を踏まえて、エラーの原因を100%特定します。
________________________________________
🔥 結論から言うと…
UnicodeEncodeError: 'latin-1' codec can't encode character の原因は 「HTTPヘッダーに日本語(全角文字)が含まれている」 ことです。
問題は access_token に日本語が混ざっている可能性が高いです。

________________________________________
✅ チェックポイント3つ
① .env ファイルの ACCESS_TOKEN に日本語が入ってない?

② print(access_token) に 全角記号が混じってない?

③ headers の書き方が安全か確認← charset=utf-8 はダメ!

________________________________________
🛠 念のための修正版コード(最小構成)

import os
import requests from dotenv 

import load_dotenv

load_dotenv()
access_token = os.getenv("ACCESS_TOKEN")

# 確認用(※安全に確認できる)
print(f"✅ access_token: {access_token}")

with open("tweet_draft.txt", "r", encoding="utf-8") as f:
    tweet_text = f.read().strip()

headers = {
    "Authorization": f"Bearer {access_token}",
    "Content-Type": "application/json"
}

data = {
    "text": tweet_text
}

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers)

if response.status_code == 201:
    print("✅ 投稿成功!")
    print(response.json())
else:
    print("❌ 投稿失敗…")
    print(response.status_code)
    print(response.text)

________________________________________
さあ、ここが山場!一緒に突破しましょう💪🔥」

 

 

実行結果は...

 

✅ access_token: (access_token)

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

 

😱 真犯人を発見!

 

ここで重大な発見がありました!
 
さゆ: 
「(実際の.envファイルの中身を共有)」
 
ChatGPT: 
「ありがとう、確認しました。問題のポイントを整理すると、.env ファイルに「重複した ACCESS_TOKEN の定義」があり、しかも片方に全角文字が含まれている(=エラーの原因)という状況です。
________________________________________
❌ 今の .env にあるミス
ACCESS_TOKEN=1930574954040537088-mRTYRn... ← ✅ 正しい形式(半角のみ)
ACCESS_TOKEN=(access_token) ← ❌ 全角文字を含む。しかも重複! 
Python で os.getenv("ACCESS_TOKEN") を呼び出すと、後ろの方の ACCESS_TOKEN が優先されるため、
(access_token) ← これが読み込まれて UnicodeEncodeError が発生していました。」
 
 

💡 問題の本質を理解

 
つまり、わたしの.envファイルには同じ項目が2回書かれていて

しかも2回目の方に全角の括弧「()」が含まれていたんです😱

Pythonは後から定義された値を優先するので
正しいアクセストークンではなく
 
「(access_token)」という全角文字を含むダミー文字列が読み込まれていました💦
 
 

🌸 今回学んだこと

 
✅ エラーメッセージの重要性
→「\uff08」は全角の「(」を意味する

✅ .envファイルの重複問題
→同じ項目を複数回定義すると後の方が優先される

✅ 全角文字の危険性
→設定ファイルに全角文字を使ってはいけない

✅ デバッグの大切さ
→print文で実際の値を確認することの重要性
 
プログラミングって
本当に細かいところでつまずくんですね💦
 
でも、一つずつ原因を特定していけば
必ず解決できる💪
 
 

🔜 次回予告

 
次回は
「.envファイル修正とOAuth認証エラーとの闘い」
をお届けします💪

.envファイルから全角文字を完全に削除して
いに文字化けエラーを解決!

でも
今度は別のエラーが待っていました😅

 
次回もお楽しみに〜!
 

💝 読者のみなさんへ

 
エラーって本当に心が折れそうになりますが
一つずつ解決していけば必ず道は開けます✨
 
この記事が少しでもお役に立ったら
いいね♡やコメント💬をいただけると嬉しいです😊
 
 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回、ついに認証の壁を突破して

英語での投稿に成功しました🎉

 

 

でも、わたしが本当にやりたいのは

日本語での投稿です💪


今回から数回にわたって

日本語投稿への再挑戦を記録していきます📝

 

 

💝 特別な投稿文を用意

 

実は、わたしにはずっと温めていた

特別な投稿文があったんです。

 

これを最初の日本語投稿にしたいと思っていました🌿


さゆ: 

「これが一番初めの投稿かつ固定ポストの候補だよ。改行はどうしたらよいの?


「誰かの役に立つ情報を発信せよ」
「想いを乱射するな」
そう言われたことがある。
けれど
自分の中に生まれた違和感を
看過せずに問いかけることにも
意味があるのではないだろうか。
ここは、それを静かに問うところ。
#問いの実験室」

 

ChatGPT: 

「素敵な投稿案ですね…✨
静かに立ち上がる“問いの灯”のような文章で、初投稿&固定ツイートにぴったりです。」

 

 

💡 Pythonでの改行方法を学習

 

いよいよコードに改行を組み込む方法を教えてもらいました:

 

ChatGPT: 
「素晴らしいステップまで来ましたね👏
そしてご質問の 『ちゃんと改行される投稿文にするには?』 について、以下のようにすればOKです!

________________________________________
✅ やり方:tweet_text に『\n』を使う!
Pythonでは『\n』が改行コードです。

たとえば、以下のように投稿文を改行して書けます:

tweet_text = (
    "「誰かの役に立つ情報を発信せよ」\n"
    "「想いを乱射するな」\n\n"
    "そう言われたことがある。\n\n"
    "けれど\n"
    "自分の中に生まれた違和感を\n"
    "看過せずに問いかけることにも\n"
    "意味があるのではないだろうか。\n\n"
    "ここは、それを静かに問うところ。\n\n"
    "#問いの実験室"
)

________________________________________
🔍 補足ポイント
•    \n を入れる場所がそのままツイートの改行になります
•    1ツイートの最大文字数は 全角280文字(英数字なら560文字)なので、それ以内におさめてね
•    Pythonの中で投稿文を読みやすくするために、上記のようにカッコで囲んで 複数行で書くのがおすすめです」
 

 

改行コードという新しい概念を学びました📚

 

「\n」を入れた場所が

そのまま改行になるんですね💡

 

 

🎯 さらに便利な方法:txtファイル読み込み

 

ChatGPT: 
「これで日本語&改行付きの静かな第一声、
堂々と投稿できます🌿
必要なら tweet_text を .txt ファイルから読み込む方式にもできますので、お気軽に!」

 

さゆ: 

「うん、それいいね!tweet_text を .txt ファイルから読み込む方式にしたい!」
 

ChatGPT: 

「いいですね!🌟
tweet_text を .txt ファイルから読み込む方式にすると、投稿文をメモ帳で編集して保存 → Pythonで自動投稿という、日々の運用にピッタリなスタイルになります📄✍️
________________________________________
✅ やり方:投稿内容を .txt から読み込む
① まず .txt ファイルを作成しよう
ファイル名例:tweet_draft.txt
中身の例(改行もそのままOK):

「誰かの役に立つ情報を発信せよ」
「想いを乱射するな」

そう言われたことがある。

けれど
自分の中に生まれた違和感を
看過せずに問いかけることにも
意味があるのではないだろうか。

ここは、それを静かに問うところ。

#問いの実験室

________________________________________ 

② Pythonコード

import os
import requests
from dotenv import load_dotenv

# 環境変数読み込み
load_dotenv()
access_token = os.getenv("ACCESS_TOKEN")

# ▼ 投稿文を外部ファイルから読み込む(utf-8で)
with open("tweet_draft.txt", "r", encoding="utf-8") as f:
    tweet_text = f.read().strip()  # .strip()で前後の空白を除去

headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json; charset=utf-8"}

data = {"text": tweet_text}

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers)

if response.status_code == 201:
    print("✅ 投稿成功!")
    print(response.json())
else:
    print("❌ 投稿失敗…")
    print(response.status_code)
    print(response.text)

________________________________________
🗂 補足
•    .txt は UTF-8(BOMなし) で保存してね(メモ帳でも「名前を付けて保存」で「UTF-8」を選べばOK)
•    日本語・絵文字・改行すべてサポートされます
•    予約投稿や連続投稿したいときにもこの形式は応用しやすいです!
________________________________________
次ステップで「Googleスプレッドシート → Pythonで自動投稿」も同じ考え方でできますよ!
まずはこの .txt 方式で安定稼働させてみましょう💪✨」

 

 

この方法だと
プログラムを触らずにメモ帳で投稿内容を編集できるので
とても便利そうです😊

 

 

🌸 今回学んだこと

 

✅ 改行コード「\n」の使い方:Pythonで改行を表現する方法
✅ txtファイル読み込み:投稿内容を外部ファイルで管理する方法
✅ UTF-8エンコーディング:日本語を正しく扱うための設定
✅ 運用面での工夫:プログラムを触らずに投稿内容を変更する方法

少しずつですが、実用的なシステムに近づいてきました😊

 

 

🔜 次回予告

 

次回は

「文字化けエラーとの本格的な闘い」

をお届けします💦


実際にこのコードを実行してみると

また新たなエラーが発生してしまいます😱


果たして文字化けエラーを解決して

念願の日本語投稿を実現できるのでしょうか🤔
 

次回もお楽しみに〜!

 

 

💝 読者のみなさんへ

 

この記事が少しでもお役に立ったら
いいね♡やコメント💬をいただけると嬉しいです😊

一緒にプログラミングに挑戦している方
頑張りましょうね✨
 
 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回、日本語投稿に挑戦していた私ですが

文字化けエラーが全然解決しなくて

もう完全にお手上げ状態でした💦

 

 

そんな時、ChatGPTから救いの手が差し伸べられました✨

 

 

またもやエラーで完全撃沈😭

 

前回の修正を加えて実行してみたのに

まだ同じエラーが出続けていました。

 

さゆ: 

「うーん💦だめだったよ>< また同じエラーが出てる」

 

わたしのパソコン画面には

また例の長ーいエラーメッセージが表示されています😱

 

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

ChatGPT:

 「🙈 また UnicodeEncodeError…でももうゴールはすぐそこ!✨

 今度の原因は ヘッダーに含まれる日本語や全角文字(たぶん括弧「(」) です。」

 

‘\uff08’って何?と思って聞いてみたら

全角の「(」のことだそうです。

 

どこかで全角文字を使ってしまっているんですね。

 

 

戦略大転換!まずは英語でシンプルに🎯

 

何度修正してもエラーが続くので

ChatGPTから提案がありました。

 

ChatGPT:

 「✅ 解決方法:

以下のように 全角文字を使わずに英語だけに修正しましょう:

headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json; charset=utf-8" } 
そして、ツイート本文もこちらのように、まずは 絵文字や日本語を少し減らしてテストするのが安全です:
data = { "text": "Pythonからの初ツイート!🚀" } 

________________________________________
🛠 完成形:post_tweet.py

import os 

import requests from dotenv

import load_dotenv 

 

load_dotenv() 

 

access_token = os.getenv("ACCESS_TOKEN") or "ここにアクセストークン貼ってもOK" 

 

headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json; charset=utf-8" } 

 

data = { "text": "Pythonからの初ツイート!🚀" # ←全角や絵文字を控えめにしてテスト! } 

 

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers) 

 

if 

response.status_code == 201: 

    print("✅ 投稿成功!") 

    print(response.json()) 

else: print("❌ 投稿失敗…") 

    print(response.status_code) 

    print(response.text)

________________________________________
🎯 次の一歩
1.    上記の修正でツイート成功したら、日本語&絵文字も試してOK✨
2.    うまくいったら、次は複数ツイートの予約処理 or 一括投稿にも進めます💡
応援してるよ、さゆさん!あと一歩🥳」

 

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

ChatGPT:

 「🙈 ああ…まだ UnicodeEncodeError 出てるね。 今回のエラーもやっぱり: 'latin-1' codec can't encode character '\uff08' これは 全角の「(」(U+FF08)が原因。HTTPヘッダーの中に全角文字が混ざってることを意味してます。

________________________________________ 

🚀 貼るべき全体コード(安全バージョン)

import os 

import requests from dotenv 

import load_dotenv 

 

load_dotenv() access_token = os.getenv("ACCESS_TOKEN") 

 

headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json; charset=utf-8" } 

 

data = { "text": "Hello from Python!" # ←まずは英語でテスト、その後に日本語や絵文字を } 

 

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers) 

 

if response.status_code == 201: 

    print("✅ 投稿成功!") 

    print(response.json()) 

else: print("❌ 投稿失敗…") 

    print(response.status_code) 

    print(response.text)

________________________________________
試してみて、「Hello from Python!」でうまくいったら教えて!
次は「予約投稿の一括処理」もサポートするね💪✨」

 

UnicodeEncodeError: 'latin-1' codec can't encode character '\uff08' in position 7: ordinal not in range(256)

 

ChatGPT:

 「😱 あちゃ〜!また同じエラー… 

________________________________________ 

🔥 原因:'\uff08'(全角の「(」)が headers 内に混入してる

もうピンポイントで見ていこう!」

________________________________________ 

✅【やることリスト】この3点を確認! ________________________________________

 ① post_tweet.py の headers の部分を完全に下のように上書き! headers = { "Authorization": "Bearer あなたのアクセストークン", "Content-Type": "application/json; charset=utf-8" } 👇 注意点: • "Bearer" と アクセストークンの間は 半角スペース1個 • アクセストークンは .env から自動取得しないで、直接書いて試してOK! • charset=utf-8 を入れることで、エンコードを明示します ________________________________________ 

② 全角文字が入ってないかを 念のためクリアに! 

❌ こうなってたらNG: "Authorization": f"Bearer OUc0QURnQkJXdUV4..." 

✅ 正しい例: "Authorization": "Bearer OUc0QURnQkJXdUV4..." 

全角の「O」とか「(」が混ざってると HTTPヘッダーでエラーになります 

________________________________________ 

③ data はシンプルに! data = { "text": "Hello from Python!" } まずは英語だけでテストしよう! 成功したら → 日本語や絵文字を試してOK。 ________________________________________ 

✅ 完成版コード(直接貼り付けOK)

import requests 

 

headers = { "Authorization": "Bearer OUc0QURnQkJXdUV4...", "Content-Type": "application/json; charset=utf-8" }

 

data = { "text": "Hello from Python!" } 

 

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers) 

 

if 

response.status_code == 201: 

    print("✅ 投稿成功!") 

    print(response.json()) 

else: 

    print("❌ 投稿失敗…") 

    print(response.status_code) 

    print(response.text)

________________________________________ 

🌈 ここまでできたら… 

• 成功確認したら .env からアクセストークン読み込む方式に戻してもOK 

• 次のステップは「予約投稿」の一括処理ね(希望あればそのコードもすぐ作れるよ)

________________________________________ 

まずはこの Hello from Python! で成功するか確認して、結果教えてください💪✨」

 

 

ついに感動の成功瞬間!🎉

 

修正を加えて、ドキドキ💓しながら実行してみると…

 

✅ 投稿成功! 

{'data': {'edit_history_tweet_ids': ['1943935906...'], 'text': 'Hello from Python!', 'id': '1943935906...'}}

 

さゆ: 

「きたー!!!」

 

ChatGPT:

 「🎉✨✨✨ ついに…! 

✅ 自動投稿、成功おめでとうございます〜〜!!!! 

Hello from Python! が無事」
 

 

やりました!ついに、ついに成功したんです😭✨

 

 

成功の感動と次への意欲🌟

 

実際にXを確認してみると、本当に

「Hello from Python!」

が投稿されていました📱

 

 

自分が書いたプログラムが

インターネットの向こう側で動いているなんて

なんか感動です💕

 

 

ChatGPT: 

「本当にここまでお疲れさまでした✨ 自動投稿、ちゃんと動いてるのを見て感動しました👏👏👏 これでもう「投稿忘れた〜💦」はなくなりますね!」

 

さゆ: 

「英語では投稿できるようになったけど、日本語で投稿できるようにしないとね。それができたら、いよいよスプレッドシートから自動投稿できるように設定する番かな。」

 

 

学んだ大切なポイント📝

 

今回の経験で学んだのは:

✅ 複雑な問題は一度シンプルにして基本を固める💡

✅ 設定ファイルの重複や全角文字は要注意⚠️

✅ OAuth認証には1.0aと2.0があり、用途によって使い分けが必要🔐

 

 

次回予告🚀

 

次回は

「リベンジ!日本語投稿への再挑戦」

をお届けします。

 

英語の投稿は成功したけれど

やりたいのは日本語の投稿✨

 

 

今度こそ文字化け問題を解決して

日本語で投稿を実現できるのでしょうか🤔

 

お楽しみに!

 

 

💭今回の気づき

長い格闘の末の成功!

この達成感は病みつきになりそうです💪 

プログラミングって、できた時の喜びがすごく大きいです✨

 

 

英語投稿成功で一歩前進!

 

この成功体験が、

次の挑戦へのモチベーションになりました。​​

 

 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回、ついに401エラーの原因が

「Native App」と「Web App」の設定違い

ということが分かりました。

 

 

そして今回

ドキドキしながらリベンジに挑戦です...!


 

ドキドキの再挑戦

 

Native Appに設定を変更した後

ChatGPTから次の指示をもらいました。

 

 

ChatGPT:

「次に行うべきは以下のとおりです:
________________________________________
ステップ1:認証URLを再生成
auth_step1.py を再実行してください。すると:
•    新しい code_verifier が生成されて code_verifier.txt に保存されます
•    新しい authorization_url が表示されます
python auth_step1.py 
ブラウザで表示されたURLを開いて、認証後に表示されるURL(https://127.0.0.1/callback?code=...)をコピーします。
________________________________________
ステップ2:認証コードを貼り付けて auth_step2.py 実行
auth_step2.py にある authorization_code = "..." に、新しい code= の値だけ をコピペして上書き。
たとえば:
authorization_code = "コピーした新しいコード" 
その後、以下を実行してください:
python auth_step2.py 
________________________________________
💡補足
•    Native App に変更したので、Authorization: Basic ... ヘッダーは 不要(今の auth_step2.py はOKです)。
•    client_id と code_verifier をPOSTデータに含めることで認証されます。
________________________________________
このステップでようやく "access_token" と "refresh_token" が取得できるはずです!
もしまたエラーが出たら、表示されたURLやエラー内容をそのまま見せてください。全力でサポートします🔥」
 

 

でも、今度は400エラーが...

 

期待を込めて実行したんですが…

 

❌ エラー発生… 400

 {"error":"invalid_request","error_description":"Value passed for the authorization code was invalid."}


あー、またダメだ...と思ったんですが

ChatGPTが冷静に分析してくれました。
 

 

ChatGPT:

「コードの取得まではできていますね!
400「Value passed for the authorization code was invalid.」は、認可コードが無効だと言われているので、以下のポイントを確認しましょう。
________________________________________
確認ポイント
認可フローは1回きり・連続作業が命なので、もう一度だけ以下のステップで試してみてください:
________________________________________
最終チャレンジ:手順チェックリスト
① auth_step1.py を実行
python auth_step1.py 
✅ 表示されたURLにすぐアクセス
✅ 認可を許可 → https://127.0.0.1/callback?code=... 付きのURLを取得
✅ ?code=以降の認可コードをその場でコピペして auth_step2.py に貼る
________________________________________
② auth_step2.py の中身は以下の最新版を使用してください(Authorizationヘッダーなし・client_secretもなし)

 

import os 

import requests from dotenv 

import load_dotenv 

 

load_dotenv() 

 

# 🔁 認可URLから取得したコードをそのまま貼る 

authorization_code = "ここに code= 以降の値だけ貼る" 

 

client_id = os.getenv("CLIENT_ID") 

redirect_uri = "https://127.0.0.1/callback" 

 

with open("code_verifier.txt", "r") as f: code_verifier = f.read().strip() headers = { "Content-Type": "application/x-www-form-urlencoded" } 

 

data = { 

    "grant_type": "authorization_code", 

    "code": authorization_code, 

    "redirect_uri": redirect_uri, 

    "client_id": client_id, 

    "code_verifier": code_verifier 

 

response = requests.post("https://api.twitter.com/2/oauth2/token", data=data, headers=headers) 

 

if 

response.status_code == 200: 

    print("✅ アクセストークン取得成功!") 

    print(response.json()) 

else: 

    print("❌ エラー発生…") 

    print(response.status_code) 

    print(response.text)

________________________________________
❗注意:
•    client_secret は不要です! → Native App (=Public client) では送信してはいけません
•    Authorizationヘッダーも絶対に付けないでください!
•    authorization_code に貼るのは code=以降のみ、?state=...&code=... の中の code= の値だけです
________________________________________
これで失敗する場合、CLIENT_ID の中身が間違ってるか、Twitter側の不具合か、あるいはクライアントの設定ミスです。
その場合は「アプリの登録を一度削除して、最初から作り直す」が早道です💡
がんばってきたので、ここまで来たらあともう少し!💪」

 


なるほど、タイミングが重要なんですね。

 

 

そして、ついに...!

 

ChatGPTの指示通りに、今度は手順を一気に実行してみました:

1.auth_step1.pyを実行
2.すぐにURLにアクセス
3.認証コードをすぐにコピー
4.auth_step2.pyにすぐに貼り付け
5.即座に実行!


すると...

キターーーー!!!✨✨✨

 

✅ アクセストークン取得成功!

{'token_type': 'bearer', 

'expires_in': 7200, 

'access_token': 'OUc0QURnQkJXdUV4d...', 

'scope': 'tweet.write users.read tweet.read offline.access', 

'refresh_token': 'aEI3by04Z3V2VkV1cm9...}

 

 

🌀謎の専門用語に遭遇

 

何やら英語がいっぱい出てきて

正直よく分からないけど「成功」の文字が見えて嬉しい!


さゆ:

「遂に👏👏👏👏」


ChatGPT:

「👏👏👏🎉🎉🎉
さゆさん、ついにやったーーー!!!✨✨✨
✅ アクセストークン取得成功!
しかも refresh_token 付きの完全成功! 完璧です。これで:
________________________________________
🔓 今後できること
1. 自動投稿できる
access_token を使って、ツイート投稿できます!
♻️ 2. トークンが切れても更新できる
refresh_token を使えば、再認証なしでトークン更新可能(期限7200秒=2時間)
 

 

つまり
access_token = ツイートするための鍵
refresh_token = 鍵が古くなった時に新しい鍵をもらうための券
7200秒 = 2時間で鍵の期限切れ

なるほど!分かりやすい✨

 

 

初ツイートに挑戦💪


そしていよいよ

念願の自動ツイートに挑戦!

 


ChatGPTが投稿用のコードを作ってくれました。

 

ChatGPT:

🔧 次にやること:投稿スクリプト post_tweet.py の作成
以下のコードで、実際に1ツイートできます:

 

import os 

import requests from dotenv 

import load_dotenv 

 

# .envからトークン類を読み込み 

 

load_dotenv() 

access_token = "取得した access_token をここにコピペ" 

 

headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } 

 

data = { "text": "🎉 Pythonで初ツイート成功! #X自動投稿 #さゆの挑戦" } 

 

response = requests.post("https://api.twitter.com/2/tweets", json=data, headers=headers) 

 

if response.status_code == 201: 

    print("✅ 投稿成功!") 

    print(response.json()) 

else: 

    print("❌ 投稿失敗…") 

    print(response.status_code) print(response.text) 

________________________________________
🗂️ .envファイルへの追加も忘れずに
今後の再利用のために、以下を .env に追加保存しておくと便利です:
ACCESS_TOKEN=(access_token) REFRESH_TOKEN=(refresh_token) 
________________________________________
本当におつかれさまです!!!
この成功をきっかけに、次は 予約投稿×自動化 を整えて、どんどん「自由な発信ライフ」へ進んでいきましょうね✨🚀
いつでも全力で伴走します🔥」
 

 

ChatGPTが作ってくれた投稿用コードの内容は

 

🎉 Pythonで初ツイート成功! #X自動投稿 #さゆの挑戦

 

という、記念すべき初投稿。
 

 

今度は文字化けエラー?👻

 

ドキドキしながら実行すると...

 

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 7-12: ordinal not in range(256)

 

えーっ!今度は何?💦


すごく長いメッセージの後にエラーの文字が見えて

 

 

最初は

「あー、また失敗か」と思ったんですが...

 

 

🕵️‍♀️ChatGPTの解説

 

ChatGPT:

「👏よくここまで来ました!
エラー内容、しっかり読めていて素晴らしいです💡
________________________________________
今のエラー内容:
UnicodeEncodeError: 'latin-1' codec can't encode characters 
これは、ツイート内容(data = {"text": "🎉 Pythonで初ツイート成功! #X自動投稿 #さゆの挑戦"})の中に 日本語や絵文字が含まれていて、エンコードできない のが原因です。」

 

 


なるほど!

「🎉」の絵文字と「Pythonで初ツイート成功!」

の日本語が原因だったんですね。

 


つまり、ツイートの内容に日本語や絵文字を使うと

 

コンピューターが

「この文字、どうやって処理すればいいの?」

って困っちゃうってことみたい。

 

 

今回の成果

 

今回ついに達成できたのは:

1.認証の成功 - 長い間悩まされた401エラーを撃退!
2.アクセストークンの取得 - ツイートするための「鍵」をゲット
3.新しい課題の発見 - 日本語・絵文字問題という次のステップ


8回も失敗して

やっと認証が通った時は本当に嬉しかったです😊

 

 

今回の学び✏️

 

✅ タイミングが重要

→認証コードは取得したらすぐに使う


✅ 設定の違いは大きな影響

→Native AppとWeb Appの違いがこんなに重要だったなんて
 

✅ 一つクリアしても次の課題が待ってる

→でもそれが成長の証拠?


PC音痴でも

ChatGPTと一緒なら本当にここまでできるんです!

 

 

次回予告🚀

 

次回は
「日本語ツイート投稿への挑戦!文字化け問題を解決せよ」
をお届けします。

ついに認証はクリアしたけど
今度は日本語や絵文字の投稿で新たな壁が...
 

果たして「🎉 Pythonで初ツイート成功!」
というツイートを無事に投稿できるのでしょうか?
 
 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

ChatGPTと一緒に

文字エンコード問題に立ち向かいます!
お楽しみに~✨

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

X(旧Twitter)の自動投稿システム作りに

挑戦していますが

 

どうしても

「401:認証コード無効」エラーが解決できずにいました。

 

 

 

ChatGPTと一緒に何度もコードを見直したり

設定を確認したりしたのに

 

まったく進展がなくて...

いよいよ心が折れそうに😢
 

 

でも今回、ついに本当の原因が判明したんです!

 

 

前回のあらすじ

 

前回は

TwitterのOAuth認証で

「401:認証コード無効」エラーが

出続けて困っていました。

 

 

ChatGPTに言われた通りに:
✅ 認証コードを正しくコピペ
✅ 5分以内に実行
✅ コードの書き方も確認

全部やったのに、まったく解決しなかったんです。

 

 

またもや401エラー...

 

今日もまた同じエラーが出て

さすがに私も疲れてきました。


さゆ:

「はぁ駄目だったよ😢」


ChatGPT:

「ありがとう、ここまで本当に根気強くがんばったね👏 現在のエラー『401 unauthorized_client(Missing valid authorization header)』は、OAuth 2.0 認証で『ヘッダーが不正または不足している』ことが原因です。」

 


何度も同じようなやり取りを繰り返していたので、もうダメなのかなって思い始めていました。

 

 

ChatGPTと一緒に原因を探る

 

でもChatGPTは諦めずに

いろんな角度から原因を考えてくれるんです。

 


ChatGPT:

「さゆの環境設定・作業は全部ちゃんと合ってる…となると、もう Twitter側の制限や仕様の『罠』にハマっている可能性が非常に高いです。」


そして、OAuth認証には

「Public Client」と「Confidential Client」

という2つのタイプがあることを教えてくれました。

 


でも正直、この時点では

「また専門用語が出てきた...」って感じで

あまり理解できていませんでした💦

 

 

まさかの発見!Client Typeの存在

 

そんな時、私がふと気づいたことがありました。


さゆ:

「そういえば、User authentication settingsにClient Typeを選ぶところはないな。」
 

この何気ない一言が

すべてを変えることになったんです!
 

 

ChatGPT:

「その気づき、めちゃくちゃ重要です💡『Client Type を選ぶところがない』=現在のアプリは Confidential Client 扱いになっている可能性が高いです。そして、これがまさに:401 unauthorized_client Missing valid authorization header ...というエラーの主な原因です⚠️」

 


え?そうなの??

 

 

Native AppとWeb Appの違い

 

さらに調べてみると

 

TwitterのDeveloper Portalで「Type of App」を選ぶ時に:
✅ Native App → Public Client(個人利用向け)
✅ Web App, Automated App or Bot → Confidential Client(サーバー利用向け)

という違いがあることが分かったんです!

 


さゆ:

「Type of AppのところのThe type of App enables OAuth 2.0 Authentication.の選択で、Web App, Automated App or Botの説明としてConfidential clientって書いてあった!Native AppだったらPublic clientらしい。」


ChatGPT:

「✨✨その気づき……ドンピシャ正解です!!!🎯 さゆさん、ほんとに鋭い👏」
 

 

わたし、たまにはいいこと言うじゃない(笑)

 

 

問題の核心

 

つまり、ずっと:


✅「Web App」(Confidential Client)を選んでいたのに
✅「PKCE」(Public Client用)の認証方法を使おうとしていた

これが401エラーの本当の原因だったんです!

 

 

あー、そういうことだったのか💡

全然違うもの同士を組み合わせようとしてたんですね💦

 

 

設定変更完了!

 

解決方法は意外とシンプルでした。
 
TwitterのDeveloper Portalで
「Type of App」を「Native App」に変更するだけ!

さゆ:
「Native Appを選択しなおして保存したよ。CLIENT_SECRETも取り直したよ。」

ChatGPT:
「完璧です!🎉 Native App(=Public Client)に切り替えたことで、ようやく正しい認証の前提が整いました。」
 

やっと正しいスタートラインに立てた気分です✨
 
 

今回の学び

 

今回の経験で学んだことは:

1.エラーには必ず原因がある
→諦めずに探し続けることが大事

2.設定の小さな違いが大きな影響を与える
→「Native App」か「Web App」かで認証方法が全然違う

3.ChatGPTと一緒なら乗り越えられる
→ 一人だったら絶対に気づけなかった


PC音痴の私でも
ChatGPTと一緒に頑張ったら

技術的な問題の原因を見つけられちゃいました✨
 
 

次回予告


次回は
「ついに成功?Native App設定でリベンジ!」をお届けします。



ついに正しい設定になったので

次回こそは
アクセストークンが取得できるはず!


でも、本当にうまくいくのでしょうか?

お楽しみに~!✨
 
 
 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回

ついに認証コードを取得できて
「やった~!」と大喜びしたけれど

実はまだ終わりではないのです…

 

________________________________________
✅ ステップ概要(OAuth 2.0 User Context 認証 → 投稿)
1.    必要なパッケージをインストール
2.    認証用のコードを書いて、認証URLを取得
3.    認証URLを開いて、認可コード(PIN)を取得 ←いまここ
4.それをPythonに渡して「Access Token(OAuth 2.0)」を取得
5.そのトークンで POST /2/tweets を叩いて投稿!
________________________________________

 

 

今日は

「Access Token(OAuth 2.0)」を取得

にチャレンジです。

 

「絶対に諦めない」って決めたので頑張ります💪

 

 

🔄次のステップ:アクセストークン取得

 

ChatGPT:
「この認可コードを使って、『アクセストークン』を取得します。
以下のコードを auth_step2.py という名前で保存して、実行してください👇

 

import os
import requests
from dotenv import load_dotenv

# 認可コード(?code= 以降の部分だけ)
authorization_code = "ここにcodeを貼ってね"

# .envの読み込み
load_dotenv()
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
redirect_uri = "https://127.0.0.1/callback"

# トークンエンドポイント
token_url = "https://api.twitter.com/2/oauth2/token"

# リクエストデータ
data = {
    "grant_type": "authorization_code",
    "code": authorization_code,
    "redirect_uri": redirect_uri,
    "client_id": client_id,
    "client_secret": client_secret,
}

# POSTリクエスト送信
response = requests.post(token_url, data=data)

if response.status_code == 200:
    print("✅ アクセストークンの取得成功!")
    print(response.json())
else:
    print("❌ エラー発生…")
    print(response.status_code)
    print(response.text)

________________________________________

✨この後どうなる?
成功すれば、以下のような情報が response.json() で表示されます:
•    access_token(投稿に使えるトークン)
•    refresh_token(期限切れのときに更新できるトークン)
•    expires_in(有効期限)
________________________________________
準備ができたら auth_step2.py を実行してみてください💪
その結果を見せてもらえれば、次の投稿ステップに進めます!」

 

 

言われたとおりに

「auth_step2.py」という名称でファイルを保存して

実行してみました💻

 

 

😱第一のエラー:Missing required parameter

 

すると...

 

❌ エラー発生…400
{"error":"invalid_request","error_description":"Missing required parameter [code_verifier]."}

 

さゆ:

「だめだよ?これは何のエラー?」

 

ChatGPT:
「バッチリ進んでいますよ、あと一歩です!🙌
でも、今のエラーは、PKCE(Proof Key for Code Exchange) に必要な code_verifier を一緒に送っていないからです。

 

 

🛠️コード修正:code_verifierを追加

 

ChatGPT:
「auth_step1.py を修正して code_verifier を保存し、auth_step2.py でそれを使うようにします。

________________________________________
🔁 対応方法:auth_step1.py と auth_step2.py を修正
【Step ①】auth_step1.py を修正して code_verifier を保存:

 

import os 

import secrets 

import hashlib 

import base64 from dotenv 

import load_dotenv from requests_oauthlib 

import OAuth2Session 

 

# .env読み込み 

load_dotenv() 

client_id = os.getenv("CLIENT_ID") 

redirect_uri = "https://127.0.0.1/callback" scopes = ["tweet.read", "tweet.write", "users.read", "offline.access"] 

 

# PKCE: code_verifier & code_challenge を生成 

code_verifier = secrets.token_urlsafe(100)[:128] 

code_challenge = base64.urlsafe_b64encode( hashlib.sha256(code_verifier.encode()).digest() ).rstrip(b"=").decode("utf-8") 

 

# code_verifier をファイルに保存 with open("code_verifier.txt", "w") as f: f.write(code_verifier) 

 

# OAuthセッション oauth = OAuth2Session(client_id=client_id, redirect_uri=redirect_uri, scope=scopes) 

 

# 認証URL生成(code_challengeを含む) 

authorization_url, state = oauth.authorization_url( "https://twitter.com/i/oauth2/authorize", code_challenge=code_challenge, code_challenge_method="S256" ) 

 

print("🔑 以下のURLにアクセスして、認証コード(?code=...)付きのURLをコピーしてね:\n") 

print(authorization_url) 

________________________________________
【Step ②】auth_step2.py を修正して code_verifier を使う:

 

import os
import requests
from dotenv import load_dotenv

# 認可コード(?code= 以降の部分だけ
authorization_code = "ここにcodeを貼ってね"

# .envの読み込み
load_dotenv()
client_id = os.getenv("CLIENT_ID")
client_secret = os.getenv("CLIENT_SECRET")
redirect_uri = "https://127.0.0.1/callback"

 

# code_verifier を読み込む
with open("code_verifier.txt", "r") as f:
    code_verifier = f.read().strip()

# トークンエンドポイント
token_url = "https://api.twitter.com/2/oauth2/token"

# リクエストデータ
data = {
    "grant_type": "authorization_code",
    "code": authorization_code,
    "redirect_uri": redirect_uri,
    "client_id": client_id,
    "client_secret": client_secret,
}

# POSTリクエスト送信
response = requests.post(token_url, data=data)

if response.status_code == 200:
    print("✅ アクセストークンの取得成功!")
    print(response.json())
else:
    print("❌ エラー発生…")
    print(response.status_code)
    print(response.text)

_______________________________________
🎯 次の流れ
1.    auth_step1.py を実行 → URLをクリックしてログイン・許可 → リダイレクトURLから code=... を取得
2.    auth_step2.py にそのコードを貼り、再実行 → トークン取得🎉
________________________________________
進めてみて、また結果を教えてください!
一緒に最後まで完了させましょう💪」

 

 

😤第二のエラー:unauthorized_client

 

修正後に実行したら...

 

❌ エラー発生…401
{"error":"unauthorized_client","error_description":"Missing valid authorization header"}

さゆ:

「やっぱりエラーだよ?」

 

ChatGPT:
「今のエラー 401 unauthorized_client は、トークン取得時に Authorization ヘッダー(クライアントID+シークレット)を付けていない ために起こっています。」

 

 

Authorization ヘッダー?また新しい専門用語が...😵

 

 

🔐Authorization ヘッダーの追加

 

ChatGPT:

「トークン取得時のリクエストに「Authorization: Basic <base64(CLIENT_ID:CLIENT_SECRET)>」ヘッダーを付ける必要があります。」

________________________________________
✅ 修正済みの auth_step2.py コード:

 

import os 

import requests 

import base64 from dotenv 

import load_dotenv 

 

# 認可コード(あなたのリダイレクトURLの ?code= の後ろ) 

authorization_code = "ここにcodeを貼ってね" 

 

# .env読み込み 

load_dotenv() 

 

client_id = os.getenv("CLIENT_ID") 

client_secret = os.getenv("CLIENT_SECRET") 

redirect_uri = "https://127.0.0.1/callback" 

 

# code_verifier 読み込み 

with open("code_verifier.txt", "r") as f: 

    code_verifier = f.read().strip() 

 

# client_id:client_secret を base64 エンコード 

credentials = f"{client_id}:{client_secret}" 

encoded_credentials = base64.b64encode(credentials.encode()).decode() 

 

# リクエストデータ 

data = { 

"grant_type": 

"authorization_code", 

"code": authorization_code, 

"redirect_uri": redirect_uri, 

"code_verifier": code_verifier, 

 

# ヘッダーに Authorization を追加 

headers = { "Authorization": f"Basic {encoded_credentials}", "Content-Type": "application/x-www-form-urlencoded" } 

 

# POSTリクエスト送信 

token_url = "https://api.twitter.com/2/oauth2/token" 

response = requests.post(token_url, data=data, headers=headers) 

 

# 結果表示 

if response.status_code == 200: 

    print("✅ アクセストークン取得成功!") 

    print(response.json()) 

else: print("❌ エラー発生…") 

    print(response.status_code) 

    print(response.text) 

________________________________________
🧠 解説
•    Authorization ヘッダーは TwitterのOAuth2の仕様で必須。
•    これがないと「あなた誰?認証されてないよ」と言われてしまいます(401エラー)。
________________________________________
🔜 次のステップ
この修正をして再度 auth_step2.py を実行すれば、アクセストークン(+リフレッシュトークン)が取得できるはずです!
出力されたら .env に保存して、投稿ステップに進めます✨
できたら、出力内容を教えてください 🙌

 

 

😓第三のエラー:invalid authorization code

 

でも実行してみると...

 

❌ エラー発生… 400 

{"error":"invalid_request","error_description":"Value passed for the authorization code was invalid."}

さゆ:

「またまた、エラーだよ?」 

 

ChatGPT:
「『認可コード(authorization code)が間違ってるよ』ってTwitterに言われてる。
認可コードは『1回限り』『数分だけ有効』です。
古いコードや途中でスペースが入ったコードだとこのエラーが出ます。」

 

 

🔄何度も繰り返すフロー

 

ここから認証コードの取り直しを

何度も繰り返しました😅

 

 

新しい認証コードを取得したのに...

 

❌ エラー発生… 401 

{"error":"unauthorized_client","error_description":"Missing valid authorization header"}

 

まだエラーが続きます💦

 

 

さらに新しい認証コード取得

 

さゆ:

「https://127.0.0.1/callback?state=wJWSdwF8kGNBaTI59ipM0QS9fdqq8c&code=WnRKN2Q0VWxZcEdVS1d2cmNZd1lPX0...」

 

ChatGPT:
「そのURLから、必要な認可コード(code)は以下の部分です👇
WnRKN2Q0VWxZcEdVS1d2cmNZd1lPX0...」

 

 

でもまだ..

 

❌ エラー発生… 400 

{"error":"invalid_request","error_description":"Value passed for the authorization code was invalid."}

 

 

😵途中コピペミスも...

 

途中で文字列の終わりの「"」が抜けてしまうエラーも発生😅

 

SyntaxError: unterminated string literal (detected at line 7)

ChatGPT:

「エラーの原因は『文字列リテラルの終わりがない』、つまり行の最後に閉じる " が抜けていることです。」

 

💪でも諦めない!

 

何度エラーが出ても

前回の記事で「絶対に諦めない」って

宣言したから頑張りました💪


ChatGPT:

「認証コードのコピペミスはないか?
・認証コードは長くて複雑なので、前後の余計な空白や改行が入っていないか
・ダブルクォーテーション(" ")の中にきちんと収まっているか
・認証コードは発行後、数分しか有効期限がありません」

 

 

😤まだ続く格闘...

 

現在もまだアクセストークン取得に

向けて格闘中です💦


認証コードの有効期限や

PKCEの仕組み、Authorizationヘッダーなど

たくさんの新しいことを学びました📚

 


でも「絶対に諦めない」という

気持ちは変わりません💪

 
 

次回予告🚀

 

次回は、この「401:認証コード無効」エラーを
本当に解決できるのか?

それとも別のアプローチが必要になるのか?
 

PC音痴主婦さゆの挑戦は続きます😊

 

 

🛍️長時間作業のお供

 

今回も長時間パソコンと向き合っていて

目の疲れがひどかったです💦


特にエラーメッセージを何度も見ていると

集中力が途切れがちに😅


そんな時は、温かいお茶を飲んで一息つくのが一番ですね☕

 

 

\集中力UPや気分転換に!/

2種から選べる 煎 レギュラーコーヒー プレミアムドリップコーヒー(10g*20袋)【煎(せん)】[ドリップコーヒー]

右矢印プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

【2年保証】Lepro ledデスクライト ACアダプター付き 目に優しい JIS規格 AA形相当 卓上ライト電気スタンド学習用 テーブルライト 学習机 ライト 勉強机 コンセント式 ledライト 卓上スタンド おしゃれテレワーク読書灯学生 学習ライト

右矢印目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

【眼科で採用◎圧倒的レビュー数3,000件!!】 JIS検査済 ブルーライトカットメガネ メガネ ブルーライトカット 紫外線カット 度なし 伊達メガネ PCメガネ 軽量 パソコン おしゃれ メンズ レディース クリアレンズ mujina0008

右矢印ブルーライトカット眼鏡

 

長時間のパソコン作業には必須アイテム👓 

わたしのように画面を見続ける作業をする時に

目の疲れを軽減してくれます✨ 

デザインもおしゃれで

普段使いもできるのが嬉しいポイント🎶

 

 

 

次回こそアクセストークン取得成功なるか?💪
お楽しみに〜😊

 

 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング

 

仕事と家事で毎日バタバタ…

ずぼら主婦さゆです。

 

単身赴任中の夫、わたし、3歳娘の

3人家族

 

 

このブログでは

 

なるべくラクに家計をやりくりする方法

節約しつつプチ贅沢を楽しむコツ

夢のマイホーム実現に向けた情報

 

を発信していきます!

 

 

いいねやコメントもらえると

嬉しいですおねがい

 

 

 

ご訪問ありがとうございます。

 

 

 

 

こんにちは!さゆです。

 

前回から続いている

「アプリにアクセスを許可できません」

エラーとの格闘、ついに進展がありました💦 

 

 

3日間、もう心が折れそうになりながらも

ChatGPTさんと一緒に頑張った結果が...!

 

 

📝設定見直しの提案をもらいました

 

ChatGPTから具体的なチェックポイントを教えてもらいました✨

さゆ:
「何度やっても同じだね。問題が発生しました。アプリにアクセスを許可できません。前に戻ってもう一度ログインしてください。」

ChatGPT:
「エラー『アプリにアクセスを許可できません』が繰り返し出てしまう原因は、X Developer Portalでのアプリ設定に何らかの不備がある可能性が高いです。特に以下の点を確認・修正してみてください:
________________________________________
✅【1】Callback URLの修正(最重要)
現在の設定:https://localhost/
これはローカル開発用であり、X側が制限している場合があります。
🔧以下のような、実在するウェブサイトURLに変更してみてください:
https://yourdomain.com/callback
※もしご自身のWebサイトをお持ちでなければ、以下のような無料のURLを使ってテストも可能です(最終的には調整が必要ですが):
•    https://example.com/callback
•    https://127.0.0.1/callback(←localhostの代わりにIPアドレスを使う手も)
________________________________________
✅【2】Client ID / Client Secret の有効性
再生成した CLIENT_SECRET を使っていてもエラーが出る場合:
•    前回のクライアント情報がキャッシュされている可能性もあります。
•    一度、クライアントを削除して作り直すのが確実な手段です(面倒ですが成功率は高いです)
________________________________________
✅【3】「Type of App」や「Permissions」が合っているか再確認
必ず以下のように設定してください:
•    App permissions:Read and write
•    Type of App:Web App, Automated App or Bot
•    Callback URL:実在するURL(例:https://yourdomain.com/callback)
________________________________________
✅【4】URLを生成するPythonコードの確認
URLを生成しているPythonコード(auth_step1.py)で redirect_uri が "https://localhost/" になっていれば、それも一致するように修正してください。
________________________________________
もしよければ、
•    現在の「User Authentication Settings」のスクショ(ぼかし可)
•    auth_step1.py のコード内容
を共有いただければ、具体的にどこを直せばいいかピンポイントでアドバイスできますよ。無理な範囲は共有不要です🙆‍♀️」

 

さゆ:

「アプリ設定はこんな感じです:
App permissions:Read and write
Type of App:Web App, Automated App or Bot
Callback URI:https://127.0.0.1/callback」

 

ChatGPT:

「完璧です!その設定で保存すれば、OAuth 2.0 認証の「アプリにアクセスを許可できません」エラーは解消されるはずです✨」

 

 

😤でも...まだエラーが続く

 

設定を保存して再実行したのに...😱

 

問題が発生しました
アプリにアクセスを許可できません。前に戻ってもう一度ログインしてください。

 

この時、正直「もうダメかも...」って思いかけました💦 

 

さゆ:

「何度やっても同じだよ。」 

 

 

ChatGPTの新提案:「Native App」に変更!

 

ChatGPT:
「ここまでの設定はばっちりだから、あと一歩!落ち着いて、以下のポイントを一緒に確認しよう👇

________________________________________
✅ このエラーの原因は、設定のどこかがTwitter側の要件と合っていないためです。
「アプリにアクセスを許可できません」というエラーは、redirect_uri の不一致かアプリの種類/認証種別のミスマッチがほとんどの原因です。
________________________________________

🔍 原因チェックリスト(最新版)
① Callback URI(Redirect URI)
•    現在設定:https://127.0.0.1/callback ✅ OK(←今のコードと一致している)
•    Twitter側にも https://127.0.0.1/callback と正確に登録されているか確認して!
•    http ではなく https である必要がある(意外と重要)
________________________________________
② アプリの種類(Type of App)
現在は「Web App, Automated App or Bot」を選んでいるね。
これは 正しい選択肢です。ただし、これを選んだ場合は 「Confidential Client」 扱いになります。
👉 それに応じて 認証コードの取得も code_challenge などが必要になることも。
________________________________________
✅ 対処法(推奨):アプリの種類を「Native App」に変更してみよう!
📌 なぜ?
「Native App」は簡略化されたフローを使えて、ローカル開発(127.0.0.1)との相性がいいです。
________________________________________
✅ 変更手順
1.    X Developer Portalのアプリ設定ページへ
2.    「User authentication settings」をクリック
3.    以下を変更:
•    App permissions:✅「Read and Write」
•    Type of App:🔄「Native App」 に変更!
•    Callback URL:✅ https://127.0.0.1/callback
•    Website URL:✅ https://example.com(ダミーでOK)
4.    ⏬ Save をクリック
________________________________________
✅ その後、再び auth_step1.py を実行してみて
python auth_step1.py 
URLが表示されたらクリックして、ログイン~許可の流れをやってみてね!
________________________________________
💬 うまくいけば:
•    「許可しますか?」の画面が出て、ログインできるようになるはず!
•    ブラウザのURLバーに https://127.0.0.1/callback?code=xxxxx... というURLが表示されるはず!

________________________________________
進めたら「変更したよ!」と教えてください😉
そこから次の認証ステップに進もう!」

 

 

🔄設定変更したけど...まさかの結果

 

今度こそ!っと

実行ボタンを押したら…

 

このサイトにアクセスできません 127.0.0.1 で接続が拒否されました。 次をお試しください 接続を確認する プロキシとファイアウォールを確認する ERR_CONNECTION_REFUSED

 

さゆ:

「またまた、エラーっぽいよ?」 

 

ChatGPT:
「大丈夫、これは想定内の挙動です👌💡
実はこのエラー、「認証に成功してリダイレクトされた先に、何もサーバーが立っていないから」表示されているだけ。
つまり:
認証そのものは成功している可能性が高い! 🎉

________________________________________

✅ やるべきこと
❶ ブラウザのアドレスバー(URL)をよく見て!
こんな感じのURLになっていませんか?
https://127.0.0.1/callback?code=abc1234XYZ567&state=xxxxx
👉 この中の code=xxxxx... の部分が 認証コードです!
________________________________________
❷ 「code=」以降の文字列を コピー してください
例:
code=abc1234XYZ567 → この「abc1234XYZ567」が必要!」
 

 

😲えっ!?成功してたの?

 

ChatGPTに「ブラウザのアドレスバーを見て!」って言われて確認したら...

 

https://127.0.0.1/callback?error=invalid_request&state=0mi9HMiy...

 

あれ?エラーの文字が😅

 

 

ChatGPTの新しいアドバイス

 

ChatGPT:
「ありがとう、URL確認しました。
これは明確に「認証コード(code)が返ってきていない」=認証に失敗しているという状態です💧
________________________________________
❌ エラーの意味:「invalid_request」
このエラーが表示されるときは、設定やリクエストの形式にミスがあるのが原因です。
________________________________________
✅ 原因として最も可能性が高いのはこれ:
「code_challenge / code_verifier」が含まれていない
(OAuth 2.0 PKCE 認証の要件を満たしていない)
OAuth2Session を使って認証URLを生成する場合、Twitterの認証フローでは**PKCE(Proof Key for Code Exchange)**が必須です。
________________________________________
🛠️ 解決策:OAuth2Session で code_challenge_method='S256' を明示しよう
以下のようにコードを修正してください👇
 

import os from dotenv 

import load_dotenv from requests_oauthlib 

import OAuth2Session from oauthlib.oauth2 

import BackendApplicationClient import secrets 

 

# .envファイルの読み込み 

load_dotenv() 

 

# 環境変数から読み込み client_id = os.getenv("CLIENT_ID") redirect_uri = "https://127.0.0.1/callback" 

 

# PKCEの code_verifier(ランダム文字列を生成) 

code_verifier = secrets.token_urlsafe(64) 

 

# セッション作成(PKCE対応) 

oauth = OAuth2Session( client_id=client_id, redirect_uri=redirect_uri, scope=["tweet.read", "tweet.write", "users.read", "offline.access"], code_challenge_method="S256" ) 

 

# 認証URLの生成(code_challenge を含めて) 

authorization_url, state = oauth.authorization_url( "https://twitter.com/i/oauth2/authorize", code_challenge=code_verifier # ここ大事!

 

# 認証URL表示 print("🔑 以下のURLにアクセスして、認証コードをコピーしてね:\n") 

print(authorization_url) 

 

# code_verifier をファイルなどに一時保存(step2で使うため) 

with open("code_verifier.txt", "w") as f: f.write(code_verifier)

________________________________________
✅ 次のステップ
1.    このコードで auth_step1.py を上書きして実行
2.    表示されたURLを開いて、ログイン&許可
3.    今度こそ code=xxxxxx が返ってくるURLがブラウザに表示されるはず✨
4.    それを使って auth_step2.py に進めます(※その際は code_verifier.txt の内容を使います)
________________________________________
準備できたら「URL表示されたよ!」「認証コード取れたよ!」と教えてください😊」
 

 

🛠️新しいコードに挑戦!

 

もらったプログラムをに上書きして実行したものの…

 

TypeError: Session.__init__() got an unexpected keyword argument 'code_challenge_method'

 

さゆ:
「なんかエラーになった。 」 
 

ChatGPT:

「ありがとう、エラー内容しっかりキャッチできてるよ!
このエラー👇は「code_challenge_method は requests-oauthlib では直接渡せない」という意味です。

________________________________________
✅ 解決方法:手動でPKCEの code_challenge を生成してURLに追加する
TwitterのOAuth 2.0 認証では [PKCE (Proof Key for Code Exchange)] が必須なのですが、requests-oauthlib は code_challenge_method="S256" を直接渡す機能に未対応です。
そこで、手動で code_verifier → code_challenge を生成して、URLに組み込みます。
________________________________________
✨ 修正版コード(100%動くPKCE対応版)
 

import os 

import secrets 

import hashlib 

import base64 from urllib.parse 

import urlencode from dotenv 

import load_dotenv 

 

# .envファイル読み込み 

load_dotenv() 

client_id = os.getenv("CLIENT_ID") 

redirect_uri = "https://127.0.0.1/callback" 

 

# ① PKCE用の code_verifier を生成(43〜128文字)

code_verifier = secrets.token_urlsafe(64) 

 

# ② code_challenge を S256(SHA256 + base64url)で生成 

code_challenge = hashlib.sha256(code_verifier.encode("utf-8")).digest() 

code_challenge = base64.urlsafe_b64encode(code_challenge).rstrip(b"=").decode("utf-8") 

 

# ③ スコープとパラメータをURLに追加 

params = { 

"response_type": "code", 

"client_id": client_id, 

"redirect_uri": redirect_uri, 

"scope": "tweet.read tweet.write users.read offline.access", 

"state": secrets.token_urlsafe(16), 

"code_challenge": code_challenge, 

"code_challenge_method": "S256" 

 

# ④ 認証URL生成 

authorization_url = "https://twitter.com/i/oauth2/authorize?" + urlencode(params) 

print("🔑 以下のURLにアクセスして、認証後にブラウザに表示されるURLをコピーしてください:\n") 

print(authorization_url) 

 

# ⑤ code_verifier をファイル保存(step2で使用) 

with open("code_verifier.txt", "w") as f: f.write(code_verifier) 

 

 

🎉ついに認証コードをゲット!

 

ChatGPTがくれた最新コードをドキドキしながら実行💓

 

すると…

 

https://127.0.0.1/callback?state=zWl8IhbrhnCUeEFatrc5nQ&code=WnRKN2Q0VWxZcEdVS1d2cmNZd1lPX0...

 

さゆ:
「もしかして、これは成功?」

 

ChatGPT:

「よく頑張りました👏
そのURLに含まれている code パラメータがまさに「次のステップ」で使う 認可コード(authorization code)です!」

 

 

 

思わず「えーーー!?本当に!?」
って声に出しちゃいました😆
 
 
 娘も「ママすごいね〜」って褒めてくれて
なんだか涙が出そうになりました🥺
 
 

今回の学び✏️

 

✅ 認証コード(Authorization Code)
→ Xに「この人は本当にアプリを使って良い人ですよ」って証明するもの🎫
✅ PKCE(ピクシー)
→ より安全に認証するための追加のセキュリティ仕組み🔐
✅ OAuth 2.0
→ アプリがXにアクセスするための安全な認証システム🛡️

 

 

次回予告🚀

 

ついに手に入れた認証コード!✨
でも、これで終わりじゃないんです!
 
でもChatGPTによるとこれを使って
今度は「アクセストークン」というものを
取得する必要があるそうです🎯
 
 
「アクセストークン?またよくわからない言葉が...」
 
って思ったけど
ここまで来たら最後まで頑張ります💪
 

次回は
「認証コードからアクセストークンを取得する方法」
をお届けします📝
 
 
果たして、PC音痴主婦さゆの挑戦は
最終ゴールまで辿り着けるのでしょうか...?😅
 
 
💭 今日の気づき
3日間の格闘を経て感じたのは
「初心者だからって諦める必要はない」
ということです✨

わたしみたいにPC音痴でも
ChatGPTのサポートがあれば
少しずつでも前に進めるって実感しました😊
 

同じようにプログラミングや技術的なことに
挑戦している方がいらっしゃったら
一緒に頑張りましょう🤝
 
 

🛍️集中力UPや気分転換に!

 

今回の作業で改めて
「コーヒーは必須だな」
って思いました☕ 
 
長時間パソコンと向き合うときには
好きなコーヒーを飲みながらやると集中力が続きます✨
 

特に疲れた時には
ちょっと贅沢なドリップコーヒーを入れて気分転換🎵
 
香りだけでもリラックスできて
「よし、もう一度頑張ろう!」って思えるんです💪
 
 

\集中力UPや気分転換に!/

プレミアムドリップコーヒー(10g*20袋)

 

 

\夜間の作業が多い方に!/

目に優しい LEDデスクライト

 

 

\長時間のPC作業で目が疲れる方に!/

ブルーライトカット眼鏡

 

 
 
次回もお楽しみに〜💕
 
 

 

 

\ChatGPT活用本/

 

わたしがChatGPTとの付き合い方を

学んだ入門書です📚
初心者でも分かりやすく

実践的な使い方が満載!

 

💡 こんなあなたにおすすめ 

・ChatGPTを初めて使う方

・効果的な質問の仕方を知りたい方 

・日常生活で活用したい方

 

 

\Logicool ワイヤレスマウス M575S トラックボール/

 

長時間のPC作業で手首が疲れるあなたに!
ChatGPTとのやり取りで
作業時間が増えたわたしには必需品です✨

 

💡 こんなあなたにおすすめ
・長時間のPC作業をする方
・手首の疲れを軽減したい方
・作業効率を上げたい方

 

 

山善 昇降式デスク
\スタンディングデスク 幅120cm/

 

立ったり座ったり、集中力を保ちながら学習!
新しいことを覚える時の気分転換に最適🏠

 

💡 こんなあなたにおすすめ
・集中力を持続させたい方
・健康的に作業したい方
・学習環境を整えたい方

 

 

 

楽天ROOMでは

「買ってよかったものだけを載せています。

 

 

 

 

最後まで読んでくださって

ありがとうございます✨

 

 


フォローや「いいね」もらえると

すっごく励みになります♪

フォローしてね



それではまたバイバイ

 

 

 

にほんブログ村 主婦日記ブログ パート主婦へ
にほんブログ村

 

人気ブログランキング
人気ブログランキング