年末になったので、そろそろ半周年を迎えるタイッツーのAPI周りの話。
色々遊んでるんですが、プログラム初学者である僕ががタイッツーのAPIを使って色々するまでのファーストステップ。
主にこの辺で使ってます。
片思いチェッカー
https://shimo-codex.com/wp/tights/kataomoi/
タイッツーログ
https://shimo-codex.com/wp/tights/taittsuuLog/
APIキーを取得しよう
7月の初期段階だと作者様にpixivで声をかけて直接もらってたんですが、今って設定画面から随時再取得ができるんですよね。
設定>サポーター向け機能
https://taittsuu.com/setting/supporter

支援者かどうかのpixivID同期は一定周期でやってるっぽくて、今日時点では12月1日が最終でした。
つまり12月1日以降に支援者登録した場合は、次回周期まで待つ必要があるってことっすね。
それだけ支援者も増えたって認識でいいのか、単純に作業自動化のためなのか。
実際に取得する
APIキーがもらえればもうソースコードを書くだけで出来ちゃうのが良いところ。
僕の場合は全部PHPで取得しています。
レンタルサーバーを使っているので、Pythonでやるには色々と面倒があるためです。
PHPで取得をする場合、リクエストをcurlというので送ることもできるらしいんですが、よく分からないので標準的?な方法で。
初学者なのでこんなのも使ったことはありませんが、案外簡単に取得できるもので。
リクエストするAPI(公式より引用)
# 初回
curl https://publicapi.taittsuu.com/publicapi/v0.1/users/{ユーザーID}/taiitsus \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key"
# 続きを取得
curl https://publicapi.taittsuu.com/publicapi/v0.1/users/{ユーザーID}/taiitsus \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key" \
-G -d next=75
取得用関数(functions.php)
function getUserTweetsList($userId, $next = null) {
global $xxx; // ここに取得したAPIキーを挿入する
$apiUrl = 'https://publicapi.taittsuu.com/publicapi/v0.1/users/' . $userId . '/taiitsus';
$headers = array(
'Content-Type: application/json',
'X-API-KEY: ' . $xxx,
);
$options = array(
'http' => array(
'header' => implode("\r\n", $headers),
'method' => 'GET',
),
);
$context = stream_context_create($options);
$result = file_get_contents($apiUrl, false, $context);
$response = json_decode($result, true);
return $response;
}
呼び出し(index.php)
<?php
require_once '_conf/functions.php'; //フォルダ構成によって変更
$userId = 'saikofall';
$posts = getUserTweetsList($userId);
echo '<pre>';
var_dump($posts);
echo '</pre>';
?>
初学者の理解
書いてある通りですが、リクエスト対象のAPIにあるURLが呼び出すURLです。
ここの{ユーザーID}って場所にタイッツーでのユーザーIDを入れた状態で呼び出すと、対象のタイーツ一覧が返却されます。
※ユーザーIDは、僕の場合「@saikofall」なので、saikofallがそれになります
取得用関数である”getUserTweetsList”の$headersと$optionsはオプションなので全部これ使いまわしてます。
公式の指定通りjson指定で。
あとはstream_context_createでオプションを定義したらfile_get_contentsでデータを取得しています。
jsonで返却されてるので、json_decodeで各種データを連想配列化して返却して終了です。
ちなみにですが、APIキーは別ファイルにして、それをIPアドレスで制限かけるとかしときましょうね。
GoogleAPIとかとは違ってURL認証等を経ているわけではないので、APIキーさえあれば好きに呼び出すことができます。
FTP制限かけたりとか、APIキーを入力したファイルに対してアクセス制限かけておけば良いんじゃないかなと。
取得できたデータ
index.phpで$postsにgetUserTweetsListから取得してきたデータが返って来てます。
具体的には、僕のユーザーIDを入れて関数呼び出しすると、下記のような形で返ります。
array(2) {
["data"]=>
array(42) {
[0]=>
array(26) {
["id"]=>
int(15412149)
["user_id"]=>
int(92345)
["content"]=>
string(54) "イサンの狐雨がWAWに昇格で笑っちゃった"
["exist_add_content"]=>
int(0)
["post_type"]=>
int(10)
["is_defensive"]=>
int(0)
["is_sensitive"]=>
int(0)
["sensitive_warning"]=>
NULL
["scope"]=>
int(10)
["exist_media"]=>
int(0)
["exist_url"]=>
int(0)
["exist_hashtag"]=>
int(0)
["target_rt_post_id"]=>
NULL
["created_at"]=>
string(27) "2023-12-04T08:49:31.000000Z"
["user_name"]=>
string(9) "saikofall"
["user_screenname"]=>
string(9) "saikofall"
["is_verified"]=>
int(1)
["is_locked"]=>
int(0)
["image_path"]=>
string(108) "https://files.taittsuu-media.com/profiles/92/f98df1dcd40478987ac49667664318411656d4035664da43.jpg?0a38687e39"
["like_count"]=>
int(0)
["rt_count"]=>
int(0)
["hashtags"]=>
array(0) {
}
["media"]=>
array(0) {
}
["is_liked"]=>
bool(false)
["is_retaiitsued"]=>
bool(false)
["is_ignored"]=>
bool(false)
}
...
}
["next"]=>
int(15142924)
}
これはあくまで初回読み込み分だけなので、35件~40件ぐらい返って来てましたね。
ちなみに中身にはRTや広告用タイーツも混ざってくるので、純粋に自分の投稿だけが返却されるわけではないです。
規約に「取得したタイーツ一覧を画面上に表示して使用する用途の場合、いかなる場合でも広告タイーツを除外してはいけません。」とあるので、取得したデータをそのまま利用する場合は、広告タイーツの除外などは禁止です。
取得したデータを出力
あとは普通にforeachなりなんなりで取得したデータを出力するだけです。
上記例ではvar_dump()してますが、普通に使うんだったらforeach()でpostとして出力するのが手っ取り早いんじゃないですかね。
僕の場合はこれとは別に取得用関数を用意して、jsによるajax処理で随時呼び出しという形にしています。
PHPだとどうしても初期読み込みが発生してしまうので、それを避けるための処理って感じです。
ちなみに、取得データの最後にnextがありますが、呼び出す時にこれを付けておくと、次のタイーツ一覧を呼び出すことができます。
if ($next) {
$apiUrl .= '?next=' . $next;
}
こんな感じですかね。
なので一応途中からでも取得はできるはず…。
(例えば7月分の投稿からスタートとか?)
基本的に最新から取得をはじめてるのでやったことはないですが、nextの値がどういうものになってるのかちゃんと解析すれば、「7月分を読み込む」とかは可能になりそうな感じしますね。
これ書きながら、今更ながらに思いました。
こんなこと書いたわけ
年末じゃないですか。
世の中「プログラムアドベントカレンダー!」みたいなのやってわちゃわちゃ楽しそうじゃないですか。
でも僕はガチプログラマーってわけじゃないへなちょこマークアップエンジニアなので、そういうのに参加できるわけでもないんですよね。
だったら自分のブログで勝手にやるか、みたいなね?
上記の内容について作者さんとかから怒られが発生したら即刻取り下げます。
なんちゃってエンジニアなので、何かが間違ってる可能性があって怖いのはありますし。
またなんかあったらこういうの書きます。
テックブログ書くような人間ではないんですが、ちょっと楽しかったので。