
Asterisk Desktop Dialer
You’ll need a mac (obviously), a desktop phone (even more obviously), and an asterisk server (most obviously), preferably on your lan, which you can configure to allow network access to the AMI (Asterisk Manager Interface).
First, the script (also available on github):
set clipnumber to (the clipboard as text)
set thenumber to truncateString(clipnumber, 50)
set answer to "OK"
repeat while answer = "OK"
set question to display dialog "Number to Dial:" buttons {"Cancel", "OK"} default button 2 default answer thenumber with icon 1
set answer to button returned of question
set thenumber to text returned of question
if answer is equal to "OK" then
DialOut(thenumber)
(display dialog "Dialing: " & thenumber buttons {"OK"} giving up after 2)
end if
end repeat
on truncateString(txt, max)
set txtLength to (length of txt)
if txtLength > max then
set txt to (text 1 thru (max - 1) of txt) as string
end if
return txt
end truncateString
on cleanString(str, chars)
set tid to AppleScript's text item delimiters
repeat with c in chars
set AppleScript's text item delimiters to {c}
set chunks to text items of str
set AppleScript's text item delimiters to ""
set str to chunks as Unicode text
end repeat
set AppleScript's text item delimiters to tid
return str
end cleanString
-- find : Text (or list of text) to be found
-- replace : Text (or list of text) to replace with
-- subject : Text (or list of text) to be searched
on str_replace(find, replace, subject)
set prevTIDs to text item delimiters of AppleScript
set returnList to true
-- This wouldn't make sense (you could have it raise an error instead)
if class of find is not list and class of replace is list then return subject
if class of find is not list then set find to {find}
if class of subject is not list then ¬
set {subject, returnList} to {{subject}, false}
set findCount to count find
set usingReplaceList to class of replace is list
try
repeat with i from 1 to (count subject)
set thisSubject to item i of subject
repeat with n from 1 to findCount
set text item delimiters of AppleScript to item n of find
set thisSubject to text items of thisSubject
if usingReplaceList then
try
item n of replace
on error
"" -- `replace` ran out of items
end try
else
replace
end if
set text item delimiters of AppleScript to result
set thisSubject to "" & thisSubject
end repeat
set item i of subject to thisSubject
end repeat
end try
set text item delimiters of AppleScript to prevTIDs
if not returnList then return beginning of subject
return subject
end str_replace
on DialOut(telephone)
set mynumber to "SCCP/53" -- your asterisk extension number, change to SIP or IAX as appropriate
set username to "admin" -- asterisk manager username
set passwd to "amp111" -- asterisk manager password
set remotehost to "192.168.1.101" -- asterisk server ip address
set context to "from-internal" -- context for outgoing calls
set numbertocall to my cleanString(telephone, {" ", "-", ")", "(", "."})
set numbertocall to my str_replace("+", "00", numbertocall)
set callerid to numbertocall
set expectscript to "set timeout 20;
spawn telnet " & remotehost & " 5038;
expect \"Asterisk Call Manager/1.1\";
send \"Action: login
username: " & username & "
secret: " & passwd & "
\";
expect \"Message: Authentication accepted\";
sleep 1;
send \"Action: originate
Exten: " & numbertocall & "
Context: " & context & "
Channel: " & mynumber & "
Priority: 1
Callerid: Outgoing Call <" & callerid & ">
\";
sleep 1;
send \"Action: logoff
\";
"
-- display dialog expectscript
set results to do shell script "/usr/bin/expect -c '" & expectscript & "'"
-- if (results is not equal to "") then display dialog results
end DialOut
Change the various values to match your configuration (the values I have are mostly defaults for FreePBX). Note that if you’re using Asterisk 1.4, you’ll need to change the expect script from “Asterisk Call Manager/1.1″ to “Asterisk Call Manager/1.0″. Also note that the above is a direct copy/paste of what I use, so it has some other (probably unnecessary) tweaks in there – the most notable being that it pre-populates the number field from the clipboard text.
Next you’ll need to configure asterisk to allow AMI connections from your lan. Open the file /etc/asterisk/manager.conf and change as appropriate. The following is mine:
[general] enabled = yes port = 5038 bindaddr = 0.0.0.0 displayconnects=yes ;only effects 1.6+ [admin] secret = amp111 deny=0.0.0.0/0.0.0.0 permit=127.0.0.1/255.255.255.0 permit=192.168.1.0/255.255.255.0 ; this is important - won't be present by default read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
Restart asterisk, save your applescript as an application, and bob is your relative.
Actually, I guess you could do this without a desktop phone and have it trigger a call to your mobile or something …
What’s that they say? Ah yes: This is left as an exercise for the reader.
Note: this is adapted from Zed’s script here.
Popularity: 3% [?]