WEB制作メモ

web制作・ビジネス・アイデア・生活・ホームページ制作・更新など

twitter api v2 post で 自分の投稿へのリプライにに返信したい。けどリフレッシュトークンまで

 
  • 最初はplainで行った方が良い
  • どうしても上手くいかない場合
        developerサイトで
        アプリの種類をかえてみる。
---
 
Twitter API Playground という純正のツールでテスト
 
必要そうな部分は
text
reply
in_reply_to_tweet_id
exclude_reply_user_ids
 
の三つの数値
 
特定のツイートを取得したさいに取得できるはず。
まずは確認。
 

まずは、通常のツイートをする。
マニュアルで
jsonでおくっている。
php curljsonで送る準備をしてみよう。
 
なかなか PHP

POST /2/tweets

 
でツイートする記事がない。。。
 

JSON body parameters

{
  "data": {
    "id": "1445880548472328192",
    "text": "Hello world!"
  }
}
とあるので、とりあずこれを使いたいが
Authorization: Bearer
がつかえないっぽい。
OAuth 1.0a and OAuth 2.0 turned on
を使えるように設定
Callback URI / Redirect URL
に設定。なんでもいい?
POSTでおくるものは
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'refresh_token=bWRWa3gzdnk3WHRGU1o0bmRRcTJ5VUxWX1lZTDdJSUtmaWcxbTVxdEFXcW5tOjE2MjIxNDc3NDM5MTQ6MToxOnJ0OjE' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id=rG9n6402A3dbUJKzXTNX4oWHJ'
うーん  refreshtokenあたりがややこしそう
 
いろいろ探し回っていると
こちらの記事がうまくいきそう
 
Bearer Tokenでは特定のTwitterアカウントとしては認証されません。
=アカウントに対する操作(※)を行えない
 
なるほど
 
APIキー等をenvに登録
composer update
 
$ php example_index.php
 
array (
  'errors' =>
  array (
    0 =>
    array (
      'message' => 'You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. You can learn more here: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve',
      'code' => 453,
    ),
  ),
)
現在、Twitter API v2エンドポイントへのアクセスのみを含むEssentialアクセス権をお持ちです。このエンドポイントへのアクセスが必要な場合、開発者ポータルからElevatedアクセスに申請する必要があります。詳しくはこちらをご覧ください: https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api#v2-access-leve
結局このぷろぐらむはv1を参照していた。
エンドポイントをv2に変えたらすぐうごくのだろうか?!?
 
やってみる
。。。
そのままでは動かない。。。
 
 
やはりもどってやるしかないのか
これは、はてしないのか?
 
設定後、Authorization Request の URL を作成
 
URLを作成。
URLを作ってアクセスして何かを手に入れないといけないらしい。
もう一度みなおして、
URLを作るための
パラメータは
Parameter
Description
response_type
You will need to specify that this is a code with the word “code”. 
client_id
Can be found in the developer portal under the header "Client ID".
redirect_uri
Your callback URL. This value must correspond to one of the Callback URLs defined in your App’s settings. For OAuth 2.0, you will need to have exact match validation for your callback URL.
state
A random string you provide to verify against CSRF attacks.  The length of this string can be up to 500 characters.
code_challenge
PKCE parameter, a random secret for each request you make. 
code_challenge_method
Specifies the method you are using to make a request (S256 OR plain).
ややこしい、、、
とにかくつくるしかない。
こんな感じのやつをつくる
URLをつくって
アクセスしてみると

 
なるほど何か出た!
 
ボタンを押してもtwitterのホームが出るだけだが、、、
とにかく前へ進んだ。。。
redirectしたURLは
 
code部分が必要となるらしい
eDJucHpzYmJuNHp6T0Z3ZDBnY2RsVHFsXzFBb0xUMzFJWmVEMUFjRi00WlR2OjE2NDg4MTIwMDY1NTk6MToxOmFjOjE
 
refleshtokenの取得の方法がわからない。。。
OAuth 2.0 Authorization Code Flow with PKCE
についての記述がある。
この記事でわかりそ

二日たってもわからない
 
さて続き、おちついて
 
検索を開始
 
こちらの記事で

アクセストークンの更新

offline.accessを要求することで、アクセストークンリクエストのレスポンスとしてリフレッシュトークンを取得することができます
 
とある、すぐ取得できそう?。
 
まずはこれを実現するところから始めてみるか。。。。
 
code_verifier
 
code_verifier が上手く作れていない?
code_verifier 作り方 twitter
sha256に変換することと同意?
$hased_string = hash('sha256', $original_string);
さっそくいれてみるが。。。
変わらず
array (
  'error' => 'unauthorized_client',
  'error_description' => 'Missing valid authorization header',
)
code_verifier
にそのままcodeを入れてみる。
 
 
platformをよく見る
 
の記述が!
challenge
でいいのかな
 
結果かわらず
何かが足りない
 
次のサンプルに
--header 'Authorization: Basic
をつかっている例がある。
 
テスト用のcode_verifierを掲載しているところがあった
//code_verifier=8KxxO-RPl0bLSxX5AWwgdiFbMnry_VOKzFeIlVA7NoA code_challenge=y_SfRG4BmOES02uqWeIkIgLQAlTBggyf_G7uKT51ku8です。
うーん上手くいかない
 
別のサイトを参照
.NETの記事ではあるが、やっていることは同じはず
scopeにofflineはある
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
ん?
これは、いままでやってたことがちょっとちがう?
sha256してから
state は CSRF 対策のランダムな文字列です。(~500文字)
 
 
認可コードを取得する際に一致しているか確認します。
となると、変換しなくていい?
developperのページに行き設定もれがないか再度確認
今、PHPのみでテストしていてサーバーでテストしていなかったので
web appではなく native appに使用目的を変えた。
 
 
ん!?通った?
 
 
array (
  'token_type' => 'bearer',
  'expires_in' => 7200,
  'access_token' => 'SjBrX1o1SnI3bktHNjF4Yl9hU0Z3alpCRGlwckZ4OC1XTmZzbWVkN0FGdzRaOjE2NDkyMjE5MTA5MTE6MTowOmF0OjE',
  'scope' => 'tweet.write tweet.read offline.access',
  'refresh_token' => 'NVRwWWpJOUJSYlkzQW10VDNvNWlHQktLeWNaellva29YNDhGZzI1anVWMTBNOjE2NDkyMjE5MTA5MTE6MTowOnJ0OjE',
)
どゆことーdevelopがわのもともとの設定が間違ってた
 
ってことか。。。
plainでテストしていたので
s256に変えてやってみる
これはうまくいかない。
ひとまず通ったのでひと段落。