DataSpiderでTwitterにツイート投稿してみた（OAuth2.0）

## はじめに
こんにちは。すぎもんです:smiley:
今回は、DataSpiderでTwitterのAPIを使ってみます。TwitterのAPI認証は、OAuth認証です。
ユーザーとパスワードで認証するbasic認証よりセキュリティ性は高いですし、サービス間の認証に使うことで利便性も向上します。様々なコミュニケーションツールやサービスが連携し合って活用されることが増えた昨今では、OAuth認証は主流のようです。
※尚、OAuth2.0の仕組み自体についてはここでは省略します。

## Twitterとは
皆さんご存じのTwitterです。
SNS（ソーシャルネットワーキングサービス）の一つで、Line,Instagram,Facebook,Tiktokなど国内外に様々ありますが、コミュニケーションツールのとして使われています。また、個人利用のみではなく、企業の広告やイベント集客など、組織単位での活用も主流です。拡散性やリアルタイム性も高く、情報収集にも活用されています。

## 今回やること
今回は、DataSpiderで、TwitterAPIを使ってTwitterにツイート投稿をしてみます。
「DataSpiderにおけるOAuth認証でのAPI利用」の観点でも、ご参考にしてみてください。

## 検証の流れ
＜Twitterの設定＞
　　　　①Twitterアカウントの作成
　　　　②デベロッパーサイトでアプリの作成
　　　　③Twitterアプリの設定（権限設定）
　　　　④Twitterアプリの設定（Twitter APIキーの再発行）

＜DataSpiderの設定＞
　　■トークン取得スクリプト
　　　　⑤スクリプト変数の作成
　　　　⑥POST実行の設定
　　　　⑦マッピングの設定
　　　　⑧スクリプトの作成（フロー作成）

　　■ツイート投稿スクリプト
　　　　⑨スクリプト変数の作成
　　　　⑩POST実行の設定
　　　　⑪マッピングの設定
　　　　⑫マッピング（入力元と出力先の紐づけ）
　　　　⑬スクリプトの作成（フロー作成）

　　⑭グローバルリソースの作成

＜スクリプトの実行（OAhth認証）＞
　　　1.　事前確認
　　　2.　「トークンの取得」スクリプトを実行
　　　3.　アクセストークンを「ツイート投稿」スクリプトに設定
　　　4.　「ツイート投稿」スクリプトを実行

## Twitterの設定
##### ①Twitterアカウントの作成
始めに、Twitter のアカウントがない場合は新規作成します。
https://twitter.com/i/flow/signup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/13a045ef-103c-ecff-1233-ec798fee15d9.png)
##### ②デベロッパーサイトでアプリの作成

アカウントを作成後、「Twitter デベロッパーサイト」でアプリを作成します。
[Twitter デベロッパーサイト](https://developer.twitter.com/en)にアクセスし、「Sign up」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/509cb9ef-5c2d-7a33-59a3-c7c574bf1895.png)
必要事項を入力し、「Let's do this」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ace2ff37-70a5-1f07-9901-a5a378806092.png)

以下の通り入力しました。ご参考にしてください。
　　　・Twitter Account　　　　　　　　　：　 `アカウント名`（＠以降）
　　　・Email　　　　　　　　　　　　　　 ：　`XXXX`　　
　　　　※未設定の場合は「Add email」で、メールアドレスの認証。
　　　・What country are you based in ?　　：　`任意（Japan）`
　　　・What’s your use case?　　　　　　 ：　`Exploring API`
　　　・Will you make Twitter・・・?　　　：　`No`
　　　・Get Involved and updates　　　　　：　`チェックしない`

利用規約の同意画面で内容を確認し、チェックを入れ、登録操作を進めます。
下記の画面が出てきたら、Twitter アカウントに登録しているメールアドレス宛に、送
信されたメールを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3b4bce3c-1ca0-e87f-4aab-b4a852f3c90a.png)
メールを確認し、[Confirm your email] で認証します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f7fe069b-c82d-949d-c42b-70eddeaeff52.png)
Twitter デベロッパーサイトに戻り、任意の API 名を入力して、[Get keys]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0050f052-bcf9-4bc9-81b8-5f4c3bada479.png)
API Key、API Key Secret、Bearer Token が表示されますが、この後で、アプリの詳細設定をした後に各種キーの再作成を行うので、ここでは、[Skip to dashboard]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b3f903c6-bc04-e4a7-c08f-a5a238461960.png)
ポップアップで「Did you save your Keys and Tokens?」と確認されるので、
「Yes, I saved them」を押下し完了します。

