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