im@sparqlを触ってみる その1 - PowerShellでデータを取得する
→ その2
はじめに
自分のプログラミング以外の趣味関係のファンサイトに、「im@sparql」というサイトがある。
こちらはWEB上にデータベースがあり、クエリ文字列を付加してGETすれば情報が取れるというものらしい。 (自分も良く分かっていないので詳細は以下なども参照)
自分自身、各種基本知識・理解が不足しているため、「とりあえず動かしてみる」を目標にPowerShellから情報を取得するコードを作ってみた。
取得する情報
今回はim@sparqlの「千早のセリフテキストを取得」のクエリをそのまま使用して、情報を取得する。
コード
# ベースのURL [string]$baseUrl = 'https://sparql.crssnky.xyz/spql/imas/query?query=' # https://sparql.crssnky.xyz/imas/ 内の「千早のセリフテキストを取得」のクエリ # 一行に納めるため、SplitしてからJoinしている [string]$query = [string]::Join( '' , @' PREFIX schema: <http://schema.org/> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#> SELECT * WHERE { ?s rdf:type imas:ScriptText; imas:Source ?source; schema:text ?text. ?source schema:name ?name; filter(regex(str(?name),"千早")) }order by ?text '@.Split("`r`n") ) # クエリ文字列をエスケープ # また、そのままだとXMLで結果が返されるため '&output=json' を付与する [uri]$openUri = [uri]($baseUrl + [uri]::EscapeDataString( $query ) + '&output=json') # 情報取得 $result = Invoke-WebRequest -Method Get -Uri $openUri if ( $result.StatusCode -ne 200 ) { throw } # $result.Content はByte配列なので、文字列(JSON)に変換し # JSON文字列をPSObjectへ変換 $json = [Text.Encoding]::UTF8.GetString( $result.Content ) | ConvertFrom-Json # 必要な情報を出力 $json.results.bindings | select -Property @( @{N="Name";E={$_.name.value}}, @{N="Text";E={$_.text.value}} )
コンソール出力
Name Text ---- ---- 如月千早 …! 如月千早 …………。 如月千早 …いえ、もうすぐ本番ですし、そこで体力を使い果たしてしまったら問題ですよ。 (中略) 如月千早 静香…あなたならいつか、できる時がくるわ。アイドルを続けていれば、必ず。…必ずよ。
ハマったところ
結果がXML
JavaScriptのXMLHttpRequest
やCOMのMSXML2.XMLHTTP
を使用した場合、responseText
としてJSON文字列が取得できた。
しかし、.NET Framework系のメソッドを使用した場合はXMLで結果が返却された。
詳しい人からGET時のURLにパラメータを追加することで結果を制御できるとの話があり、試すとうまくいった('&output=json'の付与)。