Closed7
AWSのサービス名称(正式)をAPIで取得してみる

スクレイピングなんて不安定。PublicなAPIで取得できる方法を模索する
(AWSのOfficialアイコンをzipではなく、URLで取得するためには正式なサービス名を知る必要がある)
https://docs.aws.amazon.com/images/service-icons/Arch_<正式なサービス名>_32.svg
AWSの製品一覧をデベロッパーツールで見てみるとそれっぽいものがみつかった
https://aws.amazon.com/api/dirs/items/search?item.directoryId=aws-products&sort_by=item.additionalFields.productNameLowercase&sort_order=asc&size=15&item.locale=ja_JP&q_operator=AND&tags.id=aws-products%23type%23service%7Caws-products%23type%23feature```

aws.amazon.com/api/dirs/items
で検索にかけてみる。
クラメソでも似たような試みがあるっぽい

JSONの構成は
{
items: []{
{
item:{
"id": "aws-products#amazon-interactive-video-service",
"locale": "ja_JP",
"directoryId": "aws-products",
"name": "amazon-interactive-video-service",
"author": "awslocservice",
"createdBy": "guifen",
"lastUpdatedBy": "awslocservice",
"dateCreated": "2021-12-01T06:11:38+0000",
"dateUpdated": "2022-12-06T17:24:37+0000",
"additionalFields": {
"pricingUrl": "https://aws.amazon.com/ivs/pricing/?did=ap_card&trk=ap_card",
"freeTierAvailability": "<p> </p>",
"productSummary": "魅力的なライブストリーミング体験を構築",
"launchDate": "2020-07-15",
"productUrl": "https://aws.amazon.com/ivs/?did=ap_card&trk=ap_card",
"productName": "Amazon Interactive Video Service",
"productNameLowercase": "amazon interactive video service",
"productCategory": "メディアサービス"
},
tags:[]}
}
}

'.items[].item.name'
とかだと、大文字小文字の情報が無視されてるのでちょっとだめ。
例えば、AWS RoboMakerなのか AWS Robomakerなのか機械的に判定できない

AWS Supply Chain Supply Planning (近日公開予定)
みたいに、GA前のものだと、ノイズが追加されてる
リリース済み or notを判定できそうな .items[].tags
は無さそうなので、カッコつき文字は除去するのが良さそう

これでとれる
const query =async()=>{
const result = []
const page_size = 100
let page=1
while(true){
const res = await fetch(`https://aws.amazon.com/api/dirs/items/search?item.directoryId=aws-products&sort_by=item.additionalFields.productNameLowercase&sort_order=asc&size=${page_size}&item.locale=en_US&q_operator=AND&tags.id=aws-products%23type%23service%7Caws-products%23type%23feature&page=${page}`)
const data = await res.json()
result.push(data.items)
page++;
if(data.metadata.count < page_size) break;
}
return result.flat()
}
query().then((d)=>{
const names = d.map(a=>a.item?.additionalFields?.productName)
const services = [...new Set(names.map(a=>a.replace(/\(.*?\)/g, '').trim().replace(/\s/g,"-")))]
services.map(s=>console.log(`https://docs.aws.amazon.com/images/service-icons/Arch_${s}_32.svg`))
})

存在しないものもある。まだ、最適化できそうだけど一旦おしまい
このスクラップは2023/12/29にクローズされました