##### ③Twitterアプリの設定（権限設定）

Twitterアプリの設定をしていきます。
まずは、Developer PortalもDashBoad画面へ遷移します。

[Projects＆Apps]を押下すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/8aa84216-79db-57e0-e91e-e9e9e4e3825f.png)
先程作成したアプリ「`twtest5j01`」が追加されています。作成したアプリを選択し、
権限設定のために「User authentication settings」の[SetUp]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f0136e4c-c7b3-a655-5db5-59e2ce4ddebc.png)
※上記画像では「Edit」になっていますが、
未設定の場合は下記のように[SetUp]と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/36462ad9-4518-0961-48fb-0a77e251252b.png)
権限設定（User authentication setting）は、下記の通りにします。
　　　・App permissions　：　`Read and write`
　　　・Type of App　　　：　`Web App, Automated App or Bot`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/d6ce35ef-b9ee-2cf6-550a-3618e939865f.png)
App Infoでは、必須項目である「Callback URI/Redirect URI」と、
「Website URL」を下記の通り設定し、[Save]を押下してください。
　　　・Callback URI / Redirect URI　
　　　　　　　　　　:　`http://127.0.0.1:7700/dataspider/oauth_2_0`
　　　・WebsiteURL　:　`https://twitter.com/`

<font color =blue>※「127.0.0.1」は、今回の検証で使ったDataSpiderのserverアドレスです。
※また今回の接続でWebsite URLは使用しません。任意のURLを指定します。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/39c1634b-1102-9be8-1c5f-a09053d4da0d.png)
[Save]を押下すると、下記の通り`ClientID` と `Client Secret` が表示されます。
[Copy]して控えておいてください。コピー後に、[Done]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cce397eb-97a4-4e8d-01b5-bcce05b5b4d8.png)
##### ④Twitterアプリの設定（Twitter APIキーの再発行）

アプリ詳細画面の「Keys and tokens」を表示し、`Consumer Keys`を「Regenerate」で再作成します。`API Key`と、`API Key Secret`が新たに作成されるので、コピーして控えておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b50d245f-66b6-e2c1-d594-5436fb883903.png)

:::note info
もし権限設定の中で「Client ID」と「Client Secret」の表示がなく作成されていない場合は、APIの詳細画面「Keys and token」より再作成可能です。
:::

## DataSpiderの設定

ツイートの投稿をするために、下記２つのスクリプトを作成することにしました。
　　<strong>・トークン取得スクリプト</strong>
　　<strong>・ツイート投稿スクリプト</strong>

### ■トークン取得スクリプトの作成
まずは、「トークン取得」をするためのスクリプトを作成します。
Twitterデベロッパーサイト内の<strong>Step3</strong>を、参考に設定を行いました。
[Twitterデベロッパーサイト](https://developer.twitter.com/en/docs/authentication/oauth-2-0/user-access-token)
「How to connect to endpoints using OAuth 2.0 Authorization Code Flow with PKCE」と記載がある部分をご参照ください。

###### ⑤スクリプト変数の作成

始めに、任意の名前でプロジェクトとスクリプトを作成し、
ロジック内で使う「スクリプト変数」を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7cb43cc0-f319-c1b6-258a-ec4c2a3ab765.png)
　　　・変数名　　：　`twitter_clientid`
　　　・変数型　　：　`文字列型`
　　　・初期値　　：　`XXXXXXXX`（Twitterの設定時に取得した`ClientID`）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0c5cf333-dc84-dbc4-c082-1186ecca6624.png)

