「X」の版間の差分

提供:GNU social JP Wiki
(Service)
(Authorizing a request)
 
(同じ利用者による、間の3版が非表示)
13行目: 13行目:


特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。
特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。
== API ==
=== Authentication ===
Ref: [https://developer.twitter.com/ja/docs/basics/authentication/overview/oauth OAuth with the Twitter API | Docs | Twitter Developer Platform].
Twitter APIを使う場合、まず認証が必要になる。OAuth 2.0ベースだが、いくつか方式がある。
# Application-only authentication: OAuth2 (bearer token): アプリで認証するケース。
# Application-user authentication: OAuth 1a (access token for user context): ユーザーで認証するケース。3-legged-OAuthを使用。
1番目は全体で共有する感じ。単独アプリなどで使う。レート制限などを緩和するために、サーバーアプリで、登録ユーザー別に、認証したいなら後者を使ったほうがいい。
==== OAuth 1.0a ====
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a OAuth 1.0a | Docs | Twitter Developer Platform].
以下の情報を使う。
* oauth_consumer_key/secret: アプリの認証情報。アクセストークンの取得に使用。API Key、アプリキーなどとも呼ばれる。
* oauth_token/secret: アクセストークン。ユーザーが自分のアカウントにAPI経由でのアクセスに使用。実質的なパスワード。
consumer_key/secretは、開発者がX Developer Platformから事前に発行して取得しておく必要がある。oauth_token/secretは実装後にユーザーがアプリ操作で取得する感じになる。
アクセストークンを実際に取得する際のリクエストは以下のようなイメージ。
curl --request POST \
  --url '<nowiki>https://api.twitter.com/1.1/statuses/update.json?status=Hello%20world'</nowiki> \
  --header 'authorization: OAuth oauth_consumer_key="CONSUMER_API_KEY", oauth_nonce="OAUTH_NONCE", oauth_signature="OAUTH_SIGNATURE", oauth_signature_method="HMAC-SHA1", oauth_timestamp="OAUTH_TIMESTAMP", oauth_token="ACCESS_TOKEN", oauth_version="1.0"' \
