im@sparqlを触ってみる その1 - PowerShellでデータを取得する

その2

はじめに

自分のプログラミング以外の趣味関係のファンサイトに、「im@sparql」というサイトがある。

こちらはWEB上にデータベースがあり、クエリ文字列を付加してGETすれば情報が取れるというものらしい。 (自分も良く分かっていないので詳細は以下なども参照)

京都肉上げ croMisa

自分自身、各種基本知識・理解が不足しているため、「とりあえず動かしてみる」を目標に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

JavaScriptXMLHttpRequestやCOMのMSXML2.XMLHTTPを使用した場合、responseTextとしてJSON文字列が取得できた。

しかし、.NET Framework系のメソッドを使用した場合はXMLで結果が返却された。

詳しい人からGET時のURLにパラメータを追加することで結果を制御できるとの話があり、試すとうまくいった('&output=json'の付与)。

文字化け

XMLで結果が返却されたときの話だが、エンコードが違うのか文字化けをしてしまった。

エンコードをUTF8に設定することで文字化けせずにXMLを取得することができた。