同様に、下記の通り、スクリプト変数を作成します。全部で4つ作成します。
　　　・変数名　　：　`twitter_clientsecret`
　　　・変数型　　：　`文字列型`
　　　・初期値　　：　`XXXXXXXX`（Twitterの設定時に取得した`Client Secret`）

　　　・変数名　　：　`twitter_auth_code`
　　　・変数型　　：　`文字列型`
　　　・初期値　　：　`なし`

　　　・変数名　　：　`twitter_code_verifier`
　　　・変数型　　：　`文字列型`
　　　・初期値　　：　`XXXXXXXX`（RFC7636の記載に基づいた43～128文字 *1）

**************************************************
*1　今回の接続確認では、
RFC7636の「Appendix B. Example for the s256 code_challenge_method」
https://datatracker.ietf.org/doc/html/rfc7636#appendix-B
上記内に記載されている値をそのまま使用します。

実際には推測不可能なランダムな文字列を利用するようにしてください。
[Online PKCE Genarator Tool](https://tonyxu-io.github.io/pkce-generator/)も利用可能です。
**************************************************

###### ⑥POST実行の設定

次に、デザイナ画面の右側「ツールパレット」から、
[ネットワーク]＞[REST]＞[POST実行]より、
POST実行アイコンを、デザイナ中央にドラッグ＆ドロップし設定画面を開きます。

「`POST_OAuth2_token取得`」という名前でPOST実行処理の設定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/3d548875-6765-9e1c-33e8-0897e9afdf61.png)
まずは、「必須設定」タブの設定をします。
「接続先」のプルダウンリストから[追加]を選択し、下記の通り設定します。
「接続テスト」を押下し、入力したURLがDataSpiderと通信可能か確認してください。
　　　・接続名　：　`twitter_REST接続設定`
　　　・URL　　 ：　`https://api.twitter.com/`（※RESTでの接続先URLを設定）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/5677d022-92af-87fc-6651-3c4cc07ec837.png)

:::note warn
「接続先」は、「コントロールパネル」>「グローバルリソースの設定」から
事前に設定することも可能です。
:::

「必須設定」タブは、「パス」に「`2/oauth2/token`※１」を設定し、「クエリパラメータ」を下記の通り、追加します。
　　名前①　　：　`grant_type`　　　値①　：　`authorization_code`
　　名前②　　：　`code`　　　　　　値③　：　`${twitter_auth_code}`
　　名前③　　：　`redirect_uri`　　値②　：　`${twitter_redirect_uri}`※２
　　名前④　　：　`client_id`　　　 値④　：　`${twitter_client_id}`
　　名前⑤　　：　`code_verifier`　 値⑤　：　`${twitter_code_verifier}`

※１　　パスに設定する値は、今回利用するAPIの最終的なendpointの、
　　　　" 接続先URLに設定していない残りの部分 " です。
※２　　Twitterの設定で指定した「RedirectURI」を指定します。

:::note info
DataSpiderの変数の記載方法は、<strong>${スクリプト変数名}</strong>　です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f9a2882f-89f3-b28e-e717-174c2487a1df.png)
また、スクリプト変数の入力は、入力欄でダブルクリックして「▶」が表示され、
一覧から選択することで入力も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/526d3188-102c-01fc-02fb-4a49ecf52279.png)


次に、「リクエスト設定」タブです。
ここではリクエストデータのbody部の入力形式を指定します。

データ入力形式は、下記の通り「`データ`」とし、データ形式は「`JSON`」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7677c1b8-015c-48f7-d76a-7de344c93e5e.png)

次に「レスポンス設定」タブです。
ここではレスポンスをどのように扱うかの設定を行います。

従来であれば、レスポンスとして取得する「access token」 や 「refresh token」 は、
DB等に保持して、APIの実行時に活用しますが、今回は接続確認のためなので「ファイル」にしました。下記のように設定します。
　　　・データ出力先　　：　　`ファイル`
　　　・ファイルパス　　：　　`/data/twitter/token_response.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4289de99-a2a7-c342-4f49-bbfc6a5bdab3.png)
次に、「ヘッダ設定」タブです。
リクエストヘッダの追加ボタンを押下し、下記のように設定してください。
　　　・名前　　　　　　：　　`Content-type`
　　　・値　　　　　　　：　　`x-www-form-urlencoded`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ec4d7f06-15cf-2428-137a-ac28e12f6c4d.png)
最後に、「認証設定」タブです。下記のように設定してください。
　　　・認証　　　　　　：　　`ベーシック認証`
　　　・ユーザー　　　　：　　`${twitter_clientid}`
　　　・パスワード　　　：　　`${twitter_crientsecret}`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1de1adcf-c3b6-e842-338a-d5e96fac34b4.png)
POST実行の設定は、これで完了です。

###### ⑦マッピングの設定

続いて、マッピングの設定を追加します。
今回、POST実行の入力データとして、JSONファイルを指定しています。
DataSpiderのデザイナ画面右側のツールパレットより、[変換]→[基本]→「マッピング」を選択し、ドラッグ＆ドロップし、Mappingアイコンをダブルクリックし設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/43687dfd-4d12-fcdb-8154-8202f2725a48.png)
まずは、出力先の出力データの設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cf9b7ea3-f407-0759-7021-57e677c25012.png)
出力データを右クリックして、「仮スキーマを設定」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/55473160-e70b-3eec-fc8c-9e8bca29e785.png)
「仮スキーマ」を右クリックして、「ルート要素の追加」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/61bf2506-4ca0-6334-2981-076ab641b71b.png)
手動で仮スキーマに要素を追加することもできますが、今回はDataSpiderのスキーマ設定仕様に従った、スキーマファイル（XML）を使用して、仮スキーマを設定します。
下記の内容をメモ帳等のエディタに張り付けて、xmlファイルとして保存します。
　　・ファイル名　　：　`twitter_schema1.xml`
　　・保存先　　　　：　`/data/twitter/`（※DataSpiderのdataフォルダ下）
<strong>■作成したXMLファイル</strong>
作成したXMLファイルはこちらです。
```
<?xml version="1.0" encoding="UTF-8" ?>
<root type="object">
<code></code>
<grant_type></grant_type>
<client_id></client_id>
<redirect_uri></redirect_uri>
<code_verifier></code_verifier>
</root>
```

スキーマ読み込みのためのファイル作成が完了しました。Mappingの設定に戻ります。
Mapping設定画面右側の出力先欄の「仮スキーマ」を右クリックし、「スキーマの読み込み」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/7eec62a8-39da-8a2c-4997-57de64b4f95c.png)
「XMLファイルから読み込み」を選択し、「参照」より、作成したxmlファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a5601125-f33a-f275-08b8-9bd2aa0be63c.png)
下記の通り、出力データの仮スキーマの要素が設定されたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/65d71516-0e3c-1cf0-18cd-7d5d4a698bb3.png)
次に、デザイナ右側のツールパレットから[文字列]→[基本]→「単一文字列定数」を、Mappingキャンバスにドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ad2dd28b-868d-0750-3af6-857f358d8143.png)
出力スキーマの「type」「grant_type」「redirect_uri」にそれぞれMappingするための、単一文字列定数（固定の文字列）を下記の通り、3つ作成します。

| 一行文字列 | コメント |
|:-----------|:------------|
| object | object |
| authorization_code | authorization_code|
| XXXXXX（※Twitter設定で指定したRedirect URI） | redirect_uri |

設定画面のイメージは下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0dfbdf5d-4066-6b55-5ae4-5e5924640ee4.png)

冒頭作成したスクリプト変数と、先程作成した単一文字列定数を、それぞれ出力スキーマにマッピングしていきます。各入力元と各出力先は下記の通りです。それぞれのアイコンをドラック＆ドロップでつなぎましょう。

| 入力元 | 出力先 |
|:-----------|------------:|
| スクリプト変数　twitter_auth_code | code |
| スクリプト変数　twitter_ code_verifier | code_verifier |
| スクリプト変数　twitter_clientid | client_id |
| 単一文字列定数　object | type |
| 単一文字列定数　authorization_code | grant_type |
| 単一文字列定数　redirect_uri | redirect_uri |

マッピング設定のイメージは下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/07fe84eb-b686-7261-491e-0816ead356bd.png)

###### ⑧スクリプトの設定（フロー作成）</strong>
設定したMappingアイコンを、POST実行アイコンにドラッグ＆ドロップします。

「フローの作成」というポップアップが出てくるので、[プロセスとデータフローを引く]を選択します。「マッピングを追加する」にはチェックを入れないでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a000fcfb-64f9-1cd8-552f-259312b75ac7.png)
最後に、StartアイコンをMappingアイコンに、POST実行アイコンをEndアイコンにドラッグ＆ドロップして線を引きます。下記の通り、トークン取得のスクリプトが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cbb9cc9e-3bce-0ca0-b3c9-50c4cce2561e.png)
これで、「ツイート投稿」するために必要なスクリプトの1つ目である「トークン取得スクリプト」が完成です。

### ■ツイート投稿スクリプトの作成
まずは、TwitterAPIの仕様を確認し、ツイート投稿に必要な値を確認します。
[ツイート投稿のAPI仕様](https://developer.twitter.com/en/docs/twitter-api/tweets/manage-tweets/api-reference/post-tweets)

###### ⑨スクリプト変数の作成

冒頭の手順通り、文字列型のスクリプト変数を下記４つ作成します。
| 変数名 | 変数の値 |
|:-----------|:------------|
| twitter_clientid| XXXXX（※１） |
| twitter_clientsecret | XXXXX（※１） |
| twitter_tweet | テスト（※２） |
| twitter_access_token | 未設定 |

<font color=blue>※１　「クライアントID」「クライアントシークレット」は、TwitterのDeveloper Portalで設定した「Client ID」「Client Secret」の値を設定します。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4b452eff-75ad-b122-925e-b84bd37df449.png)
<font color=blue>※２　「ツイッターに投稿する文言（twitter_tweet）」は、「テスト」という文字列を初期値に設定しています。また、Twitterの場合、同一投稿はエラーになるので、初期値の設定に加え、後で実施するMapper設定の中で実行日時と連結させます。
</font>

:::note warn
スクリプト変数「twitter_access_token」は、テスト実行時にアクセストークンを取得して、その値を設定するので、ここでは「未設定」となります。
:::

###### ⑩POST実行の設定

次にデザイナ右側のツールパレットメニューから[ネットワーク]＞[REST]＞「POST実行」をデザイナ画面中央にドラッグ＆ドロップし、POST実行の設定画面を開きます。

まずは、「必須設定」タブです。下記の通り設定します。
　　　・接続先　　　　　：　　`twitter_REST接続設定`
　　　・パス　　　　　　：　　`2/tweets`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/92f1d5e6-492d-f65a-e1a5-48c21e070b46.png)
「リクエスト設定」タブは、下記の通り設定します。
　　　・データ入力元　　：　　`データ`
　　　・データ形式　　　：　　`JSON`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/48635bb4-a36c-ba6d-67be-63af0d24472b.png)
「レスポンス設定」タブは、結果が確認しやすいようにファイルを指定しました。
　　　・データ出力先　　：　　`ファイル`
　　　・ファイルパス　　：　　`/data/twitter/tweet_response.json`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/cd456157-b889-4de8-4751-bddb525c4830.png)
「ヘッダ設定」タブは、リクエストヘッダに下記の通り設定します。
　　　・名前　　　　　　：　　`Authorization`
　　　・値　　　　　　　：　　`bearer ${twitter_access_token}`

:::note warn
${twitter_access_token}は、
スクリプト変数「twitter_access_token」のDataSpider表記です。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/66af3c8b-252f-2880-6c98-d0e9fe5c2f6c.png)
「認証設定タブ」は、"トークン取得設定"と同じように、ベーシック認証で、ユーザー、パスワードにそれぞれスクリプト変数の値を設定します。
下記の通り設定します。
　　・認証　　　　　　：　　`ベーシック認証`
　　・ユーザ　　　　　：　　`${twitter_clientid}`
　　・パスワード　　　：　　`${twitter_clientsecret}`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bcf81782-25c5-00ab-5b95-6cfa2ed272d0.png)
POST実行の設定はこれで完了です。

##### ⑪マッピングの設定
続いて、スクリプトにマッピングを追加します。
マッピングアイコンの中で、<strong>POST実行処理の入力データとして設定するJSONの中身の設定</strong>をします。呼び出すAPI仕様を確認すると、様々なパラメータ設定が可能ですが、今回は単純に「`text`」のみを指定する形で実行します。

デザイナ右側のツールパレットメニューから[変換]→[基本]の「マッピング」をデザイナ中央部にドラッグ＆ドロップ設定画面を開きます。

まずは、出力データのスキーマを作成しましょう。

画面右側にある出力先の出力データを設定します。
「出力データ」を右クリックし、「仮スキーマを設定」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/ba922ccb-9904-68c8-3d2b-f0b87d8c9682.png)
次に、「仮スキーマ」右クリックして「ルート要素の追加」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a7c38711-9742-3aa4-112d-def9aee15884.png)
作成された「root」を右クリックして[追加]→[属性]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/bf6ffedc-1626-b091-2e1c-274d6ceda8ac.png)
「出力先属性の編集」画面が表示されますので、属性名に「`type`」を入力しOKします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/e2eae5a7-bf2d-3865-cb34-1513d11a1439.png)
先程同様に「root」を右クリックして[追加]→[子要素]を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/67eda785-0130-e2ec-3b42-d263777ad728.png)
「出力先属性の追加」画面が表示されますので、追加したい要素である「`text`」を入力しOKします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f870fcb1-fc56-0a1b-8007-f25795997e2f.png)
マッピング設定画面右側の「出力先」の出力データの出力スキーマが作成できました。

##### ⑫マッピング（入力元と出力先の紐づけ）
続いて、入力元の各スクリプト変数と出力先の各スキーマを紐づけます。

下記の通り、各入力元と各出力先をドラック＆ドロップでつないでマッピングします。
| 入力元 | 出力先 |
|:-----------|:------------|
| スクリプト変数　twitter_tweet| rootのtext |
| 単一文字列定数　object| root要素のtype |

マッピング設定するイメージは、下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c2e4b60f-5944-4548-738f-253db72613fb.png)
<font color =blue>※スクリプト変数作成でご説明した通り、スクリプト変数「twitter_tweet」は、初期値"テスト"に、「実行日時」を「日時フォーマッティング」して「連結」しています。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/6ba2218b-a2f1-91fe-4893-599ecfe6843e.png)
詳細設定は省略しますが、下記ページをご参考にしてみてください。
　　[・DataSpiderの「日時フォーマッティング」について](https://www.hulft.com/help/ja-jp/DataSpider/dss32SP2/help/ja/mapper/document/logic/iso8601ToCustom.html)
　　[・DataSpiderの「連結」アイコンについて](https://www.hulft.com/help/ja-jp/DataSpider/dss32SP2/help/ja/mapper/variable/logic/concat.html)
</font>

##### ⑬スクリプトの作成（フロー作成）
スクリプト作成に戻ります。トークン取得スクリプトと同様に、StartアイコンからEndアイコンまでをそれぞれアイコンのドラッグ＆ドロップでつなぎます。

mappingアイコンとPOST実行アイコンをつなぐ際に表示されるポップアップでは、「プロセスフローとデータフローを引く」を選択し、「マッピングに追加する」はチェックしないようにしてください。スクリプト完成イメージは下記の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/fa9a8409-c485-37b9-0862-0143288d2e02.png)

##### ⑭グローバルリソースの作成

最後に、認可コードを取得するための接続設定をします。

DataSpiderの「コントロールパネル」を開き、「グローバルリソースの設定」画面の「名前」項目欄にある「新しいグローバルリソースの作成」をダブルクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/06bbbeb4-bf7f-293b-9389-404a6c68993a.png)
新たに追加するグローバルリソースの種類を選択します。
「認証」タブの「OAuth 2.0」を選択し、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/95d9fd58-bbf4-42a2-0e90-38318d812b8a.png)
接続内容は、下記の通りに設定します。
　・接続名　　　　　　　　　　：　`OAuth 2.0認証設定（twitter）`

「必須設定」タブは、下記の通り設定します。
　・クライアントID　　　　　：　`XXXXX`
　・クライアントシークレット：　`XXXXX`
　・リダイレクトURI　　　 ：　`http://127.0.0.1:7700/dataspider/oauth_2_0`
　・認可エンドポイント　　　　：　`https://twitter.com/i/oauth2/authorize`
　・トークンエンドポイント　　：　`https://api.twitter.com/2/oauth2/token`

