Files
wushu/lib/services/jinrishici_service.dart
2026-04-09 02:23:27 +08:00

151 lines
4.4 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/// 今日诗词 API 服务
///
/// 创建时间2026-04-08
/// 作用:调用今日诗词 API 获取每日诗词
/// 最后更新2026-04-08 - 初始创建
import 'package:dio/dio.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/scenario/jinrishici_sdk_config.dart';
class JinrishiciService {
static final JinrishiciService _instance = JinrishiciService._internal();
factory JinrishiciService() => _instance;
JinrishiciService._internal();
final Dio _dio = Dio(BaseOptions(
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
));
static const String _tokenKey = 'jinrishici_token';
/// 获取 token
Future<String?> _getToken() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString(_tokenKey);
}
/// 保存 token
Future<void> _saveToken(String token) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_tokenKey, token);
}
/// 生成 token
Future<String> generateToken() async {
try {
print('正在请求 token: ${JinrishiciSdkConfig.tokenUrl}');
final response = await _dio.get(JinrishiciSdkConfig.tokenUrl);
print('Token 响应状态码: ${response.statusCode}');
print('Token 响应数据: ${response.data}');
if (response.statusCode == 200 && response.data != null) {
// 根据官方文档token 在 data 字段中
String? token;
if (response.data is Map) {
token = response.data['data'] as String?;
}
if (token != null && token.isNotEmpty) {
await _saveToken(token);
print('Token 获取成功: $token');
return token;
}
}
throw Exception('获取 token 失败: 响应数据格式不正确');
} catch (e) {
print('获取 token 异常: $e');
throw Exception('获取 token 异常: $e');
}
}
/// 获取今日诗词
Future<Map<String, dynamic>> getTodayPoetry() async {
try {
// 获取或生成 token
String? token = await _getToken();
if (token == null || token.isEmpty) {
try {
token = await generateToken();
} catch (e) {
print('Token 获取失败,尝试不带 token 请求: $e');
token = null;
}
}
// 使用 token 获取诗词
print('正在请求诗词: ${JinrishiciSdkConfig.sentenceUrl}');
final response = await _dio.get(
JinrishiciSdkConfig.sentenceUrl,
options: token != null
? Options(
headers: {
'X-User-Token': token,
},
)
: null,
);
print('诗词响应状态码: ${response.statusCode}');
print('诗词响应数据: ${response.data}');
if (response.statusCode == 200 && response.data != null) {
return response.data as Map<String, dynamic>;
}
throw Exception('获取诗词失败');
} catch (e) {
print('获取诗词异常: $e');
throw Exception('获取诗词异常: $e');
}
}
/// 清除缓存的 token
Future<void> clearToken() async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_tokenKey);
}
/// 获取用户信息IP、地区、天气等
Future<Map<String, dynamic>> getUserInfo() async {
try {
// 获取或生成 token
String? token = await _getToken();
if (token == null || token.isEmpty) {
try {
token = await generateToken();
} catch (e) {
print('Token 获取失败,尝试不带 token 请求: $e');
token = null;
}
}
// 调用 info 接口
print('正在请求用户信息: https://v2.jinrishici.com/info');
final response = await _dio.get(
'https://v2.jinrishici.com/info',
options: token != null
? Options(
headers: {
'X-User-Token': token,
},
)
: null,
);
print('用户信息响应状态码: ${response.statusCode}');
print('用户信息响应数据: ${response.data}');
if (response.statusCode == 200 && response.data != null) {
return response.data as Map<String, dynamic>;
}
throw Exception('获取用户信息失败');
} catch (e) {
print('获取用户信息异常: $e');
throw Exception('获取用户信息异常: $e');
}
}
}