(原) 用手机批量发短信

原创文章,请后转载,并注明出处。

一般批量发短信都使用短信平台,通过服务商发送。用手机批量发送短信是因为:手机号显示自己的(服务商是一长串商用短信号码),另外服务商的限制较多。当然手机发短信就贵且慢。

这里利用了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)
	}
}

相关文章