ฉันจะทริกเกอร์การแจ้งเตือนของศูนย์การแจ้งเตือนจาก AppleScript หรือเชลล์สคริปต์ได้อย่างไร


305

ฉันชอบที่จะสามารถใช้ประโยชน์จากคุณสมบัติศูนย์การแจ้งเตือนของ 10.8 ใน AppleScripts และสคริปต์เชลล์ที่ฉันเขียน

มีคำสั่งในตัวหรือไลบรารีบุคคลที่สามที่ฉันสามารถใช้ได้จาก AppleScript หรือเชลล์สคริปต์

นึกคิดประเภทและไอคอนของการแจ้งเตือนสามารถควบคุมได้ แต่เพียงแค่ความสามารถในการเรียกแบนเนอร์ขั้นพื้นฐานที่มีไอคอนหุ้น (แต่ข้อความที่กำหนดเอง) จะได้รับการชื่นชม


คำตอบ:


428

ด้วย Mavericks และใหม่กว่าคุณสามารถทำได้โดยใช้ 'การแจ้งเตือนการแสดงผล' ของ AppleScript:

display notification "Lorem ipsum dolor sit amet" with title "Title"

                          

แค่นั้นแหละ! 3 ห้องสมุดของ บริษัท อื่นหรือปพลิเคชันที่จำเป็นและเป็นแบบพกพาอย่างสมบูรณ์สำหรับการใช้งานบนระบบอื่น ๆ การแจ้งเตือน 10.9 ที่ด้านบน 10.10 DP ที่ตรงกลาง 10.10 ที่ด้านล่าง

AppleScript สามารถเรียกใช้จากเชลล์โดยใช้ / usr / bin / osascript:

osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'

คุณสามารถปรับแต่งการแจ้งเตือนเพิ่มเติมได้โดยเพิ่ม ...

  • คำบรรยาย

    ต่อท้าย 'ซับไตเติ้ล' ตามด้วยสตริงหรือตัวแปรที่มีซับไตเติ้ล

    display notification "message" with title "title" subtitle "subtitle"

    ตัวอย่างข้างต้นสร้างการแจ้งเตือนต่อไปนี้:

  • เสียง

    ต่อท้าย 'ชื่อเสียง' ตามด้วยชื่อของเสียงที่จะเล่นพร้อมกับการแจ้งเตือน

    display notification "message" sound name "Sound Name"

    ชื่อเสียงที่ถูกต้องคือชื่อของเสียงที่อยู่ใน ...

    • ~/Library/Sounds
    • /System/Library/Sounds

การโพสต์การแจ้งเตือนสามารถห่อเป็นสคริปต์บรรทัดคำสั่ง รหัสต่อไปนี้สามารถทำงานใน Terminal และจะเพิ่มสคริปต์เพื่อ / usr / local / bin (ต้องมีอยู่เพิ่มถึง $ PATH) notifyที่เรียกว่า

cd /usr/local/bin && echo -e "#!/bin/bash\n/usr/bin/osascript -e \"display notification \\\"\$*\\\"\"" > notify && chmod +x notify;cd -

นี่คือสคริปต์ที่ด้านบนจะเพิ่มการแจ้งเตือน

#!/bin/bash
/usr/bin/osascript -e "display notification \"$*\""

ตอนนี้เพื่อแสดงการแจ้งเตือน:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished

9
@ceilingcat นี่คือ AppleScript หากต้องการเรียกใช้ใน Terminal ให้ใช้ osascript (ดูคำตอบ)
grg

8
ปัญหาเพียงอย่างเดียวdisplay notificationคือเมื่อคุณคลิกที่กล่องโต้ตอบเปิดไฟล์จะปรากฏขึ้น
ɹoƃı

7
เป็นไปได้หรือไม่ที่จะทำให้ป๊อปอัปแจ้งเตือนอยู่ตลอดไป (ไม่ใช่ซ่อนอัตโนมัติหลังจาก N วินาที) จนกว่าผู้ใช้จะคลิกอย่างชัดเจนหรือไม่
Sridhar Ratnakumar

