DmdataSharp 0.4.7

There is a newer version of this package available.
See the version list below for details.
dotnet add package DmdataSharp --version 0.4.7                
NuGet\Install-Package DmdataSharp -Version 0.4.7                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DmdataSharp" Version="0.4.7" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add DmdataSharp --version 0.4.7                
#r "nuget: DmdataSharp, 0.4.7"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install DmdataSharp as a Cake Addin
#addin nuget:?package=DmdataSharp&version=0.4.7

// Install DmdataSharp as a Cake Tool
#tool nuget:?package=DmdataSharp&version=0.4.7                

DmdataSharp

dmdata.jp からの情報の取得を楽にするための非公式ライブラリ

NuGet

情報取得のチュートリアル

実装する際は必ずDM-D.S.Sのドキュメントを読みながら進めてください。

1. OAuthクライアントを作成する

img1
DM-D.S.Sの管理画面からOAuthクライアントを作成します。

img2
各項目を埋めます。注意点としては、

  • リダイレクトURIは http://localhost/ を設定してください。
  • URIは厳密に判定されており、大文字が使用できません。
  • 認証周りについては以下のように設定してください。
    • クライアントの種類: 公開
      • 現状このライブラリは認可コードフロー+機密クライアントに対応していません。
    • 使用するフロー: 認可コードフロー/リフレッシュトークンフロー

2. インスタンスを初期化する

APIを叩くためのインスタンスを作成します。 まずはBuilderを作成し、UserAgentなどを設定しておきます(任意)。

// using DmdataSharp;
var builder = DmdataApiClientBuilder.Default
    .UserAgent("アプリ名")
    .Referrer(new Uri("リファラにいれるURL"));

3. 認可を求める

リフレッシュトークンを保存した場合、この手順はスキップすることができます。

1で作成したOAuthクライアントIDと許可を求めたい(呼びたいAPIが該当する)スコープを SimpleOAuthAuthenticator.AuthorizationAsync に渡して各種トークン(資格情報)の取得を行います。

// using DmdataSharp.Authentication.OAuth;
var clientId = "クライアントID";
var scopes = new[] { "contract.list", "telegram.list", "socket.start", "telegram.get.earthquake" };
try
{
    // 認可を得る
    var (refreshToken, accessToken, accessTokenExpires) = await SimpleOAuthAuthenticator.AuthorizationAsync(
        builder.HttpClient,
        clientId,
        scopes,
        "DmdataSharp サンプルアプリケーション",
        url => Process.Start(url),
        "http://localhost:{好きなポート}/",
        TimeSpan.FromMinutes(10));

    // 得た資格情報を登録する(4の内容)
    builder = builder.UseOAuthRefreshToken(clientId, scopes, refreshToken, accessToken, accessTokenExpires);
}
catch (Exception ex)
{
    Console.WriteLine("認証に失敗しました\n" + ex);
    return;
}

{好きなポート} の部分は好みで設定してください。
後述する 内部でホストするHTTPサーバー で使用します。

AuthorizationAsync の解説をしておきます。

Task<(string refreshToken, string accessToken, DateTime accessTokenExpire)> AuthorizationAsync(
    HttpClient client,      // 内部でAPIを呼ぶ際に使用するHttpClient 今回はBuilderで作成したHttpClientを使用します
    string clientId,        // OAuthクライアントID
    string[] scopes,        // 認可を求めるスコープ
    string title,           // 認可時にブラウザ上に表示されるアプリケーション名
    Action<string> openUrl, // URLが求められた際にブラウザを開くためのデリゲート
    string listenPrefix,    // 内部でホストするHTTPサーバーのオプション 1で設定するリダイレクトURIと同じにしてください
    TimeSpan timeout)       // 認可・戻るボタンが押されなかった場合失敗扱いにするまでの時間
内部でホストするHTTPサーバーについて

この認可フローはWebブラウザを使用した方式であるため、認可ボタンを押した後ライブラリ内で建てたHTTPサーバーにリダイレクトすることでトークンの取得を行います。
ファイアウォールの確認画面が表示されてしまうため、基本 localhost でポートもなるべく大きなもの(1024以上)を使用してください。外部に何かを公開してしまうというものではありません。

4. 資格情報を登録する

作成していたBuilderに3で取得した資格情報の登録を行います(3のコード内に含まれています)。
リフレッシュトークンは長期間使用することができるため、起動のたびにブラウザを開かないようにするためにも、アプリケーションに組み込むときは保存しておくとよいでしょう。

builder = builder.UseOAuthRefreshToken(clientId, scopes, refreshToken, accessToken, accessTokenExpires);

accessToken accessTokenExpires は必須ではありません(API実行時に自動で更新されます)。

5. APIクライアントを作成する

BuildV2ApiClient でAPIクライアントを作成します。

using var client = builder.BuildV2ApiClient();

これで各種APIが呼べるようになりました。

Disposeにアクセストークンの失効が含まれているため、アプリケーションの終了時などにDisposeを忘れないようにしましょう

6. 電文リストを取得する

var telegramList = await client.GetTelegramListAsync(limit: 10);

これで最新の電文を10件取得することが可能です。
レスポンスなどはAPIドキュメントを参考にしてください。

注意

ポーリングする場合は必ず cursorToken オプションを使用しましょう。

7. 電文を取得する

using var stream = await client.GetTelegramStreamAsync(id);

keyに取得する電文のKeyパラメータを指定します。これでStreamインスタンスが取得可能です。
メモリ消費削減のためStreamをそのまま返しているため、usingもしくはDisposeを忘れないようにしましょう。

var telegramString = await client.GetTelegramStringAsync(id);

Streamの扱いがめんどくさい人向けにstringに変換する処理を追加したメソッドもあります。

取得からXMLを解析するまでのサンプル
XDocument document;
XmlNamespaceManager nsManager;

using (var telegramStream = await ApiClient.GetTelegramStreamAsync("電文のId"))
using (var reader = XmlReader.Create(telegramStream, new XmlReaderSettings { Async = true }))
{
    document = await XDocument.LoadAsync(reader, LoadOptions.None, CancellationToken.None);
    nsManager = new XmlNamespaceManager(reader.NameTable);
}
nsManager.AddNamespace("jmx", "http://xml.kishou.go.jp/jmaxml1/");
// 地震情報の場合以下の追記が必要
// nsManager.AddNamespace("eb", "http://xml.kishou.go.jp/jmaxml1/body/seismology1/");
// nsManager.AddNamespace("jmx_eb", "http://xml.kishou.go.jp/jmaxml1/elementBasis1/");

// XPathを使用して電文のタイトルが取得できる
var title = document.Root.XPathSelectElement("/jmx:Report/jmx:Control/jmx:Title", nsManager)?.Value;

8. アプリケーションの連携を解除する

アプリケーションの連携を解除する際はリフレッシュトークンの失効が必要です。

if (client.Authenticator is OAuthAuthenticator authenticator)
    await authenticator.Credential.RevokeRefreshTokenAsync();

(設計が微妙で苦しい処理になってます、ごめんなさい)

WebSocketに接続する

1. クライアントインスタンスを作成する

using var socket = new DmdataV2Socket(client);

1で作成したAPIクライアントを引数にソケットのインスタンスを作成します。

2. イベントハンドラを登録する

データを受信した際のイベントハンドラを登録します。

socket.Connected += (s, e) => Console.WriteLine("EVENT: connected");
socket.Disconnected += (s, e) => Console.WriteLine("EVENT: disconnected");
socket.Error += (s, e) => Console.WriteLine("EVENT: error  c:" + e.Code + " e:" + e.Error);
socket.DataReceived += (s, e) =>
{
    Console.WriteLine($@"EVENT: data  type: {e.Head.Type} key: {e.Id} valid: {e.Validate()} body: {e.GetBodyString().Substring(0, 20)}...");
};
Connected

接続が完了し、 start を受信したときに発火します。
メッセージの内容をそのまま参照することができます。

Disconnected

切断された・切断したときに発火します。

Error

error を受信したときに発火します。
メッセージの内容をそのまま参照することができます。

DataReceived

data を受信したときに発火します。

public bool Validate()

電文が正しいかどうかの検証を行います。
正しくない場合、大抵のケースはこのライブラリのバグです。

public Stream GetBodyStream()

圧縮されているかなどを自動で判別し展開やデコードを行います。
こちらも念の為usingもしくはDisposeを忘れないように注意してください。

public string GetBodyString(Encoding? encoding = null)

GetBodyStream にstringに変換する処理を追加したものです。

XMLを解析するまでのサンプル

GetTelegramを同じノリで取得できます

XDocument document;
XmlNamespaceManager nsManager;

