其实这个题目有点夸大,呵呵。
给大家分享一下我前些日子做得一件事情,可能对某些人来说,能从中间体会到一些什么。
我的母亲对天气预报特别关注,每天晚上一到电视播天气预报的时候就准时的守候在电视跟前,偶尔某天错过了,她还会懊恼不已,然而她又舍不得花钱定制移动的短信天气预报服务。所以,我就想,我能为她作些什么呢?
问题描述:利用Linux下的飞信功能,用QT写一个自动发送天气预报到飞信好友的服务端,用linux的crond周期执行此服务端。
解决方案描述:
1、天气预报信息:我写了一个perl脚本,自动从天气预报网站上抓取我们这里县城的天气预报信息(今后5天的),保存到本地文件。
2、编程使用linux下的飞信功能:在linux下的飞信客户端开发出来后,我通过邮件和飞信客户端的作者联系了,希望能得到linux下的飞信库源码,但是遗憾的是,作者出于一些原因,不能提供飞信库源码。不过好在我需要使用飞信库的函数不多,仅仅是几个简单的登录和发送函数,所以我下了libfetion静态库,通过阅读linux下飞信客户端的源码,获得了我需要使用的几个函数声明。编程测试通过,万事俱备矣。
3、利用QT的QCoreApplication,写一个QT的Non-gui程序,作为我的服务端,将其挂载在单位的服务器上,每天发送一次天气预报给我的飞信好友。
执行的源码:
#include <libfetion/libfetion.h>
#include <QTextCodec>
#include <QStringList>
#include <QFile>
#include <QDir>
#include "server.h"
Server::Server()
: QObject()
{
if(!fx_init()){
return;
}
//手机号码和飞信登录密码
if(!fs_login(tel_number, tel_password)){
return;
}
//读取本地天气预报文件
QStringList string_list_date;
QStringList string_list_temperature;
QStringList string_list_weather;
//weather文件保存脚本抓取到的天气预报,有特点的格式。
QFile file("weather.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))return;
while (!file.atEnd()) {
QString string_line = file.readLine();
string_line.chop(1);
if(string_line.indexOf("℃") != -1){
string_list_temperature << string_line;
}else if(string_line.indexOf("00") != -1){
string_list_date << string_line;
}else {
string_list_weather << string_line;
}
}
file.close();
if(string_list_weather.size() == 0 || string_list_date.size() == 0 || string_list_temperature.size() == 0){
return;
}
//开始发送天气预报信息,可以选取其中的哪几天
QString string_weather;
for(int i = 0; i < 2; i++ ){
string_weather.append(string_list_date.at(i));
string_weather.append(",");
string_weather.append(string_list_temperature.at(i));
string_weather.append(",");
string_weather.append(string_list_weather.at(i));
string_weather.append(";\n");
}
//飞信发送
Fetion_Account *account = NULL;
DList *tmp_account = fx_get_account();
while(tmp_account)
{
account = (Fetion_Account *)tmp_account->data;
if(account)
{
fs_send_sms(account->id, string_weather.toLocal8Bit());
}
tmp_account = d_list_next(tmp_account);
}
//发送给自己
fs_send_sms_to_self( string_weather.toLocal8Bit());
fx_loginout();
fx_terminate();
}