25
ท่านสุภาพบุรุษและสุภาพสตรีหลังจากการตรวจสอบทางอินเทอร์เน็ตเป็นเวลาหนึ่งชั่วโมงฉันได้ค้นพบวิธีที่จะทำให้หน้าต่างการแจ้งเตือนอยู่จนกว่าผู้ใช้จะถูกไล่ออก! จริง ๆ แล้วมันถูกควบคุมโดยการตั้งค่าในการตั้งค่าระบบแทนพารามิเตอร์บางอย่างในสคริปต์ที่เขียน ภาพสองภาพนี้ควรอธิบายได้ทั้งหมดi.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpgขอให้ทุกคนสนุกและขอบคุณ @grgarside สำหรับคำตอบที่ยอดเยี่ยม
Vic Jang

4
โปรดทราบว่าข้อความต้องอยู่ในเครื่องหมายคำพูดคู่ คำพูดเดี่ยวไม่ทำงาน ดังนั้นหากคุณต้องการตัวแปรในข้อความคุณไม่สามารถเขียนแต่จำเป็นที่จะต้องหนีราคาคู่:"display ... '$mytext' ..." "display notification \"$mytext\" ..."
mivk

93

ขั้วแจ้ง

จาก README:

terminal-notifier เป็นเครื่องมือบรรทัดคำสั่งเพื่อส่งการแจ้งเตือนผู้ใช้ Mac OS X ซึ่งมีอยู่ใน Mac OS X 10.8

ขณะนี้แพคเกจเป็นชุดแอปพลิเคชันเนื่องจาก NSUserNotificationไม่สามารถใช้งานได้จาก 'เครื่องมือพื้นฐาน' เรดาร์: // 11956694

เครื่องมือนี้จะถูกใช้โดยKickerเพื่อแสดงสถานะของคำสั่งที่ดำเนินการเนื่องจากการเปลี่ยนแปลงระบบไฟล์ (v3.0.0)

ดาวน์โหลด

ไบนารีที่สร้างไว้ล่วงหน้าซึ่งเป็นรหัสการลงนามและพร้อมที่จะใช้ที่มีอยู่จากส่วนของการดาวน์โหลด

การใช้

$ ./terminal-notifier.app/Contents/MacOS/terminal-notifier group-ID sender-name message [bundle-ID]

ในการใช้เทอร์มินัลแจ้งเตือนคุณต้องโทรหาไบนารี ภายในชุดแอป

อาร์กิวเมนต์แรกระบุ 'กลุ่ม' การแจ้งเตือนที่เป็นของ สำหรับการใด ๆ 'กลุ่ม' เพียงหนึ่งในการแจ้งเตือนจะเคยแสดงแทนก่อนหน้านี้โพสต์แจ้งเตือน ตัวอย่างคือ: ID กระบวนการของผู้ส่งเพื่อกำหนดขอบเขตการแจ้งเตือนโดยกระบวนการที่ไม่ซ้ำกันหรือไดเรกทอรีการทำงานปัจจุบันเพื่อแจ้งเตือนขอบเขตโดยโครงการ

อาร์กิวเมนต์ที่สองและสามอธิบายการแจ้งเตือนของตัวเองและเป็น 'ชื่อ' และ 'ข้อความ' ตามลำดับ ตัวอย่างเช่นในการสื่อสารผู้ส่งการแจ้งเตือนไปยังผู้ใช้คุณสามารถระบุชื่อผู้ส่งเป็นชื่อ

อาร์กิวเมนต์ที่สี่และสุดท้ายคืออาร์กิวเมนต์ที่เป็นทางเลือก มันระบุแอปพลิเคชันที่ควรเปิดใช้งานเมื่อผู้ใช้คลิกการแจ้งเตือน ตามค่าเริ่มต้นสิ่งนี้จะเปิดใช้งาน Terminal.app เพื่อเปิดแอปพลิเคชันอื่นแทนระบุตัวระบุบันเดิลของแอปพลิเคชัน ตัวอย่างเช่นการเปิดใช้ com.apple.SafariSafari.app:


น่ารักห้องสมุดที่ยอดเยี่ยม! ชอบที่จะเห็นมันอัปเดตด้วยการควบคุมไอคอนและการแจ้งเตือนเทียบกับแบนเนอร์ แต่มีประโยชน์แน่นอน ขอบคุณสำหรับลิงค์! i.imgur.com/tsCeK.png
Nathan Greenstein

2
แอพเล็ก ๆ ที่ยอดเยี่ยมฉันสร้างตัวเรียกใช้และวางใน / usr / local / bin เพื่อให้สามารถใช้งานได้ทุกที่จากเทอร์มินัล ฯลฯ สคริปต์เรียกใช้งาน: #! / bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren

4
ตัวเรียกใช้จะมีประโยชน์หากคุณเปลี่ยนให้ใช้งานได้กับข้อความที่มีช่องว่าง: #! / bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

ฉันต้องการเพิ่มบันทึกในคำตอบของ @ grgarside เพราะฉันรู้ว่าหลายคนต้องการมีป๊อปอัปการแจ้งเตือนที่สามารถยกเลิกได้โดยการคลิกปุ่มเท่านั้น

การเปรียบเทียบ

ฉันได้พบวิธีแก้ปัญหาสำหรับคุณ:

จริง ๆ แล้วมันถูกควบคุมโดยการตั้งค่าในการตั้งค่าระบบมากกว่าพารามิเตอร์บางอย่างในสคริปต์ที่เขียน ภาพสองภาพนี้ควรอธิบายได้ทั้งหมด

ขอบคุณ @grgarside สำหรับคำตอบที่ยอดเยี่ยม

การตั้งค่าระบบ


5
โปรดทราบว่าแอพที่เฉพาะเจาะจงจะแตกต่างกันไป Script Editorเป็นเพียงการและScript Editor.app ในขั้นตอนการทำงานบริการก็osascript Automator Runnerเมื่อภายในมันAutomator.app Automator
ซีดี

1
ฉันคิดว่ามันน่ารำคาญที่ถ้าฉันคลิกที่แบนเนอร์มันจะเปิดแอปพลิเคชั่น Script Editor ขึ้นมา ฉันต้องการให้มันหายไปเมื่อคลิก แต่โพสต์นี้ชี้ให้เห็นว่าคุณสามารถโฮเวอร์เหนือและแทร็กแพดปัดไปทางขวาเพื่อให้มันหายไปอย่างเงียบ ๆ : osxdaily.com/2012/09/05/ …
Joshua Goldberg

@JoshuaGoldberg ขอบคุณที่เพิ่มสิ่งนั้น! ฉันพบว่าสังหรณ์ใจวันหนึ่งซึ่งเป็นสิ่งหนึ่งที่ฉันชอบเกี่ยวกับ Mac OS X มันใช้งานได้ตามที่คุณคาดหวังว่ามันจะทำงาน :)
Vic Jang

22

ตอนนี้คุณสามารถทำได้ด้วย Growl2 ( หาได้จาก App Store ) ติดตั้ง Growl และเปิดใช้งาน "OS X Notifications" (ภาพหน้าจอ)

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณจะต้องติดตั้ง GrowlNotify สำหรับเครื่องมือบรรทัดคำสั่งเพื่อส่งการแจ้งเตือน Growl คุณสามารถดาวน์โหลดเครื่องมือนี้ได้ฟรีในหน้าดาวน์โหลด

ตอนนี้คุณสามารถสร้างการแจ้งเตือน Growl จากบรรทัดคำสั่งซึ่งจะถูกส่งต่อไปยังศูนย์การแจ้งเตือน ตัวอย่างเช่น:

growlnotify -n "My App" -m "Hello world"

ป้อนคำอธิบายรูปภาพที่นี่

โปรดทราบว่าในปัจจุบันดูเหมือนว่าจะไม่สามารถเปลี่ยนไอคอนแอปพลิเคชันได้


1
วิธีการที่ดีโดยเฉพาะอย่างยิ่งถ้าคำรามติดตั้งแล้ว
เบซิ

1
ฉันคิดว่าคุณอาจใช้ตัวเลือก--icon path/to/icon.pngสำหรับไอคอน
จะ

เลิกใช้แล้ว / ไม่ดูแลอีกต่อไป? อัพเดทล่าสุดสำหรับ macos 10.9 mavericks
Seamus

15

ฉันเพิ่งแยกเครื่องแจ้งเตือนเทอร์มินัลเพื่อสร้างเครื่องมือบรรทัดคำสั่งเพื่อแสดงการแจ้งเตือน (พร้อมการกระทำ) และการแจ้งเตือนประเภทตอบกลับ

ฉันใช้มันกับเชลล์สคริปต์และแอป golang เพื่อรับคำตอบแบบโต้ตอบจากผู้ใช้

https://github.com/vjeantet/alerter

ป้อนคำอธิบายรูปภาพที่นี่


1
เห็นได้ชัดว่าเลิกใช้แล้ว / ถูกทอดทิ้ง
เชมัส

15

วิธีแก้ปัญหาของ@grgarsideนั้นดี แต่มันมีความเสี่ยงที่จะฉีดสคริปต์ซึ่งอาจเป็นปัญหาด้านความปลอดภัยที่สำคัญเมื่อมีการใช้เช่นเนื้อหาของไฟล์บันทึกการแสดงผลหรือสิ่งอื่นที่คล้ายคลึงกัน

สิ่งนี้ควรปลอดภัยกว่า:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'

สิ่งนี้เป็นสิ่งที่น่าสนใจ แต่คุณสามารถอธิบายสถานการณ์ที่สคริปต์ที่ฉันเรียกใช้บนระบบของฉันซึ่งผู้ใช้งานเท่านั้นที่เสี่ยงต่อการฉีดสคริปต์
iconoclast

1
หากคุณแสดงเนื้อหาผู้ใช้ที่ไม่ได้มาจากคุณแสดงว่าคุณมีช่องโหว่ ตัวอย่างเช่นถ้าคุณเรียกใช้สิ่งนี้ในระบบที่มีเว็บเซิร์ฟเวอร์สาธารณะหรือเมื่อแอพบางตัวบันทึกสตริงมันจะได้มาจากเน็ตที่คุณอ่านและแสดงผลเช่นเบราว์เซอร์โปรแกรมอีเมลหรือไคลเอนต์ Twitter มันอาจมี "การสิ้นสุดสตริงและคำสั่งแล้วมีรหัสแล้วเริ่มต้นสตริง
Archimedix

โอเคนั่นเป็นเรื่องจริง เป็นเรื่องยากสำหรับฉันที่จะจินตนาการว่าเคยวางเนื้อหาจากแบบฟอร์มเว็บไว้ในการแจ้งเตือนของฉัน แต่ประเด็นของคุณก็คือ
iconoclast

1
บางทีคุณอาจต้องการพูดอะไรบางอย่างI have a "laser"โดยไม่บอกว่าคุณมีข้อผิดพลาดทางไวยากรณ์โดย "อ้างอิง" คำ "ของคุณ" ด้วยการหลบหนีคุณสามารถ:script 'I have a "laser"'
Archimedix

1
โหวตขึ้นเพราะมันเป็นการดีเสมอที่จะคำนึงถึงความปลอดภัย บางคนสามารถคัดลอกโซลูชันพาสต้าและใช้ในวิธีที่บุคคลที่โพสต์โซลูชันไม่ได้พิจารณา
Edward Falk

13

ตั้งแต่คำรามไม่ฟรีและสถานี-แจ้งไม่สามารถใช้ได้ในก่อน 10.8 ระบบฉันมักจะใช้cocoaDialog มันฟรีและโอเพ่นซอร์สดังนั้นคุณอาจแจกจ่ายไปพร้อมกับสคริปต์ของคุณได้

หากคุณไม่ต้องการการปรับแต่งมากมายคุณสามารถใช้ AppleScript display notificationซึ่งคุณสามารถโทรจากเชลล์ได้ตามที่คนอื่น ๆ พูดถึงแล้ว

แต่ระวังว่า AppleScript ดูเหมือนว่าจะต้องมีเครื่องหมายคำพูดคู่ ดังนั้นหากคุณต้องการตัวแปรสิ่งนี้จะไม่ทำงาน :

osascript -e "display notification '$text' with title '$title'" #WRONG

คุณจะต้องใช้เครื่องหมายคำพูดคู่ที่หลบหนี นี้น่าเกลียดแต่ใช้งานได้ :

osascript -e "display notification \"$text\" with title \"$title\""

วิธีนี้ใช้ได้กับ:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel

เลิกใช้แล้ว ผลตอบแทนจากลิงก์ "ไม่มีไซต์ของหน้า GitHub ที่นี่"
เชมัส

11

(นี่เป็นการดำเนินการทางเลือกโดยยึดตามคำตอบที่ยอดเยี่ยมของ @ grgarside)

AppleScript สามารถตีความได้โดยตรงโดยใส่osascriptในบรรทัด Shebang

#!/usr/bin/osascript

on run argv
    if length of argv = 1 then
        display notification (item 1 of argv) with title "Notification"
    else if length of argv > 1 then
        display notification (item 1 of argv) with title (item 2 of argv)
    else
        return "<message> is required\nUsage: notify <message> [<title>]"
    end if
end run

บันทึกสิ่งนี้เป็นที่ที่notifyอยู่ในเส้นทางของคุณเช่น/usr/local/bin/notifyและทำให้มันใช้งานได้ ( chmod +x notify) ยอมรับข้อความและชื่อตัวเลือก หากทั้งสองมีช่องว่างห่อในเครื่องหมายคำพูดเพื่อให้เชลล์ตีความว่ามันเป็นอาร์กิวเมนต์เดียว

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"

นี่เป็นการหลีกเลี่ยงการโจมตีด้วยการฉีดที่คำตอบอื่น ๆ มีความเสี่ยงต่อ
Neil Mayhew

7

ต่อไปนี้เป็นสิ่งที่ยอดเยี่ยมที่ฉันใช้ใน ruby ​​script ใน OS X (เพื่อให้ฉันสามารถเริ่มต้นสคริปต์และรับการอัปเดตแม้หลังจากสลับจากหน้าต่าง):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )

2
ว้าว ... โซ่นั้นคล้ายกับผู้ใช้ -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclast

5

ทางเลือก:

ใน.bash_profile:

function _sys_notify() {
    local notification_command="display notification \"$2\" with title \"$1\""
    osascript -e "$notification_command"
}
alias sys-notify="_sys_notify $1 $2"

ใช้คำสั่ง: sys-notify "title" "message"


5

เอกสารอย่างเป็นทางการ

https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotifications.html

คัดลอกข้อความที่นี่ในกรณีที่มีการย้ายหรือลบเอกสาร

หากต้องการแสดงการแจ้งเตือนให้ระบุคำสั่ง display display ที่มีสตริงที่จะแสดง เป็นทางเลือกให้ระบุค่าสำหรับพารามิเตอร์ด้วยชื่อเรื่องคำบรรยายและชื่อเสียงเพื่อให้ข้อมูลเพิ่มเติมและการแจ้งเตือนด้วยเสียงเมื่อการแจ้งเตือนปรากฏขึ้น

display notification "All graphics have been converted." with title "My Graphic Processing Script" subtitle "Processing is complete." sound name "Frog"

บันทึก

หลังจากใช้สคริปต์เพื่อแสดงการแจ้งเตือนสคริปต์หรือตัวแก้ไขสคริปต์ (หากเรียกใช้สคริปต์จากภายในตัวแก้ไขสคริปต์) จะถูกเพิ่มไปยังรายการแอปแจ้งเตือนในการตั้งค่าระบบ> การแจ้งเตือน ที่นั่นคุณสามารถกำหนดค่าตัวเลือกต่างๆเช่นแสดงการแจ้งเตือนเป็นการแจ้งเตือนหรือแบนเนอร์

คลิกที่ปุ่มแสดงในการแจ้งเตือนสไตล์การแจ้งเตือนเปิดแอพที่แสดงการแจ้งเตือน สำหรับแอปพลิเคชันสคริปต์การเปิดแอปอีกครั้งจะเรียกใช้ตัวจัดการการเรียกใช้สคริปต์ซึ่งอาจทำให้สคริปต์เริ่มประมวลผลครั้งที่สอง โปรดระลึกไว้เสมอและเพิ่มรหัสลงในสคริปต์ของคุณเพื่อจัดการกับสถานการณ์นี้หากเหมาะสม


1

ขอบคุณนี่เป็นสิ่งที่ฉันต้องการสำหรับสคริปต์ผู้ใช้บางส่วน ฉันทำการปรับเปลี่ยนเล็กน้อยเพื่อเพิ่มคำบรรยายและเสียง หากไม่มีการระบุค่าจะถูกละเว้น

function _sys_notify() {
local notification_command="display notification \"$2\" with title \"$1\" subtitle \"$3\" sound name \"$4\""
osascript -e "$notification_command"
}

alias sys-notify="_sys_notify $1 $2 $3 $4"

สำหรับเสียงใช้ชื่อไฟล์เสียงที่ไม่มีส่วนขยายจาก / System / Library / Sounds ตัวอย่างเช่นหากต้องการใช้ไฟล์ Ping.aiff ให้ใช้ Ping ราคา $ 4

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.