一般批量发短信都使用短信平台,通过服务商发送。用手机批量发送短信是因为:手机号显示自己的(服务商是一长串商用短信号码),另外服务商的限制较多。当然手机发短信就贵且慢。
这里利用了ADB这个工具与手机连接,实现其实很简单。
为了方便,还实现了程序嵌入adb.exe这个工具。
/*
电脑连接手机,通过ADB群发短信
1. 自带ADB.exe
2. 通过文件获取短信号码及发送信息内容
*/
package main
import (
"bufio"
_ "embed"
"fmt"
"os"
"os/exec"
"strings"
"time"
)
const MessageFile = "message.txt"
const NumberFile = "number.txt"
const AdbFile = "adb.exe"
var AdbCommand = []string{
`adb shell am start -a android.intent.action.SENDTO -d sms:%s --es sms_body "%s" --ez exit_on_sent true`,
"adb shell input keyevent 22",
"adb shell input keyevent 66",
}
//go:embed adb.exe
var adb []byte
func fileExists(path string) bool {
_, err := os.Stat(path)
return !os.IsNotExist(err)
}
func ShellCommand(command string) (string, error) {
time.Sleep(1 * time.Second)
cmd := exec.Command("cmd.exe", "/c", command)
output, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("执行命令错误: %v\n%s", err, output)
return "", err
}
return string(output), nil
}
// 判断是否已经连接了手机
func CheckConnectMob() bool {
ret, err := ShellCommand("adb.exe devices")
if err != nil {
return true
}
if strings.Contains(ret, "unauthorized") {
fmt.Println("连接的手机未授权")
}
lineInfo := strings.Split(ret, "\n")
return len(lineInfo) > 3
}
func init() {
if !fileExists(AdbFile) { // 释放adb.exe文件
os.WriteFile(AdbFile, adb, 0755)
}
if !fileExists(MessageFile) {
fmt.Println("需要消息内容文件: " + MessageFile)
}
if !fileExists(NumberFile) {
fmt.Println("需要号码文件: " + NumberFile)
}
if !CheckConnectMob() {
fmt.Println("请通过USB连接手机,稍后再运行本程序")
}
}
func main() {
message, err := os.ReadFile(MessageFile)
if err != nil {
fmt.Printf("读取 %s 文件失败", MessageFile)
return
}
// 打开文件
file, err := os.Open(NumberFile)
if err != nil {
fmt.Printf("读取 %s 文件失败", NumberFile)
return
}
defer file.Close()
// 创建Scanner对象
scanner := bufio.NewScanner(file)
// 逐行读取文件内容并打印
for scanner.Scan() {
cmd := fmt.Sprintf(AdbCommand[0], scanner.Text(), string(message))
ShellCommand(cmd)
ShellCommand(AdbCommand[1])
ShellCommand(AdbCommand[1])
ShellCommand(AdbCommand[2])
fmt.Println(cmd)
}
}