Flutter Battle.net API集成插件battle_net的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter Battle.net API集成插件battle_net的使用

Dart 包装器客户端用于Battle.Net API

workflow GitHub Pub package publisher Pub Points

你可以在你的 Flutter/Dart 应用程序中轻松地与 BattleNet 服务通信。

可用功能

Battle.net OAuth APIs

Battle.net OAuth APIs

  • 用户认证

    • 授权请求 - 授权请求是授权码流的第一部分,OAuth 的认证流程用于代表用户执行 API 请求。
    • 访问令牌请求 - 访问令牌请求是授权码流的第二部分。
    • 用户信息 - 返回与当前承载令牌关联的用户的基本信息。
  • 应用程序认证

    • 发送客户端凭据 - 访问令牌请求。这是客户端凭据流所需的唯一请求,OAuth 的认证流程旨在为应用服务器提供支持。
  • 令牌验证

    • 发送令牌验证 - 验证给定的承载令牌是否有效,并检索有关令牌的元数据,包括用于创建令牌的 <strong>client_id</strong>,过期时间戳,以及授予令牌的作用域。

World of Warcraft 游戏数据 APIs

World of Warcraft 游戏数据 APIs

  • WoW Token API

    • 获取 Token 索引 - 返回 WoW Token 索引。
  • 连接的区域 API

    • 连接的区域 - 通过 ID 返回连接的区域。
    • 连接的区域搜索 - 执行连接区域的搜索。

开始使用

pubspec.yaml 文件中添加库的最新版本:

dependencies:
  battle_net: ^<latest_version>

现在可以在 Dart 代码中使用:

import 'package:battle_net/battle_net.dart';

使用方法

提供可以在 BattleNet 开发者账户中找到的 client idclient secret

final BattleNet battleNet = 
  BattleNet(clientId: 'clientId', clientSecret: 'clientSecret');

现在可以开始从 BattleNet 服务获取数据了。

final ClientCredentialsResponse clientCredentialsResponse = 
    await battleNet.postClientCredentials();

获取 Token 索引

你可以使用以下示例获取 EU 地区的零售版 WoW Token 价格。

final TokenIndex tokenIndex = await battleNet.getTokenIndex(
    accessToken: clientCredentialsResponse.accessToken,
    region: BattleNetRegion.eu,
    namespace: BattleNetNamespace.dynamic,
    locale: BattleNetLocale.enGB);

连接的区域

你还可以使用以下示例通过 ID 获取连接的区域详情。

const int connectedRealmId = 1301;
final ConnectedRealmResponse connectedRealm = await battleNet.getConnectedRealm(
    accessToken: clientCredentialsResponse.accessToken,
    region: BattleNetRegion.eu,
    namespace: BattleNetNamespace.dynamic,
    id: connectedRealmId);

连接的区域搜索

你还可以使用以下示例搜索连接的区域。

final ConnectedRealmSearchResponse result = 
    await battleNet.getConnectedRealmSearch(
      accessToken: clientCredentialsResponse.accessToken,
      region: BattleNetRegion.eu,
      namespace: BattleNetNamespace.dynamic,
      statusType: ServerStatus.UP,
      realmsTimezone: RealmTimezone.EUROPE_PARIS,
      hasQueue: false,
      populationType: PopulationType.FULL,
      realmsIsTournament: false,
);

额外信息

可用的 BattleNet 地区

API 数据仅限于特定地区。BattleNet 地区是指要检索的数据所在的区域。本地化支持仅限于暴雪社区游戏网站支持的位置。

地区 数据
US Battle.net, WoW, D3, SC2
EU Battle.net, WoW, D3, SC2
KR Battle.net, WoW, D3, SC2
TW Battle.net, WoW, D3, SC2

例如,

BattleNetRegion.eu

本地化

所有可用的 API 资源都使用 BattleNetLocale 参数提供本地化的字符串。支持的语言因地区而异,并且与暴雪社区网站支持的语言一致。

地区 主机 可用的语言
北美 https://us.api.blizzard.com/ en_US, es_MX, pt_BR
欧洲 https://eu.api.blizzard.com/ en_GB, es_ES, fr_FR, ru_RU, de_DE, pt_PT, it_IT
韩国 https://kr.api.blizzard.com/ ko_KR
台湾 https://tw.api.blizzard.com/ zh_TW

例如,

BattleNetLocale.enGB

版权与许可

该项目遵循 MIT 许可证


完整示例代码

以下是一个完整的示例代码,展示了如何使用 battle_net 插件进行各种操作。

import 'package:battle_net/battle_net.dart';
import 'package:battle_net/src/models/realm/population_type_localised.dart';
import 'package:battle_net/src/models/realm/realm_localised.dart';
import 'package:battle_net/src/models/realm/server_status_localised.dart';

