Pages

Friday, 21 September 2012

通过Google Voice短信发送PPPoE拨号所得IP


Google Voice 可以免费发送英文短信,不过官方并没有公布 API,网上有些零星的应用,多半是用 PHP 或 Perl 实现的。对于 perl 我是没什么想法了,phpgooglevoice 倒是可以拿来用用,但是问题在于路由器上电启动进行 pppoe 拨号的时候,lighttpd 可能还没有启动,这时候调用 PHP 的短信接口往往或出错。
研究了下 phpgooglevoice 的实现类,发现可以在 shell 下用 curl 来实现,一番折腾后得到如下脚本
#!/bin/sh
EMAIL=
PASSWD=
PHONE=
CURL=”/opt/usr/bin/curl –silent –insecure –user-agent \”Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11 Safari/525.20\”"
LOGINURL=”https://www.google.com/accounts/ClientLogin”
INBOXURL=”https://www.google.com/voice/m/”
SMSURL=”https://www.google.com/voice/m/sendsms”
RESULT=$CURL –data “accountType=GOOGLE&Email=$EMAIL&Passwd=$PASSWD&service=grandcentral&source=lostleonATgmailDOTcom-GoogleVoiceTool” $LOGINURL
for i in $RESULT; do
if [ echo $i | awk -F= '{print $1}' = "Auth" ]; then
AUTH=echo $i | awk -F= ‘{print $2}’
fi
done
RESULT=$CURL –referer $LOGINURL $INBOXURL?auth=$AUTH | awk -F ‘name=”_rnr_se” value=”‘ ‘{print $2}’ | awk -F ‘”‘ ‘{print $1}’ | /opt/bin/urlencode.sh
for i in $RESULT; do
_RNR_SE=$i
done
PARAM=”id=&c=&number=$PHONE&_rnr_se=$_RNR_SE&smstext=echo $1 | /opt/bin/urlencode.sh”
RESULT=$CURL –referer “$INBOXURL?auth=$AUTH” –data $PARAM $SMSURL?auth=$AUTH
#echo $RESULT
我把它保存为 /opt/bin/gvsms.sh,脚本的开头有 3 个参数需要设置。
gvsms.sh 在编码 curl 的 POST 参数时调用了 shelldorado 的 urlencode.txt 脚本,我把它放在 /opt/bin 路径下,并且改名为 urlencoder.sh 了。由于这个 urlencode.txt 脚本需要完整版本的 awk 支持,而 OpenWRT 只有链接到 busybox 的 awk,所以又安装了 optware 上的 gawk,并且修改 urlencode.txt 第 52 行,指定其使用 /opt/bin/awk。
现在让它在 pppoe 拨号后自动发送获得的 IP,只需要在 /etc/hotplug.d/iface/30-ddns 中加入相关代码即可,比如这样
/opt/bin/gvsms.sh ifconfig ppp0 | awk ‘/inet/{print $2}’ | awk -F: ‘{print $2}