如何在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, ); } }
关键注意事项
- 登录状态持久化:通过WebView的Cookie管理保存用户登录状态,避免重复扫码
- 反垃圾机制规避:批量发送需设置5-10秒的单条延迟,防止WhatsApp判定为自动化操作封禁账号
- 合规性:必须获得用户明确书面同意,禁止用于垃圾信息发送,否则违反WhatsApp服务条款
- Firebase集成:可将号码列表存储在Firebase Firestore,发送状态同步至实时数据库,便于追踪进度
替代方案(限Business账号)
若可使用WhatsApp Business账号,可借助Firebase Cloud Functions调用官方WhatsApp Business API实现批量发送,但需申请Business账号并配置API权限,成本较高且不支持普通用户账号。
内容的提问来源于stack exchange,提问作者shaked
相关产品推荐
相关产品推荐