　・スコープ：`tweet.read`、`users.read`、`offline.access`、`tweet.write`
　
　・クライアント認証方式　　　：　`client_secret_basic`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/52e3ad8f-613f-7848-d8d1-9907b3d74a46.png)
<font color=blue>※「クライアントID」「クライアントシークレット」は、TwitterのDeveloper Portalで設定した「Client ID」「Client Secret」の値を設定します。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/4b452eff-75ad-b122-925e-b84bd37df449.png)
「詳細設定」タブの「追加パラメータ」に追加した「キー」と「値」の一覧です。

| キー | 値 |
|:-----------|:------------|
| grant_type | authorization_code |
| response_type | code |
| state | state |
| code_challenge |code_verifierをcode_challenge_methodで計算した値（※）|
| code_challenge_method | s256（※使用したmethod）|

下記の通り、5つ追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/1b422875-be08-f9e8-e139-810fa99fd10a.png)
※「code_challenge」は、トークン取得の「code_verifier」で記載している通り、サンプルサイトの値を使用しています。

詳細設定タブの入力が完了したら、グローバルリソースの設定は完了です。

設定内容は、下記ページの<strong>Step2</strong>を参考にしています。
[How to connect to endpoints using OAuth 2.0 Authorization Code Flow with PKCE](https://developer.twitter.com/en/docs/authentication/oauth-2-0/user-access-token)
必要なスコープは、下記ページの使用するエンドポイントの<strong>Scopes</strong>で確認します。
[OAuth 2.0 Authorization Code with PKCE列](https://developer.twitter.com/en/docs/authentication/guides/v2-authentication-mappin)


## スクリプトの実行（OAuth認証）
それでは、Twitterにツイート投稿するスクリプト実行をしてみます。
今回は、OAhth認証方式です。大枠の手順は下記の通りです。

******************************************************
<strong>1.　事前確認
2.　「トークンの取得」スクリプトを実行
3.　アクセストークンを「ツイート投稿」スクリプトに設定
4.　「ツイート投稿」スクリプトを実行</strong>
******************************************************

##### 1.事前確認
スクリプト実行前に、DataSpiderのエクスプローラdataフォルダ配下に「twitter」という名前のフォルダがあるか確認しましょう。無い場合は、作成してください。

##### 2.「トークンの取得」スクリプトを実行
<font color =blue>※④～⑥の手順は、30秒以内で実施してください。</font>

①トークン取得スクリプトを開きます。
②作成したグローバルリソースと、トークン取得スクリプトのスクリプト変数「twitter_auth_code」の設定画面を開いておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/537f39ce-77d9-1d8c-2e6e-54c8d3481856.png)
③グローバルリソースの設定画面内にある「トークンを発行する」を押下します。
④「認可コードの取得」リンクを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/50bdf12d-7d9f-3345-d854-19bb515586b0.png)
⑤ブラウザに「認可コード」が表示されるので、値をコピーして、開いておいたスクリプト変数「twitter_auth_code」の設定画面の値に張り付けて完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2c81b30e-bbb5-9afc-b47a-7c0a17621c21.png)
⑥「トークン取得」のスクリプトを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0d2ebaf1-0d08-2a0c-7d39-feb29755110c.png)
DataSpiderのエクスプローラーを開き、「`/data/twitter`」に「`token_response.json`」が作成されていることを確認します。
作成されたファイルを開いて、「アクセストークン」を確認しましょう。
（※見やすいように「,」を「,改行」で置換しています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/a1d21053-d968-3bef-281c-79bcccecb8e7.png)

