You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter iOS项目中MEGA.nz API登录异常问题求助

解决MEGA.nz登录判断错误的问题

你的代码仅通过HTTP状态码200判定登录成功,但MEGA的API即使登录失败也会返回200状态码,实际错误信息藏在响应体的JSON结构里。另外你的代码存在语法错误(301判断分支缺失闭合括号),修正后的代码如下:

TextEditingController emailController = TextEditingController();
TextEditingController passwordController = TextEditingController();

void login(String email, String password) async {
  try {
    final response = await http.post(
      Uri.parse('https://g.api.mega.co.nz/cs'),
      headers: {
        'Content-Type': 'application/json',
      },
      body: jsonEncode({
        'a': 'us',
        'user': email,
        'password': password
      }),
    );

    if (response.statusCode == 200) {
      var data = jsonDecode(response.body);
      // MEGA API响应为数组,第一个元素是错误码:0=成功,负数=失败
      if (data is List && data.isNotEmpty) {
        if (data[0] == 0) {
          print('Login successfully: $data');
          // 保存会话sid,后续请求必须携带该参数
          String sessionId = data[1]['sid'];
        } else {
          print('Login failed: ${data[1]}');
        }
      } else {
        print('Unexpected response format');
      }
    } else if(response.statusCode == 301) {
      print('Redirected to: ${response.headers['Location']}');
    } else {
      print('Failed login: ${response.statusCode} ${response.body}');
    }
  } catch (e) {
    print('Error: $e');
  }
}
获取账号下的视频文件夹

登录成功后,携带会话ID调用f接口获取全量文件/文件夹列表,再筛选出视频相关文件夹:

Future<void> getVideoFolders(String sessionId) async {
  try {
    final response = await http.post(
      Uri.parse('https://g.api.mega.co.nz/cs'),
      headers: {
        'Content-Type': 'application/json',
      },
      body: jsonEncode({
        'a': 'f',
        'c': 1, // 标识获取所有文件/文件夹
        'sid': sessionId,
      }),
    );

    if (response.statusCode == 200) {
      var data = jsonDecode(response.body);
      if (data is List && data[0] == 0) {
        List<dynamic> files = data[1];
        List<dynamic> videoFolders = [];
        for (var file in files) {
          // t=1代表是文件夹,后续可调用接口查询文件夹内文件,筛选.avi后缀的内容
          if (file['t'] == 1) {
            videoFolders.add(file);
          }
        }
        print('Video folders: $videoFolders');
      } else {
        print('Failed to get files: ${data[1]}');
      }
    }
  } catch (e) {
    print('Error: $e');
  }
}
支持AVI格式的Flutter视频播放器

iOS原生播放器对AVI支持有限,推荐使用基于VLC的flutter_vlc_player库,它能兼容绝大多数视频格式:

  1. 在pubspec.yaml添加依赖:
dependencies:
  flutter_vlc_player: ^7.0.0 # 请使用最新版本
  1. iOS配置:修改ios/Podfile的最低版本要求:
platform :ios, '12.0'

执行pod install完成配置

  1. 基础使用示例:
import 'package:flutter_vlc_player/flutter_vlc_player.dart';

class VideoPlayerScreen extends StatefulWidget {
  final String videoUrl; // 传入MEGA接口获取的解密后临时下载链接
  const VideoPlayerScreen({super.key, required this.videoUrl});

  @override
  State<VideoPlayerScreen> createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  late VlcPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = VlcPlayerController.network(
      widget.videoUrl,
      options: VlcPlayerOptions(),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: VlcPlayer(
        controller: _controller,
        aspectRatio: 16/9,
        placeholder: const Center(child: CircularProgressIndicator()),
      ),
    );
  }
}

注意:MEGA的视频文件需先调用g接口获取解密后的临时下载链接,不能直接使用文件ID访问。

内容的提问来源于stack exchange,提问作者Mario Dragon Ball789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:45:10