x(twitter) API test Like 取得

2025-04-10 コマンドメモ

https://twitter.com/i/oauth2/authorize?response_type=code&client_id={Client ID}&redirect_uri=http://localhost:3000&scope=tweet.read%20users.read%20like.read&state=state123&code_challenge=challenge&code_challenge_method=plain

ってこれ手作業でアクセストークン取れなかった。

 

from http.server import BaseHTTPRequestHandler, HTTPServer
import webbrowser
import requests
from urllib.parse import urlparse, parse_qs
import base64

# — 設定 —
CLIENT_ID = “YOUR_CLIENT_ID”
CLIENT_SECRET = “YOUR_CLIENT_SECRET” # ★注意: 本番環境では直接書かない
REDIRECT_URI = “http://localhost:3000”
SCOPE = “tweet.read users.read like.read”
CODE_VERIFIER = “challenge” # plain の場合
# ————

# Basic認証ヘッダー生成
auth_header = base64.b64encode(f”{CLIENT_ID}:{CLIENT_SECRET}”.encode()).decode()

authorization_url = (
f”https://twitter.com/i/oauth2/authorize?”
f”response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}”
f”&scope={SCOPE.replace(‘ ‘, ‘%20’)}&state=state123″
f”&code_challenge={CODE_VERIFIER}&code_challenge_method=plain”
)

print(“以下のURLにアクセスして認証してください:”)
print(authorization_url)
webbrowser.open(authorization_url)

# — ここから簡易サーバー —
class OAuthCallbackHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header(“Content-type”, “text/html”)
self.end_headers()
self.wfile.write(b”<html><body><h1>Authorization Callback Received</h1>”)

query_components = parse_qs(urlparse(self.path).query)
if “code” in query_components:
auth_code = query_components[“code”][0]
print(f”\nReceived authorization code: {auth_code}”)
self.wfile.write(f”<p>Code: {auth_code}</p>”.encode())
self.wfile.write(b”<p>Attempting to get access token…</p>”)

# — アクセストークン取得リクエスト —
token_url = “https://api.twitter.com/2/oauth2/token”
payload = {
“code”: auth_code,
“grant_type”: “authorization_code”,
“client_id”: CLIENT_ID, # PKCE(plain)でもClient IDが必要な場合がある
“redirect_uri”: REDIRECT_URI,
“code_verifier”: CODE_VERIFIER,
}
headers = {
“Content-Type”: “application/x-www-form-urlencoded”,
“Authorization”: f”Basic {auth_header}”
}

try:
response = requests.post(token_url, data=payload, headers=headers, timeout=10)
response.raise_for_status() # エラーがあれば例外発生
token_data = response.json()
print(“\nAccess Token successfully retrieved:”)
print(token_data)
self.wfile.write(f”<pre>{response.text}</pre>”.encode())
# ★★★★★
# ここで取得した access_token を使う
# 例: print(f”Access Token: {token_data[‘access_token’]}”)
# ★★★★★

except requests.exceptions.RequestException as e:
print(f”\nError getting access token: {e}”)
if e.response is not None:
print(f”Response body: {e.response.text}”)
self.wfile.write(f”<p>Error: {e.response.status_code}</p><pre>{e.response.text}</pre>”.encode())
else:
self.wfile.write(f”<p>Error: {e}</p>”.encode())

self.wfile.write(b”<p>You can close this window.</p></body></html>”)

# サーバーを停止させるためのフラグなど(簡易的な例)
global server
server.server_close() # すぐ閉じる
print(“\nServer stopped.”)

else:
self.wfile.write(b”<p>No authorization code found.</p></body></html>”)

if __name__ == “__main__”:
port = 3000
server_address = (‘localhost’, port)
server = HTTPServer(server_address, OAuthCallbackHandler)
print(f”Starting simple HTTP server on http://localhost:{port}”)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
server.server_close()
print(“Server stopped.”)

 




import requests

# users.readスコープを持つアクセストークン
access_token = "YOUR_ACCESS_TOKEN"
headers = {"Authorization": f"Bearer {access_token}"}
url = "https://api.twitter.com/2/users/me"
response = requests.get(url, headers=headers)
if response.status_code == 200:
    user_data = response.json()
    print("あなたの数値ID:", user_data['data']['id'])
else:
    print("Error:", response.status_code, response.text)


import requests
access_token = "取得したトークン"
headers = {"Authorization": f"Bearer {access_token}"}
user_id = "あなたのユーザーID"
url = f"https://api.twitter.com/2/users/{user_id}/liked_tweets"
response = requests.get(url, headers=headers)
print(response.json())





冷凍食品の乾燥具合、霜の付き具合を継続チェック中

以前の記事の続きです。

2018年10月5日

から始めている内容です。

冷凍食品は乾燥するんだけど条件を変えて違いがあるか?

2018年10月12日

3:10、 -12℃

19:30,-14℃

 

2018年10月14日

8:15,-16℃

外気温が下がったせいなのか?だいぶ温度が下がっている。
室温は22℃です。

と言うかこの実験一ヶ月くらいやる予定なんですが、相当霜ついて、黒く変色してしまっています。

 

2018年10月22日

10月5日からなので、17日ほど経っています。
最近変化がなさそうなのでここらで一旦取りやめにします。

最近むしろ霜が減ったような気もします。
ラップを水分が通過して減っったのかもしれません。

以下写真です。二重ラップのうちの1つを取ったらそこそこ鮮明な写りかと思います。

苔対策 経緯 シバゴケ 緑藻 水槽 アクアリウム 記録

2020‎年‎8‎月‎14‎日、‏‎20:49:00

水槽の苔が手を付けられないくらい凄くなってしまいました。

とはいえ、以前かなり撃退したことがるので、その時の手法をさらに改良して記録していきます。

2020‎年‎8‎月‎14‎日、‏‎20:49:00時点の苔に覆われた水槽

あまりにも目立ちすぎなものはピンセットで取り除いた後ですが、それでもこのような苔だらけの水槽になってしまいました。

この状態から対策していきます。

アヌビアヌスナナ、苔にやられやすい水草だと思います。
ミクロソリウム、シダも成長が遅いので苔が付きやすいようです。
アヌビアヌスナナ拡大。

まずこの苔は緑藻に分類されるので、緑色で光合成に使う光の波長は水草と同じはずです。

つまり、完全遮光すれば苔はなくなりますが、水草もなくなってしまいます。

水草だけ残して、苔は消滅させる必要があります。

その方法ですが、水草間の勢力バランスで苔を劣勢にしていく。

事にします。

水草水槽やっている人はある1つの水草がめちゃくちゃ増えて、いつの間にか他の水草を消滅させたことがあるのではないでしょうか?

私は何回もあります。

つまり、他の大量の水草に追いやられて苔が無くなっていくようにするわけですが、今は逆で、水草が弱って苔が大量のため、逆に水草が追いやられている感じです。

2020‎年‎8‎月‎21‎日、‏‎16:42:04

とりあえず苔に負けようが無い水上葉を増やしています。

以前苔を対策したときは右のアマゾンチドメグサ?だったかな?

これを大量に増やしてから水中に沈めることで、苔を圧倒しました。

とりあえずカリウム肥料が少ないと苔は増殖しても、水草の成長が止まっているようなので、草木灰を入れています。

結構適当で、大きなスプーン一杯とかふつうに入れています。

そもそも栄養塩類が多すぎるとエビなどに影響があるし、都合の悪い物質がたまる方向なのは間違いないでしょうから、どうにか水替えを自動にしました。

自動にしないと中々やらないので。