文字処理をする場合に便利なコマンドの一つに Replace コマンドがあります。PowerShellでのログ処理などで頻繁に使用しています。
Visual Basicでも当然存在しているはずですが、実はまだ使ったことがなかったので、サンプルの記録もしていません。
先日、RadikoPad_cmd を製作するにあたり、ラジコサーバーとのやりとりで、HTTPレスポンスを処理するときに使ったので、ここで記録に残すことにします。
前のメモで、curl を使って、ラジコプレミアムにログインすると、次のようなレスポンスが返ってきます。と、書きました。
{"member_ukey":"ANDEHFA","privileges":["1"],"radiko_session":"d50abeb67def0082091c0703fb3eeac9e364fbad","areafree":"1","status":"200","twitter_name":null,"facebook_name":null,"unpaid":"0","paid_member":"1"}
よくみると、
文字列名、コロン:、値 、カンマ , 、文字列名 ・・・・・という繰り返し情報で、文字列名と値がダブルクォーテーションに囲まれています。文字列の最初と最後が、中括弧になっていますが、これを取り除けば、CSV形式です。
プレミアムログインに必要な情報処理する前に、不要な記号を Replace コマンドを使って変換(今回は空文字と置き換える)し成形します。次に、カンマで区切られた範囲を一つのレコードとして取り出し、さらに : コロンをセパレータとして、変数名と値に分解します。
以下スクリプトの赤字の部分が、ラジコからのレスポンスを処理して、必要な部分を取り出せるようにしたもの。黒字部分は先日紹介したものと同一。
Replace コマンドで、HTTPレスポンスを処理しやすいように成形し、Split コマンドでフィールドを分離した後、配列に詰め、For Each 文 と If文で内容を確認して、必要な値だけを変数に詰め込んで次の処理に進めるようにしています。
Imports System
Module Program
Sub Main(args As String())
Dim mail As String = "radiko@example.com"
Dim pass As String = "areafree"
Dim login1_para1 As String = "curl.exe -c cookie.txt --request POST "
Dim login1_para2 As String = "--data-urlencode ""mail=" & mail & """ "
Dim login1_para3 As String = "--data-urlencode ""pass=" & pass & """ "
Dim login1_para4 As String = """https://radiko.jp/v4/api/member/login"""
Dim login1 As String = login1_para1 & login1_para2 & login1_para3 & login1_para4
Dim login1_result As String = ""
'Console.WriteLine(login1)
'Console.WriteLine()
Dim p As New System.Diagnostics.Process()
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardInput = False
p.StartInfo.CreateNoWindow = True
p.StartInfo.Arguments = "/c " & login1
p.Start()
Dim results As String = p.StandardOutput.ReadToEnd()
p.WaitForExit()
p.Close()
Console.WriteLine(results)
login1_result = results
'変数radiko_sessionを定義して初期化
Dim radiko_session As String = ""
'変数 areafree を定義して、初期化
Dim areafree As String = ""
'セッション情報を分解
'不要な文字を削除
Dim login1_result2 = ((login1_result.Replace("{", "")).Replace("}", "")).Replace("""", "")
'配列を作って、カンマとカンマの間のフィールドを一つずつ配列に入れる
Dim l_resp_part() As String = login1_result2.Split(",")
'For Each とif文をを使って、配列内を一つずつ確認し、radiko_session と areafree を探す。
'対象の変数名が定義されていれば、変数に取り込む。
For Each l_resp As String In l_resp_part
If l_resp.Contains("radiko_session:") = True Then
radiko_session = l_resp.Replace("radiko_session:", "")
Console.WriteLine("radiko_session:" & radiko_session)
ElseIf l_resp.Contains("areafree:") = True Then
areafree = l_resp.Replace("areafree:", "")
Console.WriteLine("areafree:" & areafree)
End If
Next
End Sub
End Module
毎度のように Console.WriteLine はデバッグ情報の出力用。
こんな感じになります。ラジコプレミアムログインに成功した場合に必要な情報はこの二つ。
areafree:1 radiko_session:992b45996a36c71616807cc6517bfae833472993
ラジコプレミアム会員じゃない場合は、areafree:空っぽ となり、ログイン失敗の場合はareafree:空っぽ, radiko_session:空っぽ になるはず。areafree:”0″ の方がいいかな?areafreeの型は string なので、どっちでもいいと思います。
厳密に処理するなら、Radiko あるあるで、レスポンスが大文字だったり小文字だったりするため、変数名を一度全部小文字か全部大文字に変換した後、比較する方が安全なのですが、レスポンスを見た感じ、変数名は全部小文字なので、そこまですることないかと手を抜いています。(将来、ログインできるはずなのに失敗する~って問題になるかも。)まじめにやるなら、さらに、本当にログインできているかどうかを確認する方がいいですが、ここでは行っていません。
以上で、Visual Basic .Net による、ラジコプレミアムへの手抜きログインスクリプトでした。
ラジコタイムフリーをダウンロードできるようになるまでには、Auth1とAuth2、あと二つのステップを通過する必要がありますが、それはまた後日。