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

如何在Flutter应用内经用户授权批量发送WhatsApp消息?

Flutter无跳转批量发送WhatsApp消息方案

核心需求回顾

需要在Flutter+Firebase环境下,获得用户授权后,使用用户自身的WhatsApp账号,批量给200个指定号码发送消息,全程不跳转至WhatsApp官方App。此前尝试的各类方案均存在局限:

  • 常规跳转方案:仅能唤起WhatsApp App,无法批量操作
  • 第三方WhatsApp Flutter库:仅支持WhatsApp Business账号,无法给普通用户发消息
  • Android原生自定义函数:需编写Kotlin/Java代码,不支持跨平台
  • url_launcher相关方案:本质还是跳转逻辑,不支持无跳转批量发送
  • iOS快捷方式方案:官方无可行的程序化实现路径

可行解决方案:集成WhatsApp Web WebView

WhatsApp Web网页端支持用户扫码登录,且可通过JavaScript控制消息发送。我们可以在Flutter中嵌入WebView加载WhatsApp Web,通过JS注入实现批量发送逻辑,完全满足需求:

步骤1:集成webview_flutter包

在pubspec.yaml中添加依赖:

dependencies:
  webview_flutter: ^4.4.0

步骤2:实现WebView登录与消息发送逻辑

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WhatsAppBatchSender extends StatefulWidget {
  final List<String> phoneNumbers;
  final String message;

  const WhatsAppBatchSender({
    super.key,
    required this.phoneNumbers,
    required this.message,
  });

  @override
  State<WhatsAppBatchSender> createState() => _WhatsAppBatchSenderState();
}

class _WhatsAppBatchSenderState extends State<WhatsAppBatchSender> {
  late WebViewController _controller;
  bool _isLoggedIn = false;

  @override
  void initState() {
    super.initState();
    _controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(Uri.parse('https://web.whatsapp.com/'))
      ..addJavaScriptChannel(
        'WhatsAppStatus',
        onMessageReceived: (message) {
          if (message.message == 'logged_in') {
            setState(() => _isLoggedIn = true);
          }
        },
      )
      ..addJavaScriptChannel(
        'SendComplete',
        onMessageReceived: (message) {
          debugPrint('已发送至:${message.message}');
        },
      );
  }

  void _startBatchSending() async {
    for (var number in widget.phoneNumbers) {
      await _controller.runJavaScript('''
        async function sendToNumber() {
          const targetNumber = "$number";
          const sendText = "${widget.message.replaceAll('"', '\\"')}";
          // 打开目标号码聊天窗口
          window.location.href = `https://web.whatsapp.com/send?phone=${targetNumber}&text=${encodeURIComponent(sendText)}`;
          // 等待页面加载
          await new Promise(resolve => setTimeout(resolve, 3000));
          // 触发发送按钮点击
          const sendBtn = document.querySelector('button[data-testid="compose-btn-send"]');
          if (sendBtn) {
            sendBtn.click();
            window.SendComplete.postMessage(targetNumber);
          }
          // 延迟避免触发反垃圾机制
          await new Promise(resolve => setTimeout(resolve, 6000));
        }
        sendToNumber();
      ''');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('批量发送WhatsApp消息')),
      body: WebViewWidget(controller: _controller),
      floatingActionButton: _isLoggedIn
          ? FloatingActionButton(
              onPressed: _startBatchSending,
              child: const Icon(Icons.send),
            )
          : null,
    );
  }
}

关键注意事项

  1. 登录状态持久化:通过WebView的Cookie管理保存用户登录状态,避免重复扫码
  2. 反垃圾机制规避:批量发送需设置5-10秒的单条延迟,防止WhatsApp判定为自动化操作封禁账号
  3. 合规性:必须获得用户明确书面同意,禁止用于垃圾信息发送,否则违反WhatsApp服务条款
  4. Firebase集成:可将号码列表存储在Firebase Firestore,发送状态同步至实时数据库,便于追踪进度

替代方案(限Business账号)

若可使用WhatsApp Business账号,可借助Firebase Cloud Functions调用官方WhatsApp Business API实现批量发送,但需申请Business账号并配置API权限,成本较高且不支持普通用户账号。

内容的提问来源于stack exchange,提问作者shaked

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:50:18