How to mark Messages as read with apple script? - macos

I was wondering if there is a way to mark messages from either a particular thread/user and/or just mark all as read. Preferable per thread. I can see there is a way to do this for the Mail app for example:
on run {}
tell application "Mail"
set read status of every message of mailbox "Deleted Items" of account "MyAccount" to true
end tell
end run
But need to be able to do the same for the Messages App instead.

Related

Simple AppleScript to send SMS by Messages app fails with error MacOs Monterey 12.0.1

I wish to automate the sending of SMS texts using AppleScript to control the Messages app in MacOS Monterey (12.0.1). My very simple test script fails with an error message as below:
tell application "Messages"
send "Test" to participant "123456789" of account "SMS"
end tell
Running the script fails with this error:
error "Messages got an error: Invalid key form." number -10002 from account "SMS"
Obviously, I am using a valid phone number (my own) which is among my contacts (in fact, Script Editor recognizes the number and offers additional info via a drop down list).
The MacBook Pro M1 I'm using is setup to send and receive text messages, I use that all the time. I get the same result if I try to send an iMessage by replacing "SMS" with "iMessage". Thank you for your help.
Try:
tell application "Messages"
launch
repeat while (count of windows) is 0
end repeat
set a to first account whose service type = SMS and enabled is true
set p to participant "123456789" of a
send "test, please ACK" to p
-- properties of p
end tell
Note: You may not be able to text yourself, and you may need to already have texted the recipient.
tell application "Messages"
set iMessageService to 1st account whose service type = iMessage
set imessagebuddy to participant "00301234567890" of iMessageService
send "ignore the last messages. just testing. i am still the applescriptmaster" to imessagebuddy
end tell

applescript send SMS message

I am trying to send NEW messages using applescript through the macos messages app.
on run {targetBuddyPhone, targetMessage}
tell application "Messages"
send targetMessage to buddy targetBuddyPhone of service "SMS"
end tell
end run
The above script runs fine on the condition that there is already a conversation started for the specific targetBuddyPhone in the messages app. Any ideas how to send a NEW message?.. I can't believe it isn't possible.
It could be possible to call URL from Apple Script in this form:
sms://open?addresses=+15558675309,+15558675301/&body=Text%20Here%20end!
It will not send message, but just prefill it and user will need to press Enter key.

OS X Messages AppleScript handler: save images?

I've been attempting to use AppleScript to save incoming messages on an Apple Messages account, like so:
on active chat message received theMessage from theBuddy
set theFileID to open for access POSIX file "/Users/me/Desktop/test" with write permission
write theMessage to theFileID
close access theFileID
return theMessage
end active chat message received
which works great for text messages, but if the user sends an image the message appears to just be an empty string. Is there any way to fetch this image, or - as I fear - is it not accessible?
This isn't a direct answer, but I've discovered that the OS X Messages app uses SQLite for storage, at ~/Library/Messages/chat.db. It has a table named attachment which lists the filenames of all attachments.
For my purposes, this is enough - but I'd love to hear if there are more legitimate alternatives.

Scheduling an email to send in mail (mac)

I have an email that I need to schedule to send later. I know you can schedule an apple script to fire off at a set time using iCal, but I have been unable to find one that works. It doesn't necessarily have to be done this way though. I would be grateful of a solution to this problem.
This works for me with a run script alarm in iCal on 10.6.8
tell application "Mail"
activate
set mymail to make new outgoing message at the beginning of outgoing messages with properties {subject:"Triggered"}
tell mymail
make new to recipient at beginning of to recipients with properties {address:"first#email.com, second#email.com"}
set content to "hi"
end tell
--show message window (otherwise it's hidden)
set visible of mymail to true
--bring Mail to front
activate
send mymail
end tell
I'm also getting an error like outgoing message 1 doesn’t understand the send message when trying to send an outgoing message. Referring to a message created from a script still seems to work though.
tell application "Mail"
set m to make new outgoing message with properties {subject:"subject", content:"content"}
tell m
make new to recipient at end of to recipients with properties {address:"jana#doe.com, john#doe.com"}
end tell
send m
end tell
You could also create a Calendar alarm in Automator.
I just accomplished this without Automator, using only Apple Mail:
Double-click anywhere your calendar to start creating an event.
Give the event a name. This will be the subject line of the email.
Set the date and time of the event to when you want the email to be sent.
If you want the email to be sent on a schedule, choose a repeat frequency and potential termination date.
For the alert, choose Custom....
Select email. You might be prompted to add a contact card to the Contacts app.
Choose the person to whom you want to send the email, and set the time to At Time Of Event. Press OK.
You can choose to add Notes, a URL, or attachments. I haven't tried these options, but I assume that they are carried forward in the email that is sent.

Receive Adium messages in Applescript

I'm trying to write a simple chat bot for Adium, that will post "lol" and "haha" and answer basic questions in annoying group chats that some people keep adding me to.
I've covered the "lol" part with a few simple send and delay commands in a repeat, but I need to do some interaction as well.
Answer "yes" to anything with a question mark for example...
Believe me or not, such a simple bot would pass a Turing Test for those conversations.
Opening the Adium dictionary does not reveal any obvious way of getting messages, nor does the Growl dictionary.
I did found out that I can run a script every time a message is received, Is there a way to get access to the sent message?
Adium pref http://media.ruk.ca/images/adiumpreferences.png
My code:
tell application "Adium"
activate
set theChat to the active chat
send theChat message "Hi"
delay 5
send theChat message "How's life?"
delay 10
repeat 10 times
send theChat message "Realy?"
delay 5
send theChat message "Lol :P"
delay 15
send theChat message "Haha XD"
delay 15
send theChat message "Yes1!!1"
delay 20
send theChat message "I like it! :D"
delay 10
end repeat
send theChat message "Bye!"
tell theChat to close
end tell
You can pipe to a script using Pipe Event as well now.
Based on review of the current Adium sourcecode and a search for current and past items in the Adium bug tracker and wiki which contain both "applescript" and "message" as substrings, this does not appear to be possible when using only AppleScript in Adium 1.0 through 1.3.10 (latest at time of writing). It seems to have been possible with plain AppleScript in Adium 0.89.1, but the volunteer developers are not yet convinced that adding this feature back is worth the effort.
To access the message content in AppleScript right now probably requires writing an Adium Xtra to forward the information. Examples of Xtra plugins that access the text of last message include Challenge/Response or SpamFilter. The sourcecode for SpamFilter is available on BitBucket, so you could conceivably modify it to send message contents to an AppleScript.
EDIT: Since I posted my response, user 'zostay' has spotted a new Adium Xtra called "Pipe Event". It allows sending the text of an event to a script in exactly the manner I envisioned when I wrote my second paragraph, so I'm up-voting zostay's answer. Sourcecode is also available.

Resources