标题: [原创代码] JScript版天气预报 [打印本页]
作者: Spring 时间: 2011-10-18 11:21 标题: JScript版天气预报
数据来自 http://www.weather.com.cn
JScript脚本文件:weather.js- /*--------------------*
- * Global Variables *
- *--------------------*/
- var req, isGoodLuck;
- var lii = "http://61.4.185.48:81/g/";
- var pcc = "http://www.weather.com.cn/data/list3/city*.xml";
- var data = "http://m.weather.com.cn/data/*.html";
- var sb = "http://toy.weather.com.cn/SearchBox/searchBox?language=zh&callback=gs&_=@&keyword=*";
-
-
- /*-------------*
- * Functions *
- *-------------*/
- function showUsage() {
- var s = "中國天氣\r\n\r\n";
- s += "指定一个三级行政区地名。\r\n"
- s += "weather.js [province [city [county]]] [/F] [/A] [/T]\r\n";
- s += " province 省、自治区、(直辖)市、特别行政区\r\n";
- s += " city 地区、盟、自治州、(地级)市\r\n";
- s += " county 县、自治县、旗、自治旗、(县级)市、(市辖)区、林区、特区\r\n";
- s += " /F 使用华氏温度\r\n";
- s += " /A 未来一周天气预报\r\n";
- s += " /T 显示明日生活指数\r\n\r\n";
- s += "根据查询关键字搜索城市天气预报。\r\n";
- s += "weather.js [keyword] [/F] [/A] [/T] [/S]\r\n";
- s += " keyword 关键字。如市名、全拼、简拼、电话区号、邮编等。\r\n";
- s += " /S 手气不错\r\n\r\n";
- s += "地名中不要包含省、市、州、县、区等行政区划名称。";
- s += "如果指定的地名不足三级,则默认识别为其中心城市。";
- s += "如果没有指定地名或者关键字,则默认显示本地天气。";
- WScript.Echo(s);
- WScript.Quit();
- }
-
- function getRequestText(url) {
- req = req || new ActiveXObject("Msxml2.XMLHTTP");
- req.open("GET", url, false);
- req.send(null);
- return req.responseText;
- }
-
- function getCityArray(cid) {
- cid = cid || "";
- var reqText = getRequestText(pcc.replace(/\*/, cid));
- var jsArray = reqText.replace(/\,/g, "'],['");
- jsArray = jsArray.replace(/\|/g, "','");
- jsArray = "[['" + jsArray + "']]";
- return eval(jsArray);
- }
-
- function getCodeByName(arr, v) {
- var k;
- if(v == null || v == "") {
- k = arr[0][0];
- } else {
- for(var i=0; i<arr.length; i++) {
- if(arr[i][1] == v) {
- k = arr[i][0];
- break;
- }
- }
- }
- return k;
- }
-
- function getID(province, city, county) {
- var idReturn;
- if(province == null || province.replace(/\s/g, "") == "") {
- eval(getRequestText(lii));
- idReturn = id;
- } else {
- var arrProvince = getCityArray();
- var provinceID = getCodeByName(arrProvince, province);
- if(!provinceID) {
- var keywords = province;
- idReturn = getIDBySearch(keywords);
- } else {
- var arrCity = getCityArray(provinceID);
- var cityID = getCodeByName(arrCity, city);
- if(cityID) {
- var arrCounty = getCityArray(cityID);
- var countyID = getCodeByName(arrCounty, county);
- if(countyID) {
- var idMapping = getRequestText(pcc.replace(/\*/, countyID));
- idReturn = idMapping.replace(/.*\|(\d+)/, "$1");
- } else {
- WScript.Echo("未找到指定的三级行政区: " + province + " - " + city + " - " + county);
- WScript.Quit();
- }
- } else {
- WScript.Echo("未找到指定的二级行政区: " + province + " - " + city);
- WScript.Quit();
- }
- }
- }
- return idReturn;
- }
-
- function getIDBySearch(keywords) {
- var gs = function(obj) {
- var id;
- if(obj.i) {
- var rs = obj.i;
- if(isGoodLuck == true) {
- id = rs[0].i;
- } else {
- for(var i=0; i<rs.length; i++) {
- var x = rs[i];
- WScript.Echo((i + 1) + ".\t" + (x.m ? "[" + x.m + "]: " : "") + x.n + " - " + x.d);
- }
- var n = 0;
- while(n == 0) {
- WScript.StdOut.Write("选择:");
- var s = WScript.StdIn.ReadLine();
- if(s && !isNaN(s)) n = Number(s);
- }
- id = rs[n - 1].i;
- }
- } else {
- WScript.Echo("对不起,未找到您查询的城市天气!");
- WScript.Quit();
- }
- return id;
- }
- var url = sb;
- url = url.replace(/@/, (new Date()).getTime());
- url = url.replace(/\*/, encodeURI(keywords));
- return eval(getRequestText(url));
- }
-
- function getWeather(id) {
- var json = getRequestText(data.replace(/\*/, id));
- eval("var info = (" + json + ").weatherinfo");
- return info;
- }
-
- function getSimpleInfo(w) {
- var s = w.city + "(" + w.city_en + ")";
- return s;
- }
-
- function getDataInfo(w) {
- var s = "气象数据发布于 " + w.week + " " + w.date_y + " " + w.fchh + ":00";
- return s;
- }
-
- function getTips(w) {
- var s = w.index_d + "\r\n";
- s += "紫外线强度:\t" + w.index_uv + "\r\n";
- s += "穿衣指数:\t" + w.index + "\r\n";
- s += "晨练指数:\t" + w.index_cl + "\r\n";
- s += "舒适度指数:\t" + w.index_co + "\r\n";
- s += "晾晒指数:\t" + w.index_ls + "\r\n";
- s += "旅游指数:\t" + w.index_tr + "\r\n";
- s += "洗车指数:\t" + w.index_xc;
- return s;
- }
-
- function getForecast(w, c, n) {
- var s;
- if(!n || isNaN(n) || n == 0 || n > 6) {
- s = w.weather1 + "\r\n" + (c ? w.tempF1 : w.temp1) + "\r\n" + w.wind1;
- } else {
- s = "未来" + (n < 3 ? (n*24) + "小时" : "第" + n + "天") + ":\t";
- s += eval("w.weather" + n) + " ";
- s += eval((c ? "w.tempF" : "w.temp") + n) + " ";
- s += eval("w.wind" + n);
- }
- return s;
- }
-
-
- //==============================================================================
-
-
- var t = WScript.Arguments.Named;
- var p = WScript.Arguments.Unnamed;
- if(t.Exists("?")) showUsage();
- if(t.Exists("S")) isGoodLuck = true;
- var province = p.Count > 0 ? p(0) : "";
- var city = p.Count > 1 ? p(1) : "";
- var county = p.Count > 2 ? p(2) : "";
- var is6DaysForcast = t.Exists("A") ? true : false;
- var isShowLivingIndex = t.Exists("T") ? true : false;
- var isFahrenheit = t.Exists("F") ? true : false;
-
- var id = getID(province, city, county);
-
- var weather = getWeather(id);
-
- var str = getSimpleInfo(weather);
-
- if(is6DaysForcast) {
- str += "\r\n" + getDataInfo(weather);
- for(var i=0; i<6; i++) {
- str += "\r\n" + getForecast(weather, isFahrenheit, i + 1);
- }
- } else {
- str += "\r\n" + getForecast(weather, isFahrenheit);
- }
-
- if(isShowLivingIndex) {
- str += "\r\n" + getTips(weather);
- }
-
- WScript.Echo(str);
复制代码
使用示例批处理文件:weather.bat- color 17
- REM 查询本地天气
- wscript.exe weather.js
- REM 指定一个标准三级行政区划
- cscript.exe //nologo weather.js 四川 乐山 沐川 /t
- REM 查询呼和浩特天气未来一周天气
- cscript.exe //nologo weather.js huhhot /s /a
- pause
复制代码
作者: 920168 时间: 2011-10-18 11:28
本帖最后由 920168 于 2011-10-18 11:35 编辑
谢谢奉献,能否改进通过IP自行判断位置!
作者: wc726842270 时间: 2011-10-18 11:36
学习了,看了这么长时间终于有人用了“OHTTP.SEND(NULL)",
我还以为看错了呢!呵呵
作者: Spring 时间: 2011-10-18 11:58
回复 2# 920168
直接双击这个脚本,不带参数运行,就是根据IP判断位置。 出来的地名不对?
作者: powerbat 时间: 2011-10-18 14:23
回复 3# wc726842270
这种写法是多此一举,与不加参数效果一样。
比如fso的OpenTextFile(filename[, iomode[, create[, format]]])方法,如果只是为了读文本内容,只需要第一个参数即可,如果你愿意的话,后面的3个也可以补上(但你能保证每个参数都写对吗?要浪费时间去查手册吧)
作者: powerbat 时间: 2011-10-18 15:06
var sb = "http://toy.weather.com.cn/SearchBox/searchBox?language=zh&callback=gs&_=@&keyword=*";
这怎么研究出来的?牛人!
作者: Spring 时间: 2011-11-22 09:56
回复 6# powerbat
这个也不太好说,通过探测请求地址,可以发现返回值和参数的关系,多试试就知道了。
作者: powerbat 时间: 2011-11-24 20:48
是我孤陋寡闻了,使用callback回调函数是网页设计中一种很常用的方法。
作者: todayambition 时间: 2011-12-6 14:47
Ajax 这真是个好例子
作者: goofy123 时间: 2012-3-17 22:07
学习了,谢谢分享。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |