研究怎么实现iMessage群发先是从XMPP协议开始的,因为AppleMAC os上的ichat是XMPP客户端,可以连接iMessage服务器,同时也可连接gtalk与weibo私信。但后面发现iMessage的服务器验证是加密,没办法实现非ichatXMPP客户端连接iMeesage服务器,那就自然没办法实现程序控制往iMeesage服务器批量发送信息。
只能通过MAC OS或者iOS自带的程序往iMeesage服务器发送信息,那要实现群发,自然只能想办法去调用自带的这ichat客户端,在MAC OS系统上Apple公司提供一种叫Apple script的脚本来自动实现任务。可能通过tell application "Messages"就可以激活iMessage客户端自动发送信息。这样实现的群发的思路就很清楚了
一、iMessage推送技术实现
群发iMessage主要需要攻破两个技术难点,一个是iMessage账号的获取,另一个是群发iMessage。升级版本请参考博文首页相关文章: https://www.cnblogs.com/imblog/
#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 timestell application "Messages"send MSG to buddy EMAIL of service APPLE_IDend 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 csvDatarepeat with i from 1 to count csvEntriesset phone to (csvEntries's item i)'s textset myid to get id of first serviceset theBuddy to buddy phone of service id myidsend "今天北京晴,气温13到27度;周二晴,气温11到26度,北风3-4级;周三晴,气温11到24度,微风<3" to theBuddydelay 1 -延时一秒,不然取不到已发达的内容set FailNum to (get count chat)if FailNum>100 thenrepeat with j from 1 to FailNumset phone to (get name of chat (FailNum-j))set DelMsg to "iMessage;-;" & phoneif exists (text chat id DelMsg) thendelete text chat id DelMsgend ifend repeatend ifend repeat end tell
单独发送iMessage
tell application "Messages"set myid to get id of second serviceset theBuddy to buddy "138xxxxx" of service id myidrepeat with i from 1 to 10send "hello, 测试一下哈" to theBuddyend 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}telltheMessagemaketo recipientwith properties {name:recpName,address:recpAddress} end tell