[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[原创代码] JScript版天气预报

数据来自 http://www.weather.com.cn
JScript脚本文件:weather.js
  1. /*--------------------*
  2.   *  Global Variables  *
  3.   *--------------------*/
  4. var req, isGoodLuck;
  5. var lii  = "http://61.4.185.48:81/g/";
  6. var pcc  = "http://www.weather.com.cn/data/list3/city*.xml";
  7. var data = "http://m.weather.com.cn/data/*.html";
  8. var sb   = "http://toy.weather.com.cn/SearchBox/searchBox?language=zh&callback=gs&_=@&keyword=*";
  9. /*-------------*
  10.   *  Functions  *
  11.   *-------------*/
  12. function showUsage() {
  13.     var s =  "中國天氣\r\n\r\n";
  14.         s += "指定一个三级行政区地名。\r\n"
  15.         s += "weather.js [province [city [county]]] [/F] [/A] [/T]\r\n";
  16.         s += "  province    省、自治区、(直辖)市、特别行政区\r\n";
  17.         s += "  city        地区、盟、自治州、(地级)市\r\n";
  18.         s += "  county      县、自治县、旗、自治旗、(县级)市、(市辖)区、林区、特区\r\n";
  19.         s += "  /F          使用华氏温度\r\n";
  20.         s += "  /A          未来一周天气预报\r\n";
  21.         s += "  /T          显示明日生活指数\r\n\r\n";
  22.         s += "根据查询关键字搜索城市天气预报。\r\n";
  23.         s += "weather.js [keyword] [/F] [/A] [/T] [/S]\r\n";
  24.         s += "  keyword     关键字。如市名、全拼、简拼、电话区号、邮编等。\r\n";
  25.         s += "  /S          手气不错\r\n\r\n";
  26.         s += "地名中不要包含省、市、州、县、区等行政区划名称。";
  27.         s += "如果指定的地名不足三级,则默认识别为其中心城市。";
  28.         s += "如果没有指定地名或者关键字,则默认显示本地天气。";
  29.     WScript.Echo(s);
  30.     WScript.Quit();
  31. }
  32. function getRequestText(url) {
  33.     req = req || new ActiveXObject("Msxml2.XMLHTTP");
  34.     req.open("GET", url, false);
  35.     req.send(null);
  36.     return req.responseText;
  37. }
  38. function getCityArray(cid) {
  39.     cid = cid || "";
  40.     var reqText = getRequestText(pcc.replace(/\*/, cid));
  41.     var jsArray = reqText.replace(/\,/g, "'],['");
  42.         jsArray = jsArray.replace(/\|/g, "','");
  43.         jsArray = "[['" + jsArray + "']]";
  44.     return eval(jsArray);
  45. }
  46. function getCodeByName(arr, v) {
  47.     var k;
  48.     if(v == null || v == "") {
  49.         k = arr[0][0];
  50.     } else {
  51.         for(var i=0; i<arr.length; i++) {
  52.             if(arr[i][1] == v) {
  53.                 k = arr[i][0];
  54.                 break;
  55.             }
  56.         }
  57.     }
  58.     return k;
  59. }
  60. function getID(province, city, county) {
  61.     var idReturn;
  62.     if(province == null || province.replace(/\s/g, "") == "") {
  63.         eval(getRequestText(lii));
  64.         idReturn = id;
  65.     } else {
  66.         var arrProvince = getCityArray();
  67.         var provinceID  = getCodeByName(arrProvince, province);
  68.         if(!provinceID) {
  69.             var keywords = province;
  70.             idReturn = getIDBySearch(keywords);
  71.         } else {
  72.             var arrCity     = getCityArray(provinceID);
  73.             var cityID      = getCodeByName(arrCity, city);
  74.             if(cityID) {
  75.                 var arrCounty   = getCityArray(cityID);
  76.                 var countyID    = getCodeByName(arrCounty, county);
  77.                 if(countyID) {
  78.                     var idMapping   = getRequestText(pcc.replace(/\*/, countyID));
  79.                     idReturn = idMapping.replace(/.*\|(\d+)/, "$1");
  80.                 } else {
  81.                     WScript.Echo("未找到指定的三级行政区:  " + province + " - " + city + " - " + county);
  82.                     WScript.Quit();               
  83.                 }
  84.             } else {
  85.                 WScript.Echo("未找到指定的二级行政区:  " + province + " - " + city);
  86.                 WScript.Quit();
  87.             }
  88.         }
  89.     }
  90.     return idReturn;
  91. }
  92. function getIDBySearch(keywords) {
  93.     var gs = function(obj) {
  94.         var id;
  95.         if(obj.i) {
  96.             var rs = obj.i;
  97.             if(isGoodLuck == true) {
  98.                 id = rs[0].i;
  99.             } else {
  100.                 for(var i=0; i<rs.length; i++) {
  101.                     var x = rs[i];
  102.                     WScript.Echo((i + 1) + ".\t" + (x.m ? "[" + x.m + "]:  " : "") + x.n + " - " + x.d);
  103.                 }
  104.                 var n = 0;
  105.                 while(n == 0) {
  106.                     WScript.StdOut.Write("选择:");
  107.                     var s = WScript.StdIn.ReadLine();
  108.                     if(s && !isNaN(s)) n = Number(s);
  109.                 }
  110.                 id = rs[n - 1].i;
  111.             }
  112.         } else {
  113.             WScript.Echo("对不起,未找到您查询的城市天气!");
  114.             WScript.Quit();
  115.         }
  116.         return id;
  117.     }
  118.     var url = sb;
  119.         url = url.replace(/@/, (new Date()).getTime());
  120.         url = url.replace(/\*/, encodeURI(keywords));   
  121.     return eval(getRequestText(url));
  122. }
  123. function getWeather(id) {
  124.     var json = getRequestText(data.replace(/\*/, id));
  125.     eval("var info = (" + json + ").weatherinfo");
  126.     return info;
  127. }
  128. function getSimpleInfo(w) {
  129.     var s = w.city + "(" + w.city_en + ")";
  130.     return s;
  131. }
  132. function getDataInfo(w) {
  133.     var s = "气象数据发布于 " + w.week + " " + w.date_y + " " + w.fchh + ":00";
  134.     return s;
  135. }
  136. function getTips(w) {
  137.     var s =  w.index_d + "\r\n";
  138.         s += "紫外线强度:\t" + w.index_uv + "\r\n";
  139.         s += "穿衣指数:\t" + w.index + "\r\n";
  140.         s += "晨练指数:\t" + w.index_cl + "\r\n";
  141.         s += "舒适度指数:\t" + w.index_co + "\r\n";
  142.         s += "晾晒指数:\t" + w.index_ls + "\r\n";
  143.         s += "旅游指数:\t" + w.index_tr + "\r\n";
  144.         s += "洗车指数:\t" + w.index_xc;
  145.     return s;
  146. }
  147. function getForecast(w, c, n) {
  148.     var s;
  149.     if(!n || isNaN(n) || n == 0 || n > 6) {
  150.         s = w.weather1 + "\r\n" + (c ? w.tempF1 : w.temp1) + "\r\n" + w.wind1;        
  151.     } else {
  152.         s = "未来" + (n < 3 ? (n*24) + "小时" : "第" + n + "天") + ":\t";
  153.         s += eval("w.weather" + n) + "  ";
  154.         s += eval((c ? "w.tempF" : "w.temp") + n) + "  ";
  155.         s += eval("w.wind" + n);
  156.     }
  157.     return s;
  158. }
  159. //==============================================================================
  160. var t = WScript.Arguments.Named;
  161. var p = WScript.Arguments.Unnamed;
  162. if(t.Exists("?")) showUsage();
  163. if(t.Exists("S")) isGoodLuck = true;   
  164. var province = p.Count > 0 ? p(0) : "";
  165. var city     = p.Count > 1 ? p(1) : "";
  166. var county   = p.Count > 2 ? p(2) : "";
  167. var is6DaysForcast    = t.Exists("A") ? true : false;
  168. var isShowLivingIndex = t.Exists("T") ? true : false;
  169. var isFahrenheit      = t.Exists("F") ? true : false;
  170. var id = getID(province, city, county);
  171. var weather = getWeather(id);
  172. var str =  getSimpleInfo(weather);
  173. if(is6DaysForcast) {
  174.     str += "\r\n" + getDataInfo(weather);
  175.     for(var i=0; i<6; i++) {
  176.         str += "\r\n" + getForecast(weather, isFahrenheit, i + 1);
  177.     }
  178. } else {
  179.     str += "\r\n" + getForecast(weather, isFahrenheit);
  180. }
  181. if(isShowLivingIndex) {
  182.     str += "\r\n" + getTips(weather);
  183. }
  184. WScript.Echo(str);
复制代码
使用示例批处理文件:weather.bat
  1. color 17
  2. REM 查询本地天气
  3. wscript.exe weather.js
  4. REM 指定一个标准三级行政区划
  5. cscript.exe //nologo weather.js 四川 乐山 沐川 /t
  6. REM 查询呼和浩特天气未来一周天气
  7. cscript.exe //nologo weather.js huhhot /s /a
  8. pause
复制代码
4

评分人数

学习了,谢谢分享。

TOP

Ajax 这真是个好例子
@echo off
set /p=>hlw1.txt<nul

TOP

是我孤陋寡闻了,使用callback回调函数是网页设计中一种很常用的方法。

TOP

回复 6# powerbat


    这个也不太好说,通过探测请求地址,可以发现返回值和参数的关系,多试试就知道了。

TOP

var sb   = "http://toy.weather.com.cn/SearchBox/searchBox?language=zh&callback=gs&_=@&keyword=*";


这怎么研究出来的?牛人!

TOP

回复 3# wc726842270

这种写法是多此一举,与不加参数效果一样。

比如fso的OpenTextFile(filename[, iomode[, create[, format]]])方法,如果只是为了读文本内容,只需要第一个参数即可,如果你愿意的话,后面的3个也可以补上(但你能保证每个参数都写对吗?要浪费时间去查手册吧)

TOP

回复 2# 920168


    直接双击这个脚本,不带参数运行,就是根据IP判断位置。 出来的地名不对?

TOP

学习了,看了这么长时间终于有人用了“OHTTP.SEND(NULL)",
我还以为看错了呢!呵呵
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

本帖最后由 920168 于 2011-10-18 11:35 编辑

谢谢奉献,能否改进通过IP自行判断位置!
http://www.diecasting86.com

TOP

返回列表