:::note info 
「"access_token":」の後に、""で括られた文字列がアクセストークンです。
:::

##### 3.アクセストークンを「ツイート投稿」スクリプトに設定
⑦「ツイート投稿」のスクリプト内にあるスクリプト変数「twitter_access_token」の設定画面を開きます。⑥で取得したアクセストークンを「初期値」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/2ce63ce7-fe07-cf08-642a-3d18eea6beae.png)

##### 4.「ツイートの投稿」スクリプトを実行
⑧ツイート投稿スクリプトを実行します。正常終了を確認出来たら、OKです。
実行後のレスポンスファイルの中身は下記の通りです。

ツイッター投稿文言が設定される出力スキーマ「text」に、スクリプト変数「twitter_tweet」の初期値「テスト」と、Mapping設定で設定した「スクリプト実行日時」が設定されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/f6fd886d-c634-2257-8274-0f939367c177.png)

### Twitter画面での投稿内容の確認
ブラウザでTwitterの管理画面を開き、投稿内容を確認します。
「ツイート投稿」スクリプトで作成したスクリプト変数「twitter_tweet」に設定した内容であり、レスポンスファイル内の「"text":"XXXXX"」のXXXXXの部分）と同じ内容が投稿されていたら成功です。

Top画面から【Home】の画像設定部分を押下し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/be5fbe45-2dff-f1c9-78aa-1699f54c1725.png)
自身の投稿内容を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b5c755e4-859a-8697-881d-d1b23c4d58e4.png)
「ツイート投稿」スクリプト内のスクリプト変数「twitter_tweet」に設定した内容「`テスト"スクリプト実行日時"`」が表示されていることを確認できました。