===== API Key and Secret =====
Ref: [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/api-key-and-secret API Key and Secret | Docs | Twitter Developer Platform].
Consumer Key/Secretを取得する。開発者アカウントにログインして、アプリのプロジェクトを作成すると表示される。これを控えておく。
===== User Access Tokens (3-legged OAuth flow) =====
Ref:
* [https://cdn.cms-twdigitalassets.com/content/dam/developer-twitter/docs/obtaining-access-tokens.png.twimg.1920.png User Access Tokens (3-legged OAuth flow) | Docs | Twitter Developer Platform]
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/obtaining-user-access-tokens ユーザーアクセストークンの取得(3レッグ認証OAuth) | Docs | Twitter Developer Platform]
3-legged OAuth flowをに従って、ユーザーにアクセストークンの取得を行える。ここが重要。Twitterでのログインとほぼ同じ手順。
====== 1 POST oauth/request_token ======
まずコンシューマーキーを使って、アクセストークンを要請する。
* oauth_callback
* oauth_consumer_key
応答200で以下のパラメーターがボディーにあるので、これを後続の処理で使用する。
* oauth_token
* oauth_token_secret
* oauth_callback_confirmed
なお、OAuth関係のリクエスト送信時には、
oauth_nonce="OAUTH_NONCE", oauth_signature="OAUTH_SIGNATURE", oauth_signature_method="HMAC-SHA1", oauth_timestamp="OAUTH_TIMESTAMP", oauth_token="ACCESS_TOKEN", oauth_version="1.0"' \
の情報も必要な模様。
====== 2 GET oauth/authorize ======
1で取得したoauth_tokenを使って、GETする。
https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0
すると、1でoauth_callbackdで指定したURLにリダイレクトされて、URLクエリーにパラメーターがついてくる。
https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY
====== 3 POST oauth/access_token ======
最後にアクセストークンを取得する。
* POST /oauth/access_token
* <code>oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w</code> <code>oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0</code>  <code>oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY</code>
応答本体に以下が返ってくる。
* <code>oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4</code> <code>oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo</code>
以後は上記をリクエストで使う。
===== Authorizing a request =====
Ref:
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/authorizing-a-request Authorizing a request | Docs | Twitter Developer Platform]
* [https://qiita.com/kerupani129/items/ee9d894cc67101f16c3f OAuth 1.0a 認証の実装 (Twitter API 用) #Twitter - Qiita]
* [https://note.com/tkhm_dev/n/n152ea1b08b8d Twitter APIをcurlで呼び出す場合のSignatureの生成|tkhm]
X/TwitterはシンプルHTTPでAPI呼び出しがベース。<syntaxhighlight lang="http">
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.twitter.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
</syntaxhighlight>ただし、これに加えて以下の情報がないと、無効扱いになる。
* アプリ。
* ユーザー。
* 権限。
* 改竄。
上記の情報をリクエストに付与するために、OAuth 1.0aプロトコルを採用している。具体的には、上記の情報を付与する、追加のHTTP Authorizationヘッダーがあればよい。具体的には以下となる。<syntaxhighlight lang="http">
POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com
status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21
</syntaxhighlight>Authorizationヘッダーは実際には一行。
この署名プロセスが過度な場合、Web Intentsを使ったほうが簡単。
パラメーターは以下の通り。
* oauth_consumer_key=アプリの情報。開発者ページで生成しておく。
* oauth_nonce=リクエストごとに固有。再送防止用に使用する。
* oauth_signature=改竄防止用。他のパラメーターから自動生成。
* oauth_signature_method=HMAC-SHA1で固定。
* oauth_timestamp=リクエスト作成日。Unixエポック。
* oauth_token=アクセストークン。
* oauth_version=1.0固定。
===== Creating a signature =====
* [https://developer.twitter.com/ja/docs/authentication/oauth-1-0a/creating-a-signature 署名の作成 | Docs | Twitter Developer Platform]
* [https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature Creating a signature | Docs | Twitter Developer Platform]

2024年3月28日 (木) 23:35時点における最新版

About

旧Twitter。

Link

Service

X/Twitter関係でアクセスの多い役務関係の記事が以下となっている。

特に、Nitterは主要なメディアでの報道がないものの、潜在的なユーザーが多いようで、アクセスが多かった。

API

Authentication

Ref: OAuth with the Twitter API | Docs | Twitter Developer Platform.

Twitter APIを使う場合、まず認証が必要になる。OAuth 2.0ベースだが、いくつか方式がある。

  1. Application-only authentication: OAuth2 (bearer token): アプリで認証するケース。
  2. Application-user authentication: OAuth 1a (access token for user context): ユーザーで認証するケース。3-legged-OAuthを使用。

1番目は全体で共有する感じ。単独アプリなどで使う。レート制限などを緩和するために、サーバーアプリで、登録ユーザー別に、認証したいなら後者を使ったほうがいい。

OAuth 1.0a

Ref: OAuth 1.0a | Docs | Twitter Developer Platform.

以下の情報を使う。

  • oauth_consumer_key/secret: アプリの認証情報。アクセストークンの取得に使用。API Key、アプリキーなどとも呼ばれる。
  • oauth_token/secret: アクセストークン。ユーザーが自分のアカウントにAPI経由でのアクセスに使用。実質的なパスワード。

consumer_key/secretは、開発者がX Developer Platformから事前に発行して取得しておく必要がある。oauth_token/secretは実装後にユーザーがアプリ操作で取得する感じになる。

アクセストークンを実際に取得する際のリクエストは以下のようなイメージ。

curl --request POST \
  --url 'https://api.twitter.com/1.1/statuses/update.json?status=Hello%20world' \
  --header 'authorization: OAuth oauth_consumer_key="CONSUMER_API_KEY", oauth_nonce="OAUTH_NONCE", oauth_signature="OAUTH_SIGNATURE", oauth_signature_method="HMAC-SHA1", oauth_timestamp="OAUTH_TIMESTAMP", oauth_token="ACCESS_TOKEN", oauth_version="1.0"' \
API Key and Secret

Ref: API Key and Secret | Docs | Twitter Developer Platform.

Consumer Key/Secretを取得する。開発者アカウントにログインして、アプリのプロジェクトを作成すると表示される。これを控えておく。

User Access Tokens (3-legged OAuth flow)

Ref:

3-legged OAuth flowをに従って、ユーザーにアクセストークンの取得を行える。ここが重要。Twitterでのログインとほぼ同じ手順。

1 POST oauth/request_token

まずコンシューマーキーを使って、アクセストークンを要請する。

  • oauth_callback
  • oauth_consumer_key

応答200で以下のパラメーターがボディーにあるので、これを後続の処理で使用する。

  • oauth_token
  • oauth_token_secret
  • oauth_callback_confirmed

なお、OAuth関係のリクエスト送信時には、

oauth_nonce="OAUTH_NONCE", oauth_signature="OAUTH_SIGNATURE", oauth_signature_method="HMAC-SHA1", oauth_timestamp="OAUTH_TIMESTAMP", oauth_token="ACCESS_TOKEN", oauth_version="1.0"' \

の情報も必要な模様。

2 GET oauth/authorize

1で取得したoauth_tokenを使って、GETする。

https://api.twitter.com/oauth/authorize?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0

すると、1でoauth_callbackdで指定したURLにリダイレクトされて、URLクエリーにパラメーターがついてくる。

https://yourCallbackUrl.com?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

3 POST oauth/access_token

最後にアクセストークンを取得する。

  • POST /oauth/access_token
  • oauth_consumer_key=cChZNFj6T5R0TigYB9yd1w oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0 oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

応答本体に以下が返ってくる。

  • oauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4 oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo

以後は上記をリクエストで使う。

Authorizing a request

Ref:

X/TwitterはシンプルHTTPでAPI呼び出しがベース。

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

ただし、これに加えて以下の情報がないと、無効扱いになる。

  • アプリ。
  • ユーザー。
  • 権限。
  • 改竄。

上記の情報をリクエストに付与するために、OAuth 1.0aプロトコルを採用している。具体的には、上記の情報を付与する、追加のHTTP Authorizationヘッダーがあればよい。具体的には以下となる。

POST /1.1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

Authorizationヘッダーは実際には一行。

この署名プロセスが過度な場合、Web Intentsを使ったほうが簡単。

パラメーターは以下の通り。

  • oauth_consumer_key=アプリの情報。開発者ページで生成しておく。
  • oauth_nonce=リクエストごとに固有。再送防止用に使用する。
  • oauth_signature=改竄防止用。他のパラメーターから自動生成。
  • oauth_signature_method=HMAC-SHA1で固定。
  • oauth_timestamp=リクエスト作成日。Unixエポック。
  • oauth_token=アクセストークン。
  • oauth_version=1.0固定。
Creating a signature