/// 这个示例演示了如何使用额外信息获取 [TokenResponse] 数据
Future<void> main() async {
  /// 提供 client id 和 client secret
  final BattleNet battleNet =
      BattleNet(clientId: 'clientId', clientSecret: 'clientSecret');

  /// 获取访问令牌,提供要检索数据的区域
  final ClientCredentialsResponse clientCredentialsResponse =
      await battleNet.postClientCredentials();

  /// 验证给定的承载令牌是否有效并检索有关令牌的元数据
  final CheckTokenResponse checkTokenResponse = await battleNet
      .postTokenValidation(token: clientCredentialsResponse.accessToken);
  print(checkTokenResponse);

  /// 获取 EU 地区零售版 WoW Token 价格
  final TokenIndexResponse tokenIndex = await battleNet.getTokenIndex(
      accessToken: clientCredentialsResponse.accessToken,
      region: BattleNetRegion.eu,
      namespace: BattleNetNamespace.dynamic,
      locale: BattleNetLocale.enGB);
  print(tokenIndex);

  /// 获取 EU 地区经典版 WoW Token 价格
  final TokenIndexResponse tokenIndexClassic = await battleNet
      .postClientCredentials()
      .then((ClientCredentialsResponse response) => battleNet.getTokenIndex(
          accessToken: response.accessToken,
          region: BattleNetRegion.eu,
          namespace: BattleNetNamespace.dynamicClassic,
          locale: BattleNetLocale.enGB));
  print(tokenIndexClassic);

  /// 执行连接区域的搜索
  final ConnectedRealmSearchResponse connectedRealmSearchResponse =
      await battleNet.postClientCredentials().then(
          (ClientCredentialsResponse value) => battleNet.getConnectedRealmSearch(
                accessToken: value.accessToken,
                region: BattleNetRegion.eu,
                namespace: BattleNetNamespace.dynamicClassic,
                statusType: ServerStatus.UP,
                realmsTimezone: RealmTimezone.EUROPE_PARIS,
                hasQueue: false,
                populationType: PopulationType.FULL,
                realmsIsTournament: false,
              ));
  print(connectedRealmSearchResponse);

  /// 获取连接的 'Outland' 区域详情
  const int connectedRealmId = 1301;
  final ConnectedRealmSearchData connectedRealm =
      await battleNet.getConnectedRealm(
          accessToken: clientCredentialsResponse.accessToken,
          region: BattleNetRegion.eu,
          namespace: BattleNetNamespace.dynamic,
          id: connectedRealmId);
  print(connectedRealm);

  /// 授权码流
  /// 使用提供的参数构建授权请求 [Uri]
  final Uri redirectUri = Uri.parse('https://localhost');
  final List<BattleNetScope> scope = [
    BattleNetScope.openid,
    BattleNetScope.wowProfile,
  ];
  final Uri authorizationUri = battleNet.buildAuthorizationUri(
    redirectUri: redirectUri,
    scope: scope,
  );
  print(authorizationUri);

  /// 将用户重定向到 authorizationUri 并获取来自授权服务器的授权代码
  const String code = 'auth_code';

  /// 访问令牌请求是授权码流的第二部分
  final AuthorizationCodeResponse authorizationCodeResponse = await battleNet
      .postAuthorizationCode(redirectUri: redirectUri, code: code);

  /// 返回与当前承载令牌关联的用户的基本信息
  final UserInfoResponse userInfo = await battleNet.getUserInfo(
      accessToken: authorizationCodeResponse.accessToken);
  print(userInfo);
}

更多关于Flutter Battle.net API集成插件battle_net的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Battle.net API集成插件battle_net的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中集成并使用battle_net插件的示例代码。这个插件允许你访问Battle.net API,获取用户信息、游戏数据等。

首先,确保你的Flutter项目已经创建好,并且在pubspec.yaml文件中添加了battle_net依赖:

dependencies:
  flutter:
    sdk: flutter
  battle_net: ^最新版本号  # 请替换为实际可用的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你需要在Battle.net开发者门户创建一个应用,并获取Client ID和Client Secret。这些信息将用于认证和访问API。

以下是一个简单的Flutter应用示例,演示如何使用battle_net插件:

import 'package:flutter/material.dart';
import 'package:battle_net/battle_net.dart';
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Battle.net API Integration',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BattleNetPage(),
    );
  }
}

class BattleNetPage extends StatefulWidget {
  @override
  _BattleNetPageState createState() => _BattleNetPageState();
}

class _BattleNetPageState extends State<BattleNetPage> {
  String _responseData = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Battle.net API Integration'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _fetchUserData,
              child: Text('Fetch User Data'),
            ),
            SizedBox(height: 20),
            Text(_responseData),
          ],
        ),
      ),
    );
  }

  Future<void> _fetchUserData() async {
    // 替换为你的Client ID和Client Secret
    String clientId = '你的Client ID';
    String clientSecret = '你的Client Secret';
    String region = 'us'; // Battle.net区域,例如'us', 'eu', 'kr', 'tw'
    String accessToken = '用户的OAuth访问令牌'; // 你需要先通过OAuth2流程获取这个令牌

    BattleNet battleNet = BattleNet(clientId: clientId, clientSecret: clientSecret, region: region);

    try {
      // 这里假设你已经有了用户的OAuth访问令牌
      var response = await battleNet.getUserData(accessToken: accessToken, battleTag: '用户#1234');
      
      // 解析JSON响应
      Map<String, dynamic> data = jsonDecode(response.body);
      
      // 更新UI
      setState(() {
        _responseData = jsonEncode(data, prettyPrint: true);
      });
    } catch (e) {
      print('Error fetching user data: $e');
      setState(() {
        _responseData = 'Error fetching user data: ${e.toString()}';
      });
    }
  }
}

注意

  1. 在实际使用中,你需要通过OAuth2流程获取用户的访问令牌(accessToken)。这通常涉及到在浏览器中打开一个认证页面,让用户登录并授权你的应用。
  2. battle_net插件的具体API和方法可能会根据版本有所变化,请参考插件的官方文档和源代码以获取最新和最准确的信息。
  3. 上面的代码示例假设你已经有了用户的访问令牌,并且知道用户的BattleTag(例如用户#1234)。

由于获取OAuth访问令牌涉及多步流程(包括重定向URI处理、令牌交换等),这里为了简洁起见没有包含这部分代码。你可以查阅Battle.net API文档和Flutter中的OAuth2库(如flutter_oauth2)来实现完整的认证流程。

回到顶部