## 最後に

いかがでしたでしょうか。今回は、「DataSpiderにおけるOAuth認証でのAPI利用」でした。アクセストークンの取得を実行して、取得した値を設定する等、必要な手順があるので少々手間にも思えますが、整理して実行してみると非常にシンプルかと思います。他にもOAuth認証でのサービスもたくさんありますので是非参考にしてDataSpiderと繋いでみてください。
************************************************************
###### 実行方法についての補足
本来、DataSpiderのOAuth 2.0の接続設定では、
[トークンを発行する]→[認可コード取得]→取得した認可コードを貼り付けて[OK]で、
トークンが取得でき正しく扱われます。

ただわたしがやってみたところ、[OK]を押下すると、エラー（code_verifierが見つからない）となってしまいました。そのため、今回は記事内容の方法で実施してます。

###### アクセストークンについて
認可コードほど短くはありませんが、アクセストークンには有効期間があります。有効期限内は、ツイート投稿スクリプトを実行できます。但し、同じ内容の投稿はエラーになってしまうので、投稿内容は都度変える必要があります。

###### アクセストークンの再発行について
アクセストークンが期限切れとなった場合は、トークン取得スクリプトの結果ファイルである「refresh_token」を利用して、アクセストークンを取得できます。

例えば、アクセストークン、リフレッシュトークン、有効期限、の情報をDBに保持しておけば、アクセストークンの再取得が必要なのかを判定することが可能になり、状況に応じたスクリプトも作成できますね。
************************************************************