2009年12月27日星期日

Free SMS

功能:
通过互联网免费发送短信

原理:
Google Calendar可以通过运营商发送短信提醒
Google App Engine可以当虚拟主机运行简单的程序
Google App Engine上可以跑Google Calendar API的类库

详解:
假设你想给A发短信,而且不想花钱。
1、让A注册一个Google账号,如果A已经有Google账号,此步可以省略;
2、你自己用一个Google账号B,在Calendar里面创建一个新日历,比如名字叫aaa,分享给A;
3、让A打开他账号下的Calendar,如果还没设置SMS,要先点Set up your mobile phone to receive
notifications,选中国、输入手机号,点"发送验证码",然后A的手机短信收到一个验证码,填到网页的验证码输入框中,点"Finishe
Setup",然后页面显示状态变成了绿色的"Phone number successfully
validated"。关键--让A找到你分享给A的日历aaa,设置提醒,默认通过SMS,提前事件一分钟发送;
4、你去开通Google App Engine,在xxxxx.appspot.com部署一个网站,网站后台程序自动通过Calendar
API向账号B的日历aaa添加事件,事件的时间设置为当前时间+75秒,这样你基本上就可以实时给A发消息了。程序关键的一段代码(Java):
private void send_msg(String to, String msg) throws Exception {
// login
CalendarService myService = new CalendarService("useless");
myService.setUserCredentials(USERNAME, PASSWORD);
// get URL
CalendarFeed resultFeed = myService
.getFeed(
new URL(
"http://www.google.com/calendar/feeds/default/owncalendars/full"),
CalendarFeed.class);
String post_url = null;
for (int i = 0; i < resultFeed.getEntries().size(); ++i) {
CalendarEntry entry = resultFeed.getEntries().get(i);
if (entry.getTitle().getPlainText().equals(to)) {
post_url = "http://www.google.com/calendar/feeds"
+ entry.getId().substring(
entry.getId().lastIndexOf("/"))
+ "/private/full";
break;
}
}
// create event
if (post_url == null)
throw new Exception(to + " not found");
CalendarEventEntry myEntry = new CalendarEventEntry();
myEntry.setTitle(new PlainTextConstruct(msg));
long now = DateTime.now().getValue() + (TIMEZONE * 3600 + DELAY) * 1000;
When eventTimes = new When();
eventTimes.setStartTime(new DateTime(now));
eventTimes.setEndTime(new DateTime(now + 60 * 1000));
myEntry.addTime(eventTimes);
myService.insert(new URL(post_url), myEntry);
}
然后外面简单包一层就可以用了
public class SimpleServlet extends HttpServlet {
private static final String USERNAME = "B@gmail.com";
private static final String PASSWORD = "B";
// now() + delay = the event time
private static final long DELAY = 60 + 15;//seconds
private static final int TIMEZONE = 8;//hours
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String to = req.getParameter("to");
String msg = req.getParameter("msg");
send_msg(to, msg);
}
}
(其中时区的问题你得自己动脑筋想一想)
配置web.xml
<servlet>
<servlet-name>api</servlet-name>
<servlet-class>SimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>api</servlet-name>
<url-pattern>/api</url-pattern>
</servlet-mapping>
5、通过Web发送短信
打开Firefox或UCWeb,输入网址,形如http://xxx.appspot.com/api?to=aaa&msg=balabala

限制:
msg不能超过57个字符(不同账号可能会有出入)
可能有一天app engine会撞墙
可能有一天你app engine的quota会用完
可能有一天Google会Ban掉你这样调用API的

开发:
个人认为用Java+Eclipse+Google Plug-in最方便,可以本地debug、一键部署
http://code.google.com/appengine/docs/java/tools/eclipse.html

应用:
1、私聊
用Web发送,用短信接收,所以只要能上网,就可以随时随地免费发短信,而且接受者可以不用上网。比飞信省流量,还不用装客户端。P.S.因为你可以登陆账号B,所以如果什么话说出去后又后悔了,可以在15秒内登陆Google
Calendar删除该Event即可。

2、当Twitter用
把自己的日历publish出去,让你那几个闺蜜来订阅。然后你api?to=yourself&msg=balabalalalala她们就收到短信了。

3、群聊
为了识别说话人的身份,Servlet程序需要多做一点工作。不然群里你一言我一语都不知道哪句话是谁说的就乱套了。
另外,怎样才能用一种简单的方式,不让自己的留言也发条短信给自己,我还没想好。

4、Monitor
比如你有一个系统,后台跑一个cronjob,让它
50 0 * * * wget "http://xxxx.appspot.com/api?to=your_team&msg=`grep
ERROR logfile | wc -l`" -O /dev/null

没有评论: