I came across grpcurl via the orange
site, seems like exactly what i need
Tried it with the actors API, used on the current desktop site:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl actor-and-article.annex.radiko.jp:443 describe grpc.health.v1.Health is a service: service Health { rpc Check ( .grpc.health.v1.HealthCheckRequest ) returns ( .grpc.health.v1.HealthCheckResponse ); rpc Watch ( .grpc.health.v1.HealthCheckRequest ) returns ( stream .grpc.health.v1.HealthCheckResponse ); } grpc.reflection.v1.ServerReflection is a service: service ServerReflection { rpc ServerReflectionInfo ( stream .grpc.reflection.v1.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1.ServerReflectionResponse ); } grpc.reflection.v1alpha.ServerReflection is a service: service ServerReflection { rpc ServerReflectionInfo ( stream .grpc.reflection.v1alpha.ServerReflectionRequest ) returns ( stream .grpc.reflection.v1alpha.ServerReflectionResponse ); } radiko.ActorService is a service: service ActorService { rpc BatchGetActors ( .radiko.BatchGetActorsRequest ) returns ( .radiko.BatchGetActorsResponse ) { option (.google.api.http) = { post: "/v1/actors/batch_get", body: "*" }; option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "BatchGetActors", description: "minds-rの複数のPersonIDから人物データを取得するAPIです。 minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" }; } rpc GetActor ( .radiko.GetActorRequest ) returns ( .radiko.GetActorResponse ) { option (.google.api.http) = { get: "/v1/actors/{actor_key}" }; option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "GetActor", description: "minds-rのPersonIDから人物データを取得するAPI です。minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" }; } rpc SearchActors ( .radiko.SearchActorsRequest ) returns ( .radiko.SearchActorsResponse ) { option (.google.api.http) = { post: "/v1/actors/search", body: "*" }; option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "SearchActors", description: "人物名に対して人物情報を返却するAPIです。 minds-rのPersonIDがArtist CommonsのAcIDと紐付いている場合は、ACの情報が利用されます。" }; } } radiko.ArticleService is a service: service ArticleService { rpc GetArticle ( .radiko.GetArticleRequest ) returns ( .radiko.GetArticleResponse ) { option (.google.api.http) = { get: "/v1/articles/{article_id}" }; option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "GetArticle", description: "article_idの記事を取得します" }; } rpc SearchArticles ( .radiko.SearchArticlesRequest ) returns ( .radiko.SearchArticlesResponse ) { option (.google.api.http) = { post: "/v1/articles/search", body: "*" }; option (.grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { summary: "SearchArticles", description: "radiko newsの記事を返却するためのAPIです。 検索対象は、 出演者名、actor_key,season_key,r_season_key" }; } }
Amazing success!
Continuing in the same fashion:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ for i in .radiko.BatchGetActorsRequest .radiko.BatchGetActorsResponse .radiko.GetActorRequest .radiko.GetActorResponse .radiko.SearchActorsRequest .radiko.SearchActorsResponse .radiko.GetArticleRequest .radiko.GetArticleResponse .radiko.SearchArticlesRequest .radiko.SearchArticlesResponse > do > grpcurl actor-and-article.annex.radiko.jp:443 describe $i > done radiko.BatchGetActorsRequest is a message: message BatchGetActorsRequest { repeated string actor_keys = 1; } radiko.BatchGetActorsResponse is a message: message BatchGetActorsResponse { repeated .radiko.Actor actors = 1; } radiko.GetActorRequest is a message: message GetActorRequest { string actor_key = 1; } radiko.GetActorResponse is a message: message GetActorResponse { .radiko.Actor actor = 1; } radiko.SearchActorsRequest is a message: message SearchActorsRequest { string actor_name = 1; int32 from = 2; int32 limit = 3; } radiko.SearchActorsResponse is a message: message SearchActorsResponse { repeated .radiko.Actor actors = 1; int32 result_count = 2; int32 from = 3; int32 total_count = 4; } radiko.GetArticleRequest is a message: message GetArticleRequest { int32 article_id = 1; } radiko.GetArticleResponse is a message: message GetArticleResponse { .radiko.Article article = 1; } radiko.SearchArticlesRequest is a message: message SearchArticlesRequest { string keyword = 1; string actor_key = 2; string r_season_key = 6; string season_key = 7; int32 from = 100; int32 limit = 101; reserved 3 to 5; } radiko.SearchArticlesResponse is a message: message SearchArticlesResponse { repeated .radiko.Article articles = 1; int32 result_count = 2; int32 from = 3; int32 total_count = 4; } g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ for i in .radiko.Actor .radiko.Article; do grpcurl actor-and-article.annex.radiko.jp:443 describe $i; done radiko.Actor is a message: message Actor { string key = 1; string name = 2; string name_kana = 3; string name_english = 4; repeated .radiko.Actor.Image images = 5; string description = 6; string information = 7; message Image { string url = 1; string genre = 2; int32 width = 3; int32 height = 4; string size_type = 5; } } radiko.Article is a message: message Article { int32 id = 1; string title = 2; string publisher_name = 3; string image_url = 4; string url = 5; } g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl actor-and-article.annex.radiko.jp:443 describe .radiko.Actor.Image radiko.Actor.Image is a message: message Image { string url = 1; string genre = 2; int32 width = 3; int32 height = 4; string size_type = 5; }
Excellent, can probably massage that into a proper .proto file
with not very much effort
so that's rather marvellous, I wonder if I can do the same thing
with the actual useful API:
g@GARRET-LAPTOP-NEW-SHINY-EDITION:~$ grpcurl api.annex.radiko.jp:443 list Failed to list services: server does not support the reflection API
:(