🥶

Twitter API v1からv2に移行する際に困ったこと

2023/05/25に公開

仕事で開発を行っているサービスでは、Twitter API v1を利用していたのですが、Twitterがv2の利用を推奨していることもあり、移行を行うことになりました。

v2移行作業前に気づかなかった、v2の問題点がかなりあったため共有したいと思います。

移行内容

サービスに登録するユーザーの認証情報を利用し、
TwitterのScreenName(@から始まるID)と名前のどちらかにより、下記ユーザー情報を取得する。

  • ユーザーID
  • 名前
  • ScreenName
  • ヘッダー画像
  • アイコン画像
  • 概要文(Discription)

V1ではどのように実装していたか

V1ではユーザー検索(users/search)エンドポイントにより「q」パラメータで名前やScreenNameを差し込むことで該当するユーザーの一覧を取得することができた。

https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-users-search

V2ではユーザー名による検索ができない

V2では、users.searchエンドポイントが存在しないため上記のような検索を行うことができない。
現時点で提供されているユーザー検索のエンドポイントは下記の通り。

  • TwitterUserIDによる複数検索
  • TwitterUserIDによる単体検索
  • TwitterUserName(ScreenNameから名前が変わった模様。@から始まるIDのこと)による複数検索
  • TwitterUserNameによる単体検索
  • 現在認証中のユーザー情報取得

https://developer.twitter.com/en/docs/twitter-api/users/lookup/api-reference

名前による検索が現在できなくなっている。

V2ではヘッダー画像の取得ができない

V2の User検索で取得できるオブジェクトは下記の通り。

{
    "data": [
        {
            "id": "2244994945",
            "name": "Twitter Dev",
            "username": "TwitterDev",
            "location": "127.0.0.1",
            "entities": {
                "url": {
                    "urls": [
                        {
                            "start": 0,
                            "end": 23,
                            "url": "https://t.co/3ZX3TNiZCY",
                            "expanded_url": "/content/developer-twitter/en/community",
                            "display_url": "developer.twitter.com/en/community"
                        }
                    ]
                },
                "description": {
                    "hashtags": [
                        {
                            "start": 23,
                            "end": 30,
                            "tag": "DevRel"
                        },
                        {
                            "start": 113,
                            "end": 130,
                            "tag": "BlackLivesMatter"
                        }
                    ]
                }
            },
            "verified": true,
            "description": "The voice of Twitter's #DevRel team, and your official source for updates, news, & events about Twitter's API. \n\n#BlackLivesMatter",
            "url": "https://t.co/3ZX3TNiZCY",
            "profile_image_url": "https://pbs.twimg.com/profile_images/1267175364003901441/tBZNFAgA_normal.jpg",
            "protected": false,
            "pinned_tweet_id": "1255542774432063488",
            "created_at": "2013-12-14T04:35:55.000Z"
        }
    ],
    "includes": {
        "tweets": [
            {
                "id": "1255542774432063488",
                "text": "During these unprecedented times, what’s happening on Twitter can help the world better understand & respond to the pandemic. \n\nWe're launching a free COVID-19 stream endpoint so qualified devs & researchers can study the public conversation in real-time. https://t.co/BPqMcQzhId"
            }
        ]
    }
}

V1は下記のとおり。

{
	"id": 6253282,
	"id_str": "6253282",
	"name": "Twitter API",
	"screen_name": "TwitterAPI",
	"location": "San Francisco, CA",
	"profile_location": null,
	"description": "The Real Twitter API. Tweets about API changes, service issues and our Developer Platform. Don't get an answer? It's on my website.",
	"url": "https:\/\/t.co\/8IkCzCDr19",
	"entities": {
		"url": {
			"urls": [{
				"url": "https:\/\/t.co\/8IkCzCDr19",
				"expanded_url": "https:\/\/developer.twitter.com",
				"display_url": "developer.twitter.com",
				"indices": [
					0,
					23
				]
			}]
		},
		"description": {
			"urls": []
		}
	},
	"protected": false,
	"followers_count": 6133636,
	"friends_count": 12,
	"listed_count": 12936,
	"created_at": "Wed May 23 06:01:13 +0000 2007",
	"favourites_count": 31,
	"utc_offset": null,
	"time_zone": null,
	"geo_enabled": null,
	"verified": true,
	"statuses_count": 3656,
	"lang": null,
	"contributors_enabled": null,
	"is_translator": null,
	"is_translation_enabled": null,
	"profile_background_color": null,
	"profile_background_image_url": null,
	"profile_background_image_url_https": null,
	"profile_background_tile": null,
	"profile_image_url": null,
	"profile_image_url_https": "https:\/\/pbs.twimg.com\/profile_images\/942858479592554497\/BbazLO9L_normal.jpg",
	"profile_banner_url": null,
	"profile_link_color": null,
	"profile_sidebar_border_color": null,
	"profile_sidebar_fill_color": null,
	"profile_text_color": null,
	"profile_use_background_image": null,
	"has_extended_profile": null,
	"default_profile": false,
	"default_profile_image": false,
	"following": null,
	"follow_request_sent": null,
	"notifications": null,
	"translator_type": null
}

V1に比べV2は無駄な要素が少なくシンプルになった一方、なぜかprofile_banner_urlが存在しないため、ヘッダー画像の取得ができなくなってしまった。

対応策

TwitterAPI経由では現在取得方法がなさそうなので、今後のアップデートを待つことに...
v1辞めます!v2に移行してね!という割に、後方互換性がないのはいかがなものかと。。

Discussion