using (var telegramStream = data.GetBodyStream())
using (var reader = XmlReader.Create(telegramStream, new XmlReaderSettings { Async = true }))
{
    document = await XDocument.LoadAsync(reader, LoadOptions.None, CancellationToken.None);
    nsManager = new XmlNamespaceManager(reader.NameTable);
}
nsManager.AddNamespace("jmx", "http://xml.kishou.go.jp/jmaxml1/");
// 地震情報の場合以下の追記が必要
// nsManager.AddNamespace("eb", "http://xml.kishou.go.jp/jmaxml1/body/seismology1/");
// nsManager.AddNamespace("jmx_eb", "http://xml.kishou.go.jp/jmaxml1/elementBasis1/");

// XPathを使用して電文のタイトルが取得できる
var title = document.Root.XPathSelectElement("/jmx:Report/jmx:Control/jmx:Title", nsManager)?.Value;

3. 接続を開始する

await socket.ConnectAsync(new SocketStartRequestParameter(
    TelegramCategoryV1.Earthquake,
    TelegramCategoryV1.Scheduled,
    TelegramCategoryV1.Volcano,
    TelegramCategoryV1.Weather
)
{
    AppName = "アプリ名",
});

SocketStartRequestParameter の引数には受信したい情報のカテゴリを、 AppName は管理画面の 状況 ページで表示される メモ の指定が行なえます。(文字数制限に注意)
その他にも Types で電文のフィルタなども行えますのでご活用ください。

発生する例外について

APIキー認証の場合、メッセージにAPIキーが含まれている場合文字の置き換えを行います。

DmdataAuthenticationException

各種資格情報が失効しているか、認可されませんでした。

DmdataUnauthorizedException

認証情報が不正です。

DmdataForbiddenException

認証情報が不正です。
使用中の資格情報に権限がない場合などに発生します。
APIv1の場合はAPIキーが不正な場合もこの例外が発生します。

DmdataApiTimeoutException

APIをリクエストした際にタイムアウトしました。

DmdataRateLimitExceededException

レートリミットに引っかかりました。
このライブラリは同時アクセスの制御を行いません。
しばらく待ってアクセスし直してください。

DmdataException

上記の例外が継承している基底クラスです。
いくつかのエラーで使用されています。

また、ネットワークエラーの場合はその状況に合わせた例外が発生します。

このライブラリで未実装のAPIを使用したい場合

このライブラリには実装されていない、dmdata.jpのAPIを使用したい場合は DmdataV2ApiClient を継承したクラスを作ることで拡張可能です。
DmdataApiClientBuilderBuild メソッドの型引数に継承したクラスを入れることで既存の機能と同様に初期化することができます。

注意点としては、コンストラクタの引数は継承元のクラスに合わせるようにしてください。
protected なメソッドを使用することでライブラリの認証機能などを使用することができます。詳細は DmdataV2ApiClient のコードなどを読んでみてください。

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (1)

Showing the top 1 popular GitHub repositories that depend on DmdataSharp:

Repository Stars
ingen084/KyoshinEewViewerIngen
Custom client for Kyoshin Monitor
Version Downloads Last updated
0.5.6 806 7/9/2023
0.5.5 747 8/23/2022
0.5.4 413 7/24/2022
0.5.3 491 7/23/2022
0.5.2.2 388 7/21/2022
0.5.2.1 573 4/19/2022
0.5.2 441 4/17/2022
0.5.1.1 523 3/6/2022
0.5.1 443 3/6/2022
0.5.0.3 430 3/1/2022
0.5.0.2 424 2/28/2022
0.5.0.1 430 2/23/2022
0.5.0 424 2/20/2022
0.4.9.1 448 2/4/2022
0.4.9 412 11/28/2021
0.4.8.1 329 11/8/2021
0.4.8 371 10/9/2021
0.4.7 339 10/9/2021
0.4.6 328 10/3/2021
0.4.5 374 9/12/2021
0.4.4 408 8/8/2021
0.4.3 333 8/5/2021
0.4.2 367 7/31/2021
0.4.1 383 7/4/2021
0.4.0 387 7/4/2021
0.3.2 373 4/30/2021
0.3.1 332 4/11/2021
0.3.0.3 341 4/3/2021
0.3.0.2 336 4/3/2021
0.3.0.1 328 4/3/2021
0.3.0 319 4/3/2021
0.2.0 356 2/24/2021
0.1.0 399 2/2/2021