怎麼實現iMessage群發

iMessages發表於2024-03-31

Apple公司全線在mac os與ios兩個作業系統上內建了FaceTime與iMessage兩個應用。完美替代運營商的簡訊與電話。並且FaceTime與iMessage的帳號不僅僅與Apple ID 繫結,同時也與使用這Apple ID的手機號碼繫結,這樣的漏洞自然給無孔不入的群發垃圾資訊商們提供了後門。
研究怎麼實現iMessage群發先是從XMPP協議開始的,因為Apple MAC os上的ichat是XMPP客戶端,可以連線iMessage伺服器,同時也可連線gtalk與weibo私信。但後面發現iMessage的伺服器驗證是加密,沒辦法實現非ichat XMPP客戶端連線iMeesage伺服器,那就自然沒辦法實現程式控制往iMeesage伺服器批次傳送資訊。
只能透過MAC OS或者iOS自帶的程式往iMeesage伺服器傳送資訊,那要實現群發,自然只能想辦法去呼叫自帶的這ichat客戶端,在MAC OS系統上Apple公司提供一種叫Apple script的指令碼來自動實現任務。可能透過tell application "Messages"就可以啟用iMessage客戶端自動傳送資訊。這樣實現的群發的思路就很清楚了

一、iMessage推送技術實現
群發iMessage主要需要攻破兩個技術難點,一個是iMessage賬號的獲取,另一個是群發iMessage。
#iMessage賬號獲取
iMessage賬號目前獲取的方法主要是掃描手機號碼。掃描手機號碼可以透過程式碼自動掃描,也可以透過人工篩選。透過程式碼自動掃描,建議大家可以從以下兩方面著手
1.編寫AppleScript指令碼控制Mac OS自帶的iMessage客戶端進行驗證,類似於群發iMessage。傳送一條iMessage之後,如果捕獲到傳送失敗的異常則不是iMessage賬號
2.研究iOS系統中Message framework中的私有api,透過私有api進行驗證

實現iMessage群發
1.透過AppleScript實現批次註冊itune帳號
2.透過AppleScript實現自動取一個itune帳號群發100個APPle ID的iMessage

set EMAIL to "EMAIL_DEL_DESTINATARI" -- el destinatari ha de tenir l'iMessage activat
set MSG to "COS_DEL_MISSATGE"
set N to the 1000 -- nombre de vegades que s'enviarà el missatge
set APPLE_ID to "E:" -- la teva Apple ID que ha de tenir iMessage activat
repeat N times
    tell application "Messages"
        send MSG to buddy EMAIL of service APPLE_ID
    end tell
end repeat


iMessage群發
檢驗完所有賬號後,可以從中選取出iMessage賬號進行群發。群發有兩個方法,一個還是透過iMessage客戶端,另一個是透過AppleScript指令碼控制iMessage客戶端傳送。
1.透過iMessage客戶端傳送,可直接將號碼貼上至位址列,填寫內容,傳送即可。
2.透過ApplseScript控制iMessage客戶端的指令碼如下:以下程式碼可從一個csv檔案中讀取出iMessage賬號,並透過iMessage客戶端逐個傳送iMessage訊息。

tell application "Messages"
set csvData to read "/Users/xxxx/Desktop/test.csv" 
set csvEntries to paragraphs of csvData
repeat with i from 1 to count csvEntries
set phone to (csvEntries's item i)'s text
set myid to get id of first service
set theBuddy to buddy phone of service id myid
send "今天北京晴,氣溫13到27度;週二晴,氣溫11到26度,北風3-4級;週三晴,氣溫11到24度,微風<3" to theBuddy
end repeat
end tell

需要注意如下問題:
1.由於該指令碼是控制iMessage客戶端進行傳送,所以必須在MacOS 10.8以上的系統中執行,同時開啟iMessage程式。
2.該指令碼在傳送iMessage時並不是後臺傳送,所以當傳送量很大時,會導致iMessage客戶端執行緩慢,甚至無法開啟。可透過清空所有已傳送的iMessage或登出賬號解決。
3.透過指令碼傳送的iMessage賬號必須是在當前iMessage客戶端中檢驗過的,否則會報“不能獲得“buddy id "C0B35E7F-A0FB-49E1-BDD7-C867BC06D920:+86136xxxx0000"”。

三個問題解決方案如下:
第一個問題用mac os系統或者黑蘋果裝10.8作業系統,會自帶messages程式,這程式系統自帶,千萬不會發現打不開去刪除Messages程式,刪除就只能重灌系統了。並且是先開啟Messages程式,再啟動apple script指令碼,不然執行不正常。
第二個問題,在傳送過程中加入同步刪除的程式碼,但同步一條一條刪除時有時會失敗,所以再增加發一定量後再批次刪除一次的操作,正常的流程應該是開啟Messages程式->迴圈號碼庫->讀取一個號碼->傳送一條資訊->等待1秒->刪除此條資訊->判斷是否未刪除的超過100條,是批次刪除->迴圈號碼庫。這樣就可以保證Messages程式不會去佔百分一百多的CPU或者幾個G的記憶體。
第三個問題,在messages程式的imessage帳號中設定用來群發的imessage帳號。就沒有問題了。

tell application "Messages"
	set csvData to read "/Users/xxxx/Desktop/test.csv" 
	set csvEntries to paragraphs of csvData
	
	repeat with i from 1 to count csvEntries
		set phone to (csvEntries's item i)'s text
		set myid to get id of first service
		set theBuddy to buddy phone of service id myid
		send "今天北京晴,氣溫13到27度;週二晴,氣溫11到26度,北風3-4級;週三晴,氣溫11到24度,微風<3" to theBuddy
		delay 1 -延時一秒,不然取不到已發達的內容
		set FailNum to (get count chat)
		if FailNum>100 then
			repeat with j from 1 to FailNum
				set phone to (get name of chat (FailNum-j))
				set DelMsg to "iMessage;-;" & phone
				if exists (text chat id DelMsg) then
					delete text chat id DelMsg
				end if
			end repeat
		end if
	end repeat
end tell

單獨傳送Email

set recpAddress to "2xxxxxx@qq.com"
set theSubject to "Apple Script mail hh"
set theContent to "aan and Again send using applescrip iit"
tell application "Mail"
	settheMessage to make outgoing messagewith properties {subject:theSubject,content:theContent,visible:true}
	telltheMessage
	maketo recipientwith properties {name:recpName,address:recpAddress}
end tell

單獨傳送iMessage

tell application "Messages"
	set myid to get id of second service
	set theBuddy to buddy "138xxxxx" of service id myid
	repeat with i from 1 to 10
		send "hello, 測試一下哈" to theBuddy
	end repeat
end tell

相關文章