麦步社区-论坛

标题: [更新]自己做的一个天气api地址 新加月相和日出日落时间api [打印本页]

作者: 石头    时间: 2016-6-27 11:05
标题: [更新]自己做的一个天气api地址 新加月相和日出日落时间api
本帖最后由 石头 于 2016-7-1 20:23 编辑

之前做了一个天气表盘,主要是自己的做了一个转发的页面,弥补了麦步sdk中只能获取son数组中同样的key只能获取第一个key对应的值的问题。然后又用自己的一个闲置域名绑定了一个免费的空间,把那个转发的页面放了上去。
访问地址是:http://www.pilipapa.com/weather.php?city=所在的城市
比如:http://www.pilipapa.com/weather.php?city=北京
获得数据是:
{"err":0,"city":"北京","aqi":"良","uvi":"中等","t":"23","w1":"雷阵雨","t1":"33~21","d1":"微风","w2":"雷阵雨","t2":"26~20","d2":"微风","w3":"雷阵雨转多云","t3":"29~22","d3":"微风","w4":"阴转雷阵雨","t4":"29~22","d4":"微风"}
key所对应的值是:
err:错误代码,0代表的是成功
city:城市名称
aqi:空气质量
uvi:紫外线强度
t:今天的实时温度
w1: 今天的天气(w2,w3,w4依次为明天,后天,大后天的天气)
t1:今天的温度范围(t2,t3,t4依次为明天,后天,大后天的温度范围)
d1:今天的风向和强度(d2,d3,d4依次为明天,后天,大后天的风向和强度)

然后提供给有需要的麦友吧。

至于天气表盘的源码,都是依照卖萌表盘的源码修改的,主要是替换了获取json的几个key,都很简单。然后代码改的比较乱,就不公开了。

然后大家有什么请求联网数据的需要,获取一些什么信息,用到转发的话,可以说一下,我会尽量做一个。
【更新】
增加日出日落时间:
http://www.pilipapa.com/sun.php?city=城市
返回json示例:
http://www.pilipapa.com/sun.php?city=北京

{"sunrise":"04:52","sunset":"19:44","sunAltitude":-0.11,"sunAzimuth":2.21,"moonrise":"03:00","moonset":"17:29","moonAltitude":-0.55,"moonAzimuth":2.74}
增加月相:
http://www.pilipapa.com/moon.php
返回json示例
{"age":26.3,"distance":"365223.99","phase_name":"残月","phase":88}
phase代表月亏得百分比


作者: 超爱麦步    时间: 2016-6-27 15:51
这个太好了!
作者: 超爱麦步    时间: 2016-6-27 15:52
这个域名会一直在吗?
作者: 陶坤@麦步    时间: 2016-6-27 16:02
支持下 给很多开发者提供了方便
作者: 石头    时间: 2016-6-27 16:07
域名会一直在的 空间是免费的 但是应该是没什么问题吧
作者: wx_AAlzVp9L    时间: 2016-6-27 16:30
然而想自己动手做却无从下手 没学过c需要啥也看不懂啊 能不能哪位大神给小白这个简单教程
作者: 石头    时间: 2016-6-27 19:23
wx_AAlzVp9L 发表于 2016-6-27 16:30
然而想自己动手做却无从下手 没学过c需要啥也看不懂啊 能不能哪位大神给小白这个简单教程 ...

接触过编程吗,只要知道什么是变量和函数就行了,改表盘无非是通过源码改,改图片位置,改文字位置,如果是改天气的话就是改几个key就行了,照那个卖萌天气改就很好弄了。要说工作量的话,无非复制粘贴多一些,打包调试麻烦些。遇到不懂的尽情百度。
作者: aix    时间: 2016-6-27 20:26
石头 发表于 2016-6-27 19:23
接触过编程吗,只要知道什么是变量和函数就行了,改表盘无非是通过源码改,改图片位置,改文字位置,如果 ...

說的太好了,確實如此,無中生有那是大神在幹的!

不過話說回來,樓主您也是大神級的,能搞一個這個服務也太強了…
作者: 石头    时间: 2016-6-27 21:06
本帖最后由 石头 于 2016-6-27 21:26 编辑
aix 发表于 2016-6-27 20:26
說的太好了,確實如此,無中生有那是大神在幹的!

不過話說回來,樓主您也是大神級的,能搞一個這個服務 ...

我还是小白级别的。然后看到6楼自己做过表盘。应该就很容易了。
然后我还是说一下改天气的地方吧。
参照卖萌天气源码。
第40行和第42行
#define WEATHER_KEY                        "temperature,pm25,info,level"

#define WEATHER_URL "http://op.juhe.cn/onebox/weather/querykey=REPLACE_WITH_YOUR_KEY_HERE&cityname="

比如把WEATHER_KEY 改成"w1,t1,w2,t2" 这个就是获取w1这个key的值,就是今天的天气,w2-明天的天气,t1-今天的温度范围,t2-明天温度范围。当然如果想获取后天的天气,可以再加w3,t3。依次类推。
然后把WEATHER_URL 改成"http://www.pilipapa.com/weather.php?city="

然后再在164行的那个weather_info_callback函数内改key,第176,177,178行。
        maibu_get_json_int(buff, "temperature", &g_temperature);
        maibu_get_json_int(buff, "level",&g_level);
        maibu_get_json_int(buff, "pm25", &g_curPm);
把第二个参数改成我们的key,w1,t1,w2,t2,当然还要复制一行。
因为maibu_get_json_int这个函数是获取int整数类型的。而我们的json数组中都是string类型的
所以要改成maibu_get_json_str,相应的第三个参数要改成char[]类型的。所以你在程序开头建四个char[]类型的变量,不行就吧19行的那个
static char    g_city[20]              = {0};
复制四个,改改变量名比如可以改成w1,t1,w2,t2 ,然后因为天气信息大约最多6个汉字吧,6x4,把20改成30。
就是:
static char    w1[30]              = {0};
static char    t1[30]              = {0};
static char    w2[30]              = {0};
static char    t2[30]              = {0};
然后再回到164行的函数那里,改里面的maibu_get_json_int这种函数
maibu_get_json_str(buff, "w1", &w1);
maibu_get_json_str(buff, "t1", &t1);
maibu_get_json_str(buff, "w2", &w2);
maibu_get_json_str(buff, "t2", &t2);

这样你就可以获得了今天的天气w1,今天的温度范围t1,明天的天气w2,明天的气温范围t2。

然后如果需要更多的信息,加key,加成员变量,加maibu_get_json_str就行了。很简单吧。
对了还有180行的那个判断语句

               
        if(maibu_get_json_str(buff, "info", buffer,sizeof(weather_info)) != JSON_ERROR )
        {//防止数据为空导致的数据清空
                memset(weather_info,0,sizeof(weather_info));
                maibu_get_json_str(buff, "info", weather_info,sizeof(weather_info));
                g_weather_icon_key = get_weather_icon(weather_info,get_date_flag());
        }
        else
        {
                return;
        }



这个里面的"info"可以改成"w1",然后把g_weather_icon_key改成g_weather_icon_key = 1。这个只是偷懒的方法,如果要优化的话,这里的判断语句里面还是需要优化一下的。

至于展示天气信息,就需要改文字,改图片,界面了。

以上只是最简单的修改方法。

作者: wx_AAlzVp9L    时间: 2016-6-30 00:26
超爱麦步 发表于 2016-6-27 15:51
这个太好了!

这个给超爱肯定又将带来惊喜啊!然而我什么都看不懂:'(:'(:'(
作者: 大大眼睛    时间: 2016-6-30 22:52
楼主,非常感谢你的分享,我在使用时遇到一个问题,
maibu_comm_request_web("http://www.pilipapa.com/weather.php?city=beijing",WEATHER_KEY, 0);
这样是可以得到数据的,但是我使用中文:
maibu_comm_request_web("http://www.pilipapa.com/weather.php?city=北京",WEATHER_KEY, 0);
反而无法获取到数据了。另外,我使用官方的       
if(city_name != NULL)
        {
                int i = 0,j = 0;
                for(i;(city_name[i] != '\0')&&(j < sizeof(url)) ;++i)
                {
                        sprintf(url,"%s%%%x",url,city_name[i]);
                }

        }
然后用此url请求网络(city_name是中文“北京”),也是获取不到数据,这是什么原因呢?麻烦楼主指导一下:lol
作者: 石头    时间: 2016-7-2 18:11
大大眼睛 发表于 2016-6-30 22:52
楼主,非常感谢你的分享,我在使用时遇到一个问题,
maibu_comm_request_web("http://www.pilipapa.com/wea ...

刚看到 我先看看 可能跟编码有关
作者: 超爱麦步    时间: 2016-7-2 21:02
本帖最后由 超爱麦步 于 2016-7-2 21:19 编辑

请问是从哪个天气预报数据源转的天气数据?


作者: 石头    时间: 2016-7-2 22:01
大大眼睛 发表于 2016-6-30 22:52
楼主,非常感谢你的分享,我在使用时遇到一个问题,
maibu_comm_request_web("http://www.pilipapa.com/wea ...

我测试的时候没有问题的 然后访问url的时候中文参数是需要自己转码的 也就是你下面列出源码中的的那一段  需要把中文转为url编码 可能期间你在某个地方出现了问题 在编码前 你先获取一下city_name是否正确 还有url是否正确 如果实在搞不定 还是通过卖萌天气的源码一点一点修改吧
作者: 石头    时间: 2016-7-2 22:01
超爱麦步 发表于 2016-7-2 21:02
请问是从哪个天气预报数据源转的天气数据?

百度的天气api
作者: wx_F0oe_HDF54    时间: 2016-7-3 13:05
都不知道怎么搞新手上路
作者: bigKevin    时间: 2016-7-5 17:04
石头 发表于 2016-7-2 22:01
我测试的时候没有问题的 然后访问url的时候中文参数是需要自己转码的 也就是你下面列出源码中的的那一段  ...

好的,多谢楼主指导,我再试试。。。
作者: 再清风    时间: 2016-7-5 17:48
强人,越来越好
作者: gylgb    时间: 2016-7-7 20:04
牛人。。。。。。
作者: bigKevin    时间: 2016-7-8 10:59
楼主,数据里面的aqi不准,始终是优,改下吧:D
作者: 石头    时间: 2016-7-8 18:52
bigKevin 发表于 2016-7-8 10:59
楼主,数据里面的aqi不准,始终是优,改下吧

谢谢你发现了这个问题,已经修复了:D




欢迎光临 麦步社区-论坛 (http://bbs.maibu.cc/) Powered by Discuz! X3.2