├── .gitignore ├── AUTHORS.rst ├── HISTORY.rst ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── iquery ├── __init__.py ├── core.py ├── datas │ ├── cities.dat │ └── stations.dat ├── hospitals.py ├── lottery.py ├── lyrics.py ├── movies.py ├── showes.py ├── trains.py └── utils.py ├── run.py ├── screenshot └── iquery.gif ├── setup.py └── test_iquery.py /.gitignore: -------------------------------------------------------------------------------- 1 | venv/ 2 | *.pyc 3 | build/ 4 | dist/ 5 | *.egg-info/ 6 | build/ 7 | -------------------------------------------------------------------------------- /AUTHORS.rst: -------------------------------------------------------------------------------- 1 | Module Contributors 2 | ------------------ 3 | 4 | - `protream `_ : train/show/movie/hospital 5 | - `bonfy `_: lottery 6 | -------------------------------------------------------------------------------- /HISTORY.rst: -------------------------------------------------------------------------------- 1 | 0.5.0 2 | ----- 3 | 4 | - 新增彩票信息查询功能, 感谢bonfy的贡献 5 | - 修复bug 6 | 7 | 0.4.2 8 | ----- 9 | - 新功能, 查询歌词 10 | - 优化性能, 缓存火车站表 11 | 12 | 0.4.1 13 | ----- 14 | - not import requests err fix 15 | 16 | 0.4.0 17 | ----- 18 | - 项目更名: tikcets -> iquery 19 | - 新功能:查询莆田系医院 20 | - 统一了每个服务的接口 21 | 22 | 0.3.0 23 | ------ 24 | - 新功能,查询热映电影信息及电影简介 25 | - 优化火车查询日期处理,本年内不需要输入年 26 | - 小bug修复 27 | 28 | 0.2.4 29 | ------ 30 | - 修正Windows下面的编码问题 31 | - 修正查询show时不支持城市报错问题 32 | 33 | 0.2.3 34 | ------ 35 | - 不再使用colorama 36 | - 改变显示演出的方式 37 | 38 | 0.2.2 39 | ------ 40 | - 小bug修复 41 | 42 | 0.2.1 43 | ------ 44 | - setup缺失colorama修复 45 | 46 | 0.2.0 47 | ------ 48 | - 不再支持Python2 49 | - 重构了代码 50 | - 增加的查询演出门票的功能 51 | 52 | 0.1.1 53 | ------ 54 | 55 | - use unicode global 56 | - add a logo 57 | 58 | 0.1.0 59 | ------ 60 | 61 | - Make it live! 62 | - Added to PyPI 63 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2016 protream 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the "Software"), 7 | to deal in the Software without restriction, including without limitation 8 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 | and/or sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included 13 | in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 19 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 21 | OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.rst 3 | include HISTORY.rst 4 | include iquery/datas/* 5 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: clean register publish 2 | 3 | clean: 4 | @find . -name '*.pyc' -exec rm -f {} + 5 | @find . -name '__pycache__' -exec rm -rf {} + 6 | 7 | register: 8 | python3 setup.py register 9 | 10 | publish: 11 | python3 setup.py sdist upload 12 | python3 setup.py bdist_wheel upload 13 | rm -fr build dist .egg iquery.egg-info 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | iquery 2 | =========================================================== 3 | 4 | TODOs 5 | ------- 6 | 这个项目有段时间没有更新了,现在有一些新的想法,记录在这,也欢迎大家贡献代码: 7 | 8 | - [ ] 为了可拓展性,改用子命令的形式,比如查火车票,iquery train-tickets ..., iquery t/tr/tt ... 应该也可以查, 取决于有没有其它 t 开头的子命令,使用模糊匹配技术 9 | - [ ] 部分功能已经失效,需要检查更新代码 10 | - [ ] 天气查询,集成 https://github.com/chubin/wttr.in 11 | - [ ] Github 热门项目查询,github trends 12 | - [ ] 测试用例, CI 13 | - [ ] 提交到 Homebrew 14 | - [ ] Windows 兼容性 15 | - [ ] Alfred 插件 16 | 17 | 18 | 19 | iquery提供基于命令行各种信息查询. 20 | 21 | ![](https://raw.githubusercontent.com/protream/iquery/master/screenshot/iquery.gif) 22 | 23 | 24 | Usage 25 | ----- 26 | 27 | ## 火车余票查询 28 | 29 | ``` 30 | $ iquery 南京 上海 910 31 | $ iquery -d 上海 北京 20160617 32 | ``` 33 | 34 | 第二种方式中指定了动车类型, 并输入完整的日期, 也是可以的. 35 | 36 | ## 近期演出查询 37 | 38 | ``` 39 | $ iquery 南京 演唱会 40 | $ iquery 上海 音乐会 30 41 | ``` 42 | 43 | 默认查询15天内的演出, 你可以向第二种方式一样指定多少天. 44 | 45 | ## 热映电影查询 46 | 47 | ``` 48 | $ iquery -m 49 | ``` 50 | 51 | 你将获得当前热映的电影信息, 输出电影信息后,你可以输入你感兴趣的电影编号查看电影简介, 输入q或quit退出. 52 | 53 | 54 | ## 莆田系医院查询 55 | 56 | ``` 57 | $ iquery -p 北京 58 | $ iquery -p 上海 长江 59 | ``` 60 | 61 | 第一种方式查询一个城市内的所有莆田系医院, 第二种可以指定医院名称, 返回``True``表示该医院是莆田系. 62 | 63 | 数据来源: https://github.com/open-power-workgroup/Hospital 64 | 65 | ## 歌词查询 66 | 67 | ``` 68 | $ iquery -l 演员 69 | $ iquery -l 演员 薛之谦 70 | ``` 71 | 72 | 第二种针对歌名重复的情况, 你可以在后面追加歌手姓名. 73 | 74 | ## 彩票信息查询 75 | 76 | ``` 77 | $ iquery -c 78 | ``` 79 | 80 | Install 81 | ------- 82 | 83 | iquery使用Python3编写,请使用pip3安装: 84 | 85 | ``` 86 | $ pip3 install iquery 87 | ``` 88 | 89 | 或者下载源码安装: 90 | 91 | ``` 92 | $ git clone https://github.com/protream/iquery 93 | ``` 94 | 95 | 然后到下载目录: 96 | 97 | ``` 98 | $ ./setup.py install 99 | ``` 100 | 101 | Help 102 | ---- 103 | 104 | ``` 105 | Usage: 106 | iquery (-c|彩票) 107 | iquery (-m|电影) 108 | iquery -p 109 | iquery -l song [singer] 110 | iquery -p 111 | iquery [days] 112 | iquery [-dgktz] 113 | 114 | Arguments: 115 | from 出发站 116 | to 到达站 117 | date 查询日期 118 | 119 | song 歌曲名称 120 | singer 歌手, 可选项 121 | 122 | city 查询城市 123 | show 演出的类型 124 | days 查询近(几)天内的演出, 若省略, 默认15 125 | 126 | city 城市名,加在-p后查询该城市所有莆田医院 127 | hospital 医院名,加在city后检查该医院是否是莆田系 128 | 129 | 130 | Options: 131 | -h, --help 显示该帮助菜单. 132 | -dgktz 动车,高铁,快速,特快,直达 133 | -m 热映电影查询 134 | -p 莆田系医院查询 135 | -l 歌词查询 136 | -c 彩票查询 137 | 138 | Show: 139 | 演唱会 音乐会 音乐剧 歌舞剧 儿童剧 话剧 140 | 歌剧 比赛 舞蹈 戏曲 相声 杂技 马戏 魔术 141 | 142 | 143 | Go to https://github.com/protream/iquery for usage examples. 144 | ``` 145 | 146 | Notes 147 | ----- 148 | 149 | - 火车票查询最多查询未来50天内. 150 | 151 | - 确保你的查询日期不要有歧义, 比如111可以是1.11也可以是11.1, 默认解析为11.1 152 | -------------------------------------------------------------------------------- /iquery/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | __version__ = '0.5.0' 4 | -------------------------------------------------------------------------------- /iquery/core.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.core 5 | ~~~~~~~~~~~~ 6 | 7 | The program entrance. 8 | """ 9 | 10 | import requests 11 | from .utils import args, exit_after_echo 12 | 13 | 14 | try: 15 | from requests.packages.urllib3.exceptions import ( 16 | SNIMissingWarning, 17 | InsecureRequestWarning, 18 | InsecurePlatformWarning 19 | ) 20 | 21 | # Not show warings 22 | requests.packages.urllib3.disable_warnings(SNIMissingWarning) 23 | requests.packages.urllib3.disable_warnings(InsecureRequestWarning) 24 | requests.packages.urllib3.disable_warnings(InsecurePlatformWarning) 25 | except ImportError: 26 | pass 27 | 28 | 29 | def show_usage(): 30 | """Usage: 31 | iquery (-m|电影) 32 | iquery (-c|彩票) 33 | iquery -l song [singer] 34 | iquery -p 35 | iquery -p 36 | iquery [days] 37 | iquery [-dgktz] 38 | 39 | Go to `tickets -h` for more details. 40 | """ 41 | pass 42 | 43 | 44 | def cli(): 45 | """Various information query via command line. 46 | 47 | Usage: 48 | iquery -l [singer] 49 | iquery (-m|电影) 50 | iquery (-c|彩票) 51 | iquery -p 52 | iquery -p 53 | iquery [days] 54 | iquery [-dgktz] 55 | 56 | Arguments: 57 | from 出发站 58 | to 到达站 59 | date 查询日期 60 | 61 | song 歌曲名称 62 | singer 歌手, 可选项 63 | 64 | city 查询城市 65 | show 演出的类型 66 | days 查询近(几)天内的演出, 若省略, 默认15 67 | 68 | city 城市名,加在-p后查询该城市所有莆田医院 69 | hospital 医院名,加在city后检查该医院是否是莆田系 70 | 71 | 72 | Options: 73 | -h, --help 显示该帮助菜单. 74 | -dgktz 动车,高铁,快速,特快,直达 75 | -m 热映电影查询 76 | -p 莆田系医院查询 77 | -l 歌词查询 78 | 79 | Show: 80 | 演唱会 音乐会 音乐剧 歌舞剧 儿童剧 话剧 81 | 歌剧 比赛 舞蹈 戏曲 相声 杂技 马戏 魔术 82 | 83 | 84 | Go to https://github.com/protream/tickets for usage examples. 85 | """ 86 | 87 | if args.is_asking_for_help: 88 | exit_after_echo(cli.__doc__, color=None) 89 | 90 | elif args.is_querying_lottery: 91 | from .lottery import query 92 | result = query() 93 | 94 | elif args.is_querying_movie: 95 | from .movies import query 96 | result = query() 97 | 98 | elif args.is_querying_lyric: 99 | from .lyrics import query 100 | result = query(args.as_lyric_query_params) 101 | 102 | elif args.is_querying_show: 103 | from .showes import query 104 | result = query(args.as_show_query_params) 105 | 106 | elif args.is_querying_putian_hospital: 107 | from .hospitals import query 108 | result = query(args.as_hospital_query_params) 109 | 110 | elif args.is_querying_train: 111 | from .trains import query 112 | result = query(args.as_train_query_params) 113 | 114 | else: 115 | exit_after_echo(show_usage.__doc__, color=None) 116 | 117 | result.pretty_print() 118 | -------------------------------------------------------------------------------- /iquery/datas/cities.dat: -------------------------------------------------------------------------------- 1 | 北京 852 2 | 上海 872 3 | 广州 893 4 | 深圳 906 5 | 武汉 586 6 | 苏州 1087 7 | 成都 1377 8 | 重庆 200 9 | 长沙 702 10 | 南京 1038 11 | 杭州 1580 12 | 沈阳 1703 13 | 无锡 1052 14 | 宁波 1597 15 | 郑州 2148 16 | 天津 1209 17 | 大连 1725 18 | 南昌 465 19 | 西安 3250 20 | 常州 1077 21 | 昆明 1229 22 | 桂林 2103 23 | 厦门 372 24 | 太原 2984 25 | 福州 356 26 | 温州 1612 27 | 合肥 2520 28 | 珠海 913 29 | 中山 947 30 | 石家庄 2495 31 | 佛山 923 32 | 南宁 2024 33 | 长春 2812 34 | 哈尔滨 2648 35 | 香港 848 36 | 青岛 1847 37 | 澳门 850 38 | 贵阳 242 39 | 济南 1835 40 | 东莞 917 41 | 呼和浩特 3167 42 | 银川 54 43 | 海外 76 44 | 柳州 2037 45 | 徐州 2024 46 | 绍兴 1643 47 | -------------------------------------------------------------------------------- /iquery/datas/stations.dat: -------------------------------------------------------------------------------- 1 | 一间堡 YJT 2 | 一面坡 YPB 3 | 一面山 YST 4 | 七台河 QTB 5 | 七甸 QDM 6 | 七营 QYJ 7 | 七里河 QLD 8 | 万乐 WEB 9 | 万发屯 WFB 10 | 万宁 WNQ 11 | 万州 WYW 12 | 万年 WWG 13 | 万源 WYY 14 | 三义井 OYD 15 | 三井子 OJT 16 | 三亚 SEQ 17 | 三关口 OKJ 18 | 三十家 SRD 19 | 三十里堡 SST 20 | 三原 SAY 21 | 三合庄 SVP 22 | 三堂集 SDH 23 | 三家寨 SMM 24 | 三家店 ODP 25 | 三明 SMS 26 | 三明北 SHS 27 | 三水 SJQ 28 | 三水北 ARQ 29 | 三水南 RNQ 30 | 三汇镇 OZW 31 | 三江南 SWZ 32 | 三江县 SOZ 33 | 三江口 SKD 34 | 三河县 OXP 35 | 三源浦 SYL 36 | 三穗 QHW 37 | 三营 OEJ 38 | 三道湖 SDL 39 | 三都县 KKW 40 | 三门县 OQH 41 | 三门峡 SMF 42 | 三门峡南 SCF 43 | 三门峡西 SXF 44 | 三间房 SFX 45 | 三阳川 SYJ 46 | 上万 SWP 47 | 上园 SUD 48 | 上杭 JBS 49 | 上板城 SBP 50 | 上板城南 OBP 51 | 上海 SHH 52 | 上海南 SNH 53 | 上海虹桥 AOH 54 | 上海西 SXH 55 | 上腰墩 SPJ 56 | 上虞 BDH 57 | 上虞北 SSH 58 | 上西铺 SXM 59 | 上饶 SRG 60 | 上高镇 SVK 61 | 下台子 EIP 62 | 下城子 XCB 63 | 下板城 EBP 64 | 下社 XSV 65 | 下花园 XYP 66 | 下马塘 XAT 67 | 世博园 ZWT 68 | 东丰 DIL 69 | 东乡 DXG 70 | 东二道河 DRB 71 | 东京城 DJB 72 | 东光 DGP 73 | 东升 DRQ 74 | 东台 DBH 75 | 东安东 DCZ 76 | 东庄 DZV 77 | 东戌 RXP 78 | 东戴河 RDD 79 | 东方 UFQ 80 | 东方红 DFB 81 | 东明县 DNF 82 | 东明村 DMD 83 | 东来 RVD 84 | 东津 DKB 85 | 东海 DHB 86 | 东海县 DQH 87 | 东淤地 DBV 88 | 东港北 RGT 89 | 东湾 DRJ 90 | 东胜 DOC 91 | 东胜西 DYC 92 | 东至 DCH 93 | 东莞 RTQ 94 | 东莞东 DMQ 95 | 东营 DPK 96 | 东营南 DOK 97 | 东辛庄 DXD 98 | 东边井 DBB 99 | 东通化 DTL 100 | 东镇 DNV 101 | 两家 UJT 102 | 两当 LDY 103 | 中华门 VNH 104 | 中卫 ZWJ 105 | 中和 ZHX 106 | 中宁 VNJ 107 | 中宁东 ZDJ 108 | 中宁南 ZNJ 109 | 中寨 ZZM 110 | 中山 ZSQ 111 | 中山北 ZGQ 112 | 中川机场 ZJJ 113 | 中牟 ZGF 114 | 丰乐镇 FZB 115 | 丰城 FCG 116 | 丰城南 FNG 117 | 丰水村 FSJ 118 | 丰都 FUW 119 | 丰镇 FZC 120 | 丰顺 FUQ 121 | 临川 LCG 122 | 临江 LQL 123 | 临汾 LFV 124 | 临汾西 LXV 125 | 临沂 LVK 126 | 临沂北 UYK 127 | 临河 LHC 128 | 临泽 LEJ 129 | 临泽南 LDJ 130 | 临海 UFH 131 | 临清 UQK 132 | 临湘 LXQ 133 | 临澧 LWQ 134 | 临西 UEP 135 | 临邑 LUK 136 | 临颍 LNF 137 | 临高南 KGQ 138 | 丹东 DUT 139 | 丹东西 RWT 140 | 丹凤 DGY 141 | 丹徒 RUH 142 | 丹阳 DYH 143 | 丹阳北 EXH 144 | 丹霞山 IRQ 145 | 丽水 USH 146 | 丽江 LHM 147 | 乃林 NLD 148 | 义乌 YWH 149 | 义县 YXD 150 | 义马 YMF 151 | 乌伊岭 WPB 152 | 乌兰哈达 WLC 153 | 乌兰浩特 WWT 154 | 乌奴耳 WRX 155 | 乌尔旗汗 WHX 156 | 乌拉山 WSC 157 | 乌拉特前旗 WQC 158 | 乌海 WVC 159 | 乌海西 WXC 160 | 乌西 WXR 161 | 乌鲁木齐南 WMR 162 | 乌龙泉南 WFN 163 | 乐东 UQQ 164 | 乐善村 LUM 165 | 乐山 IVW 166 | 乐山北 UTW 167 | 乐平市 LPG 168 | 乐昌 LCQ 169 | 乐清 UPH 170 | 乐都 LDO 171 | 乐都南 LVO 172 | 九三 SSX 173 | 九台 JTL 174 | 九台南 JNL 175 | 九江 JJG 176 | 乳山 ROK 177 | 乾县 QBY 178 | 乾安 QOT 179 | 二密河 RML 180 | 二营 RYJ 181 | 二连 RLC 182 | 二道沟门 RDP 183 | 二道湾 RDX 184 | 二龙 RLD 185 | 二龙山屯 ELA 186 | 于家堡 YKP 187 | 于都 YDG 188 | 云东海 NAQ 189 | 云居寺 AFP 190 | 云山 KZQ 191 | 云彩岭 ACP 192 | 云梦 YMN 193 | 云浮东 IXQ 194 | 云霄 YBS 195 | 五五 WVR 196 | 五原 WYC 197 | 五叉沟 WCT 198 | 五台山 WSV 199 | 五大连池 WRB 200 | 五女山 WET 201 | 五家 WUB 202 | 五寨 WZV 203 | 五常 WCB 204 | 五府山 WFG 205 | 五棵树 WKT 206 | 五莲 WLK 207 | 五营 WWB 208 | 五道沟 WDL 209 | 五道河 WHP 210 | 五龙背 WBT 211 | 五龙背东 WMT 212 | 井冈山 JGG 213 | 井南 JNP 214 | 井店 JFP 215 | 井陉 JJP 216 | 亚 JUQ 217 | 亚布力 YBB 218 | 亚布力南 YWB 219 | 亚龙湾 TWQ 220 | 交城 JNV 221 | 京山 JCN 222 | 亭亮 TIZ 223 | 亮甲店 LRT 224 | 亳州 BZH 225 | 什里店 OMP 226 | 仁布 RUO 227 | 介休 JXV 228 | 介休东 JDV 229 | 从江 KNW 230 | 仙人桥 XRL 231 | 仙林 XPH 232 | 仙桃西 XAN 233 | 仙游 XWS 234 | 代县 DKV 235 | 仪征 UZH 236 | 仲恺 KKQ 237 | 任丘 RQP 238 | 伊图里河 YEX 239 | 伊宁 YMR 240 | 伊宁东 YNR 241 | 伊尔施 YET 242 | 伊拉哈 YLX 243 | 伊春 YCB 244 | 伊林 YLB 245 | 会同 VTQ 246 | 会昌北 XEG 247 | 低庄 DVQ 248 | 低窝铺 DWJ 249 | 余姚 YYH 250 | 余姚北 CTH 251 | 余杭 EVH 252 | 余江 YHG 253 | 余粮堡 YLD 254 | 佛山 FSQ 255 | 佳木斯 JMB 256 | 依安 YAX 257 | 侯马 HMV 258 | 侯马西 HPV 259 | 保定 BDP 260 | 保定东 BMP 261 | 保康 BKD 262 | 信丰 EFG 263 | 信宜 EEQ 264 | 信阳 XUN 265 | 信阳东 OYN 266 | 修武 XWF 267 | 修武西 EXF 268 | 倭肯 WQB 269 | 偃师 YSF 270 | 偏岭 PNT 271 | 偏店 PRP 272 | 元宝山 YUD 273 | 元氏 YSP 274 | 元谋 YMM 275 | 光山 GUN 276 | 光明城 IMQ 277 | 光泽 GZS 278 | 克一河 KHX 279 | 克东 KOB 280 | 克山 KSB 281 | 克拉玛依 KHR 282 | 免渡河 MDX 283 | 兑镇 DWV 284 | 兖州 YZK 285 | 全州南 QNZ 286 | 全椒 INH 287 | 八仙筒 VXD 288 | 八角台 BTD 289 | 八达岭 ILP 290 | 八面城 BMD 291 | 八面通 BMB 292 | 公主岭 GLT 293 | 公主岭南 GBT 294 | 公庙子 GMC 295 | 公营子 GYD 296 | 六合 KLH 297 | 六合镇 LEX 298 | 六安 UAH 299 | 六枝 LIW 300 | 六盘山 UPJ 301 | 六盘水 UMW 302 | 六道河子 LVP 303 | 兰岗 LNB 304 | 兰州 LZJ 305 | 兰州东 LVJ 306 | 兰州新区 LQJ 307 | 兰州西 LAJ 308 | 兰棱 LLB 309 | 兰溪 LWH 310 | 兰考 LKF 311 | 兰陵北 COK 312 | 共青城 GAG 313 | 关林 GLF 314 | 兴业 SNZ 315 | 兴义 XRZ 316 | 兴凯 EKB 317 | 兴和西 XEC 318 | 兴国 EUG 319 | 兴城 XCD 320 | 兴宁 ENQ 321 | 兴安 XAZ 322 | 兴安北 XDZ 323 | 兴平 XPY 324 | 兴泉堡 XQJ 325 | 兴隆县 EXP 326 | 兴隆店 XDD 327 | 兴隆镇 XZB 328 | 内乡 NXF 329 | 内江 NJW 330 | 内江北 NKW 331 | 册亨 CHZ 332 | 冕宁 UGW 333 | 军粮城北 JMP 334 | 农安 NAT 335 | 冠豸山 GSS 336 | 冯屯 FTX 337 | 冷水江东 UDQ 338 | 凌海 JID 339 | 凌源 LYD 340 | 凌源东 LDD 341 | 凤凰城 FHT 342 | 凤凰机场 FJQ 343 | 凤县 FXY 344 | 凤城东 FDT 345 | 凤州 FZY 346 | 凤阳 FUH 347 | 凭祥 PXZ 348 | 凯里 KLW 349 | 凯里南 QKW 350 | 刀尔登 DRD 351 | 分宜 FYG 352 | 刘家店 UDT 353 | 刘家河 LVT 354 | 创业村 CEX 355 | 利川 LCN 356 | 利津南 LNK 357 | 到保 RBT 358 | 前卫 QWD 359 | 前山 QXQ 360 | 前磨头 QMP 361 | 前苇塘 QWP 362 | 前进镇 QEB 363 | 前锋 QFB 364 | 加格达奇 JGX 365 | 勃利 BLB 366 | 勉县 MVY 367 | 包头 BTC 368 | 包头东 BDC 369 | 化州 HZZ 370 | 化德 HGC 371 | 北井子 BRT 372 | 北京 BJP 373 | 北京东 BOP 374 | 北京北 VAP 375 | 北京南 VNP 376 | 北京西 BXP 377 | 北台 BTT 378 | 北宅 BVP 379 | 北安 BAB 380 | 北屯 BYP 381 | 北屯市 BXR 382 | 北戴河 BEP 383 | 北流 BOZ 384 | 北海 BHZ 385 | 北滘 IBQ 386 | 北碚 BPW 387 | 北票南 RPD 388 | 北营 BIV 389 | 北马圈子 BRP 390 | 十堰 SNN 391 | 十家子 SJD 392 | 十渡 SEP 393 | 千河 QUY 394 | 千阳 QOY 395 | 午汲 WJP 396 | 华城 VCQ 397 | 华家 HJT 398 | 华容 HRN 399 | 华容东 HPN 400 | 华容南 KRN 401 | 华山 HSY 402 | 华山北 HDY 403 | 华蓥 HUW 404 | 卓资东 ZDC 405 | 卓资山 ZZC 406 | 南丰 NFG 407 | 南丹 NDZ 408 | 南京 NJH 409 | 南京南 NKH 410 | 南仇 NCK 411 | 南充 NCW 412 | 南充北 NCE 413 | 南关岭 NLT 414 | 南华 NHS 415 | 南博山 NBK 416 | 南口 NKP 417 | 南口前 NKT 418 | 南召 NAF 419 | 南台 NTT 420 | 南城 NDG 421 | 南城司 NSP 422 | 南大庙 NMP 423 | 南头 NOQ 424 | 南宁 NNZ 425 | 南宁东 NFZ 426 | 南宁西 NXZ 427 | 南宫东 NFP 428 | 南岔 NCB 429 | 南峪 NUP 430 | 南平 NPS 431 | 南平北 NBS 432 | 南平南 NNS 433 | 南昌 NCG 434 | 南昌西 NXG 435 | 南曹 NEF 436 | 南朗 NNQ 437 | 南木 NMX 438 | 南杂木 NZT 439 | 南桥 NQD 440 | 南江 FIW 441 | 南江口 NDQ 442 | 南河川 NHJ 443 | 南湖东 NDN 444 | 南湾子 NWP 445 | 南翔北 NEH 446 | 南芬 NFT 447 | 南芬北 NUT 448 | 南观村 NGP 449 | 南通 NUH 450 | 南部 NBE 451 | 南阳 NFF 452 | 南阳寨 NYF 453 | 南陵 LLH 454 | 南雄 NCQ 455 | 南靖 NJS 456 | 博乐 BOR 457 | 博克图 BKX 458 | 博兴 BXK 459 | 博白 BBZ 460 | 博鳌 BWQ 461 | 卢龙 UAP 462 | 卧里屯 WLX 463 | 卫东 WVT 464 | 卫星 WVB 465 | 卫辉 WHF 466 | 即墨北 JVK 467 | 原平 YPV 468 | 厦门 XMS 469 | 厦门北 XKS 470 | 厦门高崎 XBS 471 | 友好 YOB 472 | 双丰 OFB 473 | 双城北 SBB 474 | 双城堡 SCB 475 | 双峰北 NFQ 476 | 双河镇 SEL 477 | 双流机场 IPW 478 | 双流西 IQW 479 | 双牌 SBZ 480 | 双辽 ZJD 481 | 双鸭山 SSB 482 | 发耳 FEM 483 | 口东 KEQ 484 | 口前 KQL 485 | 古东 GDV 486 | 古交 GJV 487 | 古城镇 GZB 488 | 古浪 GLJ 489 | 古田 GTS 490 | 古田会址 STS 491 | 古田北 GBS 492 | 古莲 GRX 493 | 古镇 GNQ 494 | 句容西 JWH 495 | 台前 TTK 496 | 台安 TID 497 | 台州 TZH 498 | 叶城 YER 499 | 叶柏寿 YBD 500 | 司家岭 OLK 501 | 合川 WKW 502 | 合浦 HVZ 503 | 合肥 HFH 504 | 合肥北城 COH 505 | 合肥南 ENH 506 | 合肥西 HTH 507 | 合阳 HAY 508 | 合阳北 HTY 509 | 吉安 VAG 510 | 吉文 JWX 511 | 吉林 JLL 512 | 吉舒 JSL 513 | 吉首 JIQ 514 | 同心 TXJ 515 | 吐列毛杜 TMD 516 | 吐哈 THR 517 | 吐鲁番 TFR 518 | 吐鲁番北 TAR 519 | 向塘 XTG 520 | 向阳 XDB 521 | 吕梁 LHV 522 | 吴圩 WYZ 523 | 吴堡 WUY 524 | 吴官田 WGM 525 | 吴家屯 WJT 526 | 吴家川 WCJ 527 | 吴桥 WUP 528 | 周口 ZKN 529 | 周家 ZOB 530 | 周家屯 ZOD 531 | 周水子 ZIT 532 | 呼兰 HUB 533 | 呼和浩特 HHC 534 | 呼和浩特东 NDC 535 | 呼鲁斯太 VTJ 536 | 咋子 ZAL 537 | 和什托洛盖 VSR 538 | 和平 VAQ 539 | 和田 VTR 540 | 和硕 VUR 541 | 和静 HJR 542 | 和龙 HLL 543 | 咸宁 XNN 544 | 咸宁东 XKN 545 | 咸宁北 XRN 546 | 咸宁南 UNN 547 | 咸阳 XYY 548 | 咸阳秦都 XOY 549 | 哈密 HMR 550 | 哈尔滨 HBB 551 | 哈尔滨东 VBB 552 | 哈尔滨北 HTB 553 | 哈尔滨西 VAB 554 | 哈拉海 HIT 555 | 哈拉苏 HAX 556 | 哲里木 ZLC 557 | 唐家湾 PDQ 558 | 唐山 TSP 559 | 唐山北 FUP 560 | 唐河 THF 561 | 商丘 SQF 562 | 商丘南 SPF 563 | 商南 ONY 564 | 商城 SWN 565 | 商河 SOK 566 | 商洛 OLY 567 | 商都 SXC 568 | 喀什 KSR 569 | 喀喇其 KQX 570 | 喇嘛甸 LMX 571 | 喜德 EDW 572 | 嘉兴 JXH 573 | 嘉兴南 EPH 574 | 嘉善 JSH 575 | 嘉善南 EAH 576 | 嘉峪关 JGJ 577 | 嘉峪关南 JBJ 578 | 嘉峰 JFF 579 | 嘉祥 JUK 580 | 嘎什甸子 GXD 581 | 四会 AHQ 582 | 四合永 OHD 583 | 四平 SPT 584 | 四平东 PPT 585 | 四方台 STB 586 | 四道湾 OUD 587 | 团结 TIX 588 | 园墩 YAJ 589 | 固原 GUJ 590 | 固始 GXN 591 | 固安 GFP 592 | 固镇 GEH 593 | 图们 TML 594 | 图们北 QSL 595 | 图强 TQX 596 | 图里河 TEX 597 | 土地堂东 TTN 598 | 土桥子 TQJ 599 | 土溪 TSW 600 | 土牧尔台 TRC 601 | 土贵乌拉 TGC 602 | 土门子 TCJ 603 | 坂田 BTQ 604 | 坡底下 PXJ 605 | 坪上 PSK 606 | 坪石 PSQ 607 | 城固 CGY 608 | 城子坦 CWT 609 | 城阳 CEK 610 | 塔哈 THX 611 | 塔尔气 TVX 612 | 塔崖驿 TYP 613 | 塔河 TXX 614 | 塔石嘴 TIM 615 | 塘沽 TGP 616 | 塘豹 TBQ 617 | 墨玉 MUR 618 | 壮志 ZUX 619 | 夏官营 XGJ 620 | 夏石 XIZ 621 | 夏邑县 EJH 622 | 大余 DYG 623 | 大元 DYZ 624 | 大关 RGW 625 | 大兴 DXX 626 | 大兴沟 DXL 627 | 大其拉哈 DQX 628 | 大冶北 DBN 629 | 大口屯 DKP 630 | 大同 DTV 631 | 大坝 DBJ 632 | 大埔 DPI 633 | 大堡 DVT 634 | 大孤山 RMT 635 | 大安 RAT 636 | 大安北 RNT 637 | 大官屯 DTT 638 | 大屯 DNT 639 | 大巴 DBD 640 | 大平房 DPD 641 | 大庆 DZX 642 | 大庆东 LFX 643 | 大庆西 RHX 644 | 大成 DCT 645 | 大战场 DTJ 646 | 大拟 DNZ 647 | 大旺 WWQ 648 | 大杖子 DAP 649 | 大杨树 DUX 650 | 大板 DBC 651 | 大林 DLD 652 | 大武口 DFJ 653 | 大涧 DFP 654 | 大湾子 DFM 655 | 大灰厂 DHP 656 | 大王滩 DZZ 657 | 大理 DKM 658 | 大田边 DBM 659 | 大盘石 RPP 660 | 大石头 DSL 661 | 大石头南 DAL 662 | 大石寨 RZT 663 | 大石桥 DQT 664 | 大磴沟 DKJ 665 | 大禾塘 SOQ 666 | 大竹园 DZY 667 | 大红旗 DQD 668 | 大英东 IAW 669 | 大苴 DIM 670 | 大荔 DNY 671 | 大营 DYV 672 | 大营子 DZD 673 | 大营镇 DJP 674 | 大虎山 DHD 675 | 大足南 FQW 676 | 大连 DLT 677 | 大连北 DFT 678 | 大通西 DTO 679 | 大陆号 DLC 680 | 大雁 DYX 681 | 大青沟 DSD 682 | 天义 TND 683 | 天岗 TGL 684 | 天柱山 QWH 685 | 天桥岭 TQL 686 | 天水 TSJ 687 | 天津 TJP 688 | 天津北 TBP 689 | 天津南 TIP 690 | 天津西 TXP 691 | 天祝 TZJ 692 | 天镇 TZV 693 | 天门 TMN 694 | 天门南 TNN 695 | 太原 TYV 696 | 太原东 TDV 697 | 太原北 TBV 698 | 太原南 TNV 699 | 太姥山 TLS 700 | 太平川 TIT 701 | 太平镇 TEB 702 | 太湖 TKH 703 | 太谷 TGV 704 | 太谷西 TIV 705 | 太阳升 TQT 706 | 太阳山 TYJ 707 | 夹心子 JXT 708 | 奇峰塔 QVP 709 | 奈曼 NMD 710 | 奉化 FHH 711 | 奎屯 KTR 712 | 奎山 KAB 713 | 如东 RIH 714 | 如皋 RBH 715 | 始兴 IPQ 716 | 姚千户屯 YQT 717 | 姚安 YAC 718 | 姚家 YAT 719 | 姜堰 UEH 720 | 姜家 JJB 721 | 威海 WKK 722 | 威海北 WHK 723 | 威箐 WAM 724 | 威舍 WSM 725 | 威虎岭北 WBL 726 | 娄底 LDQ 727 | 娄底南 UOQ 728 | 娘子关 NIP 729 | 婺源 WYG 730 | 嫩江 NGX 731 | 子洲 ZZY 732 | 子长 ZHY 733 | 孙吴 SKB 734 | 孙家 SUB 735 | 孙镇 OZY 736 | 孝南 XNV 737 | 孝感 XGN 738 | 孝感北 XJN 739 | 孝西 XOV 740 | 孟家岗 MGB 741 | 孟庄 MZF 742 | 孤家子 GKT 743 | 孤山口 GSP 744 | 宁东 NOJ 745 | 宁东南 NDJ 746 | 宁乡 NXQ 747 | 宁国 NNH 748 | 宁安 NAB 749 | 宁家 NVT 750 | 宁德 NES 751 | 宁明 NMZ 752 | 宁村 NCZ 753 | 宁武 NWV 754 | 宁波 NGH 755 | 宁波东 NVH 756 | 宁海 NHH 757 | 宁陵县 NLF 758 | 安亭北 ASH 759 | 安仁 ARG 760 | 安化 PKQ 761 | 安口窑 AYY 762 | 安图 ATL 763 | 安图西 AXL 764 | 安塘 ATV 765 | 安定 ADP 766 | 安家 AJB 767 | 安平 APT 768 | 安广 AGT 769 | 安庆 AQH 770 | 安庆西 APH 771 | 安康 AKY 772 | 安德 ARW 773 | 安溪 AXS 774 | 安达 ADX 775 | 安阳 AYF 776 | 安阳东 ADF 777 | 安陆 ALN 778 | 安顺 ASW 779 | 安龙 AUZ 780 | 宋 SOB 781 | 宋城路 SFF 782 | 宏庆 HEY 783 | 官厅 GTP 784 | 官厅西 KEP 785 | 官字井 GOT 786 | 官高 GVP 787 | 定南 DNG 788 | 定州 DXP 789 | 定州东 DOP 790 | 定襄 DXV 791 | 定西 DSJ 792 | 定边 DYJ 793 | 定远 EWH 794 | 定陶 DQK 795 | 宜兴 YUH 796 | 宜城 YIN 797 | 宜宾 YBW 798 | 宜州 YSZ 799 | 宜昌 YCN 800 | 宜昌东 HAN 801 | 宜春 YEG 802 | 宜春西 YCG 803 | 宜耐 YVM 804 | 宜良北 YSM 805 | 宝华山 BWH 806 | 宝坻 BPP 807 | 宝拉格 BQC 808 | 宝林 BNB 809 | 宝泉岭 BQB 810 | 宝清 BUB 811 | 宝鸡 BJY 812 | 宝鸡南 BBY 813 | 宝龙山 BND 814 | 宣化 XHP 815 | 宣和 XWJ 816 | 宣城 ECH 817 | 宣威 XWM 818 | 宣汉 XHY 819 | 容县 RXZ 820 | 容桂 RUQ 821 | 宽甸 KDT 822 | 宾阳 UKZ 823 | 宿州 OXH 824 | 宿州东 SRH 825 | 宿松 OAH 826 | 密云北 MUP 827 | 密山 MSB 828 | 富县 FEY 829 | 富县东 FDY 830 | 富川 FDZ 831 | 富拉尔基 FRX 832 | 富海 FHX 833 | 富源 FYM 834 | 富裕 FYX 835 | 富锦 FIB 836 | 寒岭 HAT 837 | 寒葱沟 HKB 838 | 察素齐 CSC 839 | 对青山 DQB 840 | 寿阳 SYV 841 | 将乐 JLS 842 | 小东 XOD 843 | 小哨 XAM 844 | 小寺沟 ESP 845 | 小岭 XLB 846 | 小市 XST 847 | 小得江 EJM 848 | 小扬气 XYX 849 | 小新街 XXM 850 | 小月旧 XFM 851 | 小村 XEM 852 | 小榄 EAQ 853 | 小河沿 XYD 854 | 小河镇 EKY 855 | 小董 XEZ 856 | 小西庄 XXP 857 | 小金口 NKQ 858 | 小雨谷 XHM 859 | 尖峰 PFQ 860 | 尚家 SJB 861 | 尚志 SZB 862 | 尤溪 YXS 863 | 尹地 YDM 864 | 尼勒克 NIR 865 | 尼木 NMO 866 | 屏边 PBM 867 | 山丹 SDJ 868 | 山坡东 SBN 869 | 山城镇 SCL 870 | 山市 SQB 871 | 山河屯 SHL 872 | 山海关 SHD 873 | 山阴 SNV 874 | 岐山 QAY 875 | 岑溪 CNZ 876 | 岔江 CAM 877 | 岢岚 KLV 878 | 岩会 AEP 879 | 岱岳 RYV 880 | 岳家井 YGJ 881 | 岳池 AWW 882 | 岳阳 YYQ 883 | 岳阳东 YIQ 884 | 峡江 EJG 885 | 峨眉 EMW 886 | 峨眉山 IXW 887 | 峨边 EBW 888 | 峻德 JDB 889 | 崇仁 CRG 890 | 崇左 CZZ 891 | 崔黄口 CHP 892 | 崖州 YUQ 893 | 嵯岗 CAX 894 | 巢湖 CIH 895 | 巢湖东 GUH 896 | 工农湖 GRT 897 | 左岭 ZSN 898 | 巨宝 JRT 899 | 巨野 JYK 900 | 巩义 GXF 901 | 巩义南 GYF 902 | 巴东 BNN 903 | 巴中 IEW 904 | 巴中东 BDE 905 | 巴山 BAY 906 | 巴彦高勒 BAC 907 | 巴林 BLX 908 | 巴楚 BCR 909 | 布列开 BLR 910 | 布海 BUT 911 | 师宗 SEM 912 | 师庄 SNM 913 | 带岭 DLB 914 | 常州 CZH 915 | 常州北 ESH 916 | 常平 DAQ 917 | 常平东 FQQ 918 | 常庄 CVK 919 | 常德 VGQ 920 | 帽儿山 MRB 921 | 干塘 GNJ 922 | 干沟 GGL 923 | 平关 PGM 924 | 平凉 PIJ 925 | 平凉南 POJ 926 | 平南南 PAZ 927 | 平原 PYK 928 | 平原堡 PPJ 929 | 平台 PVT 930 | 平型关 PGV 931 | 平安 PAL 932 | 平安镇 PZT 933 | 平安驿 PNO 934 | 平山 PSB 935 | 平岗 PGL 936 | 平峪 PYP 937 | 平庄 PZD 938 | 平庄南 PND 939 | 平度 PAK 940 | 平房 PFB 941 | 平旺 PWV 942 | 平昌 PCE 943 | 平果 PGZ 944 | 平河口 PHM 945 | 平泉 PQP 946 | 平洋 PYX 947 | 平田 PTM 948 | 平社 PSV 949 | 平遥 PYV 950 | 平遥古城 PDV 951 | 平邑 PIK 952 | 平顶山 PEN 953 | 平顶山西 BFF 954 | 广元 GYW 955 | 广元南 GAW 956 | 广南卫 GNM 957 | 广宁 FBQ 958 | 广宁寺 GQT 959 | 广宁寺南 GNT 960 | 广安 VJW 961 | 广安南 VUW 962 | 广州 GZQ 963 | 广州东 GGQ 964 | 广州北 GBQ 965 | 广州南 IZQ 966 | 广州西 GXQ 967 | 广德 GRH 968 | 广水 GSN 969 | 广汉 GHW 970 | 广汉北 GVW 971 | 广通北 GPM 972 | 庄桥 ZQH 973 | 庄河北 ZUT 974 | 庆丰 QFT 975 | 庆安 QAB 976 | 庆盛 QSQ 977 | 庆阳山 QSJ 978 | 庐山 LSG 979 | 庐江 UJH 980 | 库伦 KLD 981 | 库尔勒 KLR 982 | 库车 KCR 983 | 库都尔 KDX 984 | 应县 YZV 985 | 应城 YHN 986 | 庙城 MAP 987 | 庙山 MSN 988 | 庙岭 MLL 989 | 庙庄 MZJ 990 | 康城 KCP 991 | 康庄 KZP 992 | 康熙岭 KXZ 993 | 康金井 KJB 994 | 廉江 LJZ 995 | 廊坊 LJP 996 | 廊坊北 LFP 997 | 延吉 YJL 998 | 延吉西 YXL 999 | 延安 YWY 1000 | 延庆 YNP 1001 | 建三江 JIB 1002 | 建始 JRN 1003 | 建宁县北 JCS 1004 | 建昌 JFD 1005 | 建水 JSM 1006 | 建湖 AJH 1007 | 建瓯 JVS 1008 | 建瓯西 JUS 1009 | 建设 JET 1010 | 建阳 JYS 1011 | 开原 KYT 1012 | 开原西 KXT 1013 | 开安 KAT 1014 | 开封 KFF 1015 | 开江 KAW 1016 | 开通 KTT 1017 | 开阳 KVW 1018 | 开鲁 KLC 1019 | 弋江 RVH 1020 | 弋阳 YIG 1021 | 弓棚子 GPT 1022 | 张兰 ZLV 1023 | 张家口 ZKP 1024 | 张家口南 ZMP 1025 | 张家界 DIQ 1026 | 张掖 ZYJ 1027 | 张掖西 ZEJ 1028 | 张桥 ZQY 1029 | 张百湾 ZUP 1030 | 张维屯 ZWB 1031 | 张辛 ZIP 1032 | 弥渡 MDF 1033 | 归流河 GHT 1034 | 当涂东 OWH 1035 | 当阳 DYN 1036 | 彝良 ALW 1037 | 彬县 BXY 1038 | 彭山 PSW 1039 | 彭山北 PPW 1040 | 彭州 PMW 1041 | 彭水 PHW 1042 | 彭泽 PZG 1043 | 彭阳 PYJ 1044 | 彰武 ZWD 1045 | 徐家 XJB 1046 | 徐州 XCH 1047 | 徐州东 UUH 1048 | 徐水 XSP 1049 | 徐闻 XJQ 1050 | 得耳布尔 DRX 1051 | 徘徊北 PHP 1052 | 微子镇 WQP 1053 | 德令哈 DHO 1054 | 德伯斯 RDT 1055 | 德保 RBZ 1056 | 德兴 DWG 1057 | 德安 DAG 1058 | 德州 DZP 1059 | 德州东 DIP 1060 | 德惠 DHT 1061 | 德惠西 DXT 1062 | 德昌 DVW 1063 | 德清 DRH 1064 | 德清西 MOH 1065 | 德阳 DYW 1066 | 徽县 HYY 1067 | 忻州 XXV 1068 | 怀仁 HRV 1069 | 怀仁东 HFV 1070 | 怀化 HHQ 1071 | 怀化南 KAQ 1072 | 怀柔 HRP 1073 | 怀柔北 HBP 1074 | 怀集 FAQ 1075 | 恩施 ESN 1076 | 恭城 GCZ 1077 | 息县 ENN 1078 | 息烽 XFW 1079 | 悬钟 XRP 1080 | 惠东 KDQ 1081 | 惠农 HMJ 1082 | 惠安 HNS 1083 | 惠山 VCH 1084 | 惠州 HCQ 1085 | 惠州南 KNQ 1086 | 惠州西 VXQ 1087 | 惠环 KHQ 1088 | 慈利 CUQ 1089 | 成吉思汗 CJX 1090 | 成都 CDW 1091 | 成都东 ICW 1092 | 成都南 CNW 1093 | 成高子 CZB 1094 | 戚墅堰 QYH 1095 | 扎兰屯 ZTX 1096 | 扎赉诺尔西 ZXX 1097 | 扎鲁特 ZLD 1098 | 打柴沟 DGJ 1099 | 扬州 YLH 1100 | 扶余 FYT 1101 | 扶余北 FBT 1102 | 扶绥 FSZ 1103 | 承德 CDP 1104 | 承德东 CCP 1105 | 抚宁 FNP 1106 | 抚州 FZG 1107 | 抚州东 FDG 1108 | 抚州北 FBG 1109 | 抚松 FSL 1110 | 抚远 FYB 1111 | 抚顺 FST 1112 | 抚顺北 FET 1113 | 拉古 LGB 1114 | 拉哈 LHX 1115 | 拉林 LAB 1116 | 拉萨 LSO 1117 | 拉鲊 LEM 1118 | 招柏 ZBP 1119 | 换新天 VTB 1120 | 揭阳 JRQ 1121 | 攀枝花 PRW 1122 | 攸县 YOG 1123 | 攸县南 YXG 1124 | 敖力布告 ALD 1125 | 敦化 DHL 1126 | 敦煌 DHJ 1127 | 文地 WNZ 1128 | 文安 WBP 1129 | 文昌 WEQ 1130 | 文水 WEV 1131 | 文登 WBK 1132 | 文登东 WGK 1133 | 斜河涧 EEP 1134 | 新乐 ELP 1135 | 新乡 XXF 1136 | 新乡东 EGF 1137 | 新会 EFQ 1138 | 新余 XUG 1139 | 新余北 XBG 1140 | 新保安 XAP 1141 | 新兴县 XGQ 1142 | 新化 EHQ 1143 | 新化南 EJQ 1144 | 新华 XHB 1145 | 新华屯 XAX 1146 | 新县 XSN 1147 | 新友谊 EYB 1148 | 新和 XIR 1149 | 新坪田 XPM 1150 | 新城子 XCT 1151 | 新安 EAM 1152 | 新安县 XAF 1153 | 新帐房 XZX 1154 | 新干 EGG 1155 | 新晃 XLQ 1156 | 新晃西 EWQ 1157 | 新李 XLJ 1158 | 新杖子 ERP 1159 | 新松浦 XOB 1160 | 新林 XPX 1161 | 新民 XMD 1162 | 新江 XJM 1163 | 新沂 VIH 1164 | 新津 IRW 1165 | 新津南 ITW 1166 | 新窝铺 EPD 1167 | 新立屯 XLD 1168 | 新立镇 XGT 1169 | 新绛 XJV 1170 | 新绰源 XRX 1171 | 新肇 XZT 1172 | 新邱 XQD 1173 | 新郑机场 EZF 1174 | 新都东 EWW 1175 | 新阳镇 XZJ 1176 | 新青 XQB 1177 | 施家嘴 SHM 1178 | 施秉 AQW 1179 | 旅顺 LST 1180 | 旌德 NSH 1181 | 旗下营 QXC 1182 | 无为 IIH 1183 | 无锡 WXH 1184 | 无锡东 WGH 1185 | 无锡新区 IFH 1186 | 日喀则 RKO 1187 | 日照 RZK 1188 | 旧庄窝 JVP 1189 | 旬阳 XUY 1190 | 旬阳北 XBY 1191 | 旺苍 WEW 1192 | 昂昂溪 AAX 1193 | 昆山 KSH 1194 | 昆山南 KNH 1195 | 昆明 KMM 1196 | 昆明西 KXM 1197 | 昆阳 KAM 1198 | 昌乐 CLK 1199 | 昌图 CTT 1200 | 昌图西 CPT 1201 | 昌平 CPP 1202 | 昌平北 VBP 1203 | 昌黎 CLP 1204 | 明光 MGH 1205 | 明城 MCL 1206 | 明水河 MUT 1207 | 明港 MGN 1208 | 明港东 MDN 1209 | 明珠 MFQ 1210 | 春湾 CQQ 1211 | 春阳 CAL 1212 | 昭化 ZHW 1213 | 昭通 ZDW 1214 | 晋中 JZV 1215 | 晋城 JCF 1216 | 晋城北 JEF 1217 | 晋州 JXP 1218 | 晋江 JJS 1219 | 晏城 YEK 1220 | 晨明 CMB 1221 | 普兰店 PLT 1222 | 普宁 PEQ 1223 | 普安 PAN 1224 | 普定 PGW 1225 | 普湾 PWT 1226 | 普雄 POW 1227 | 景德镇 JCG 1228 | 景泰 JTJ 1229 | 暖泉 NQJ 1230 | 曲水县 QSO 1231 | 曲江 QIM 1232 | 曲阜 QFK 1233 | 曲阜东 QAK 1234 | 曲靖 QJM 1235 | 曹县 CXK 1236 | 曹子里 CFP 1237 | 曾口 ZKE 1238 | 曾家坪子 ZBW 1239 | 月亮田 YUM 1240 | 月山 YBF 1241 | 朔州 SUV 1242 | 朗乡 LXB 1243 | 望都 WDP 1244 | 朝阳 CYD 1245 | 朝阳地 CDD 1246 | 朝阳川 CYL 1247 | 朝阳镇 CZL 1248 | 木里图 MUD 1249 | 本溪 BXT 1250 | 本溪新城 BVT 1251 | 本溪湖 BHT 1252 | 朱家沟 ZUB 1253 | 朱家窑 ZUJ 1254 | 朱日和 ZRC 1255 | 朱杨溪 ZXW 1256 | 李家 LJB 1257 | 李家坪 LIJ 1258 | 李旺 VLJ 1259 | 李石寨 LET 1260 | 杏树 XSB 1261 | 杏树屯 XDT 1262 | 杜家 DJL 1263 | 来宾 UBZ 1264 | 来宾北 UCZ 1265 | 来舟 LZS 1266 | 杨岗 YRB 1267 | 杨村 YBP 1268 | 杨杖子 YZD 1269 | 杨林 YLM 1270 | 杨柳青 YQP 1271 | 杨树岭 YAD 1272 | 杨陵 YSY 1273 | 杨陵南 YEY 1274 | 杭州 HZH 1275 | 杭州东 HGH 1276 | 杭州南 XHH 1277 | 杭锦后旗 HDC 1278 | 松原 VYT 1279 | 松原北 OCT 1280 | 松树 SFT 1281 | 松树镇 SSL 1282 | 松桃 MZQ 1283 | 松江 SAH 1284 | 松江南 IMH 1285 | 松江河 SJL 1286 | 松江镇 OZL 1287 | 松河 SBM 1288 | 松滋 SIN 1289 | 板城 BUP 1290 | 林东 LRC 1291 | 林口 LKB 1292 | 林海 LXX 1293 | 林源 LYX 1294 | 林盛堡 LBT 1295 | 林西 LXC 1296 | 果松 GSL 1297 | 枝城 ZCN 1298 | 枝江北 ZIN 1299 | 枣庄 ZEK 1300 | 枣庄东 ZNK 1301 | 枣庄西 ZFK 1302 | 枣强 ZVP 1303 | 枣林 ZIV 1304 | 枣阳 ZYN 1305 | 柏果 BGM 1306 | 柞水 ZSY 1307 | 查布嘎 CBC 1308 | 柳园 DHR 1309 | 柳园南 LNR 1310 | 柳州 LZZ 1311 | 柳林南 LKV 1312 | 柳树屯 LSD 1313 | 柳河 LNL 1314 | 柴岗 CGT 1315 | 柴沟堡 CGV 1316 | 柴河 CHB 1317 | 栟茶 FWH 1318 | 株洲 ZZQ 1319 | 株洲西 ZAQ 1320 | 根河 GEX 1321 | 格尔木 GRO 1322 | 桂平 GAZ 1323 | 桂林 GLZ 1324 | 桂林北 GBZ 1325 | 桂林西 GEZ 1326 | 桃山 TAB 1327 | 桃村 TCK 1328 | 桃村北 TOK 1329 | 桐乡 TCH 1330 | 桐城 TTH 1331 | 桐子林 TEW 1332 | 桐柏 TBF 1333 | 桐梓 TZW 1334 | 桑园子 SAJ 1335 | 桑根达来 OGC 1336 | 桓台 VTK 1337 | 桥头 QAT 1338 | 桥西 QXJ 1339 | 桦南 HNB 1340 | 桦林 HIB 1341 | 梁山 LMK 1342 | 梁平 UQW 1343 | 梁底下 LDP 1344 | 梅州 MOQ 1345 | 梅河口 MHL 1346 | 梧州 WZZ 1347 | 梧州南 WBZ 1348 | 梨树镇 LSB 1349 | 棋子湾 QZQ 1350 | 棕溪 ZOY 1351 | 棠海 THM 1352 | 楚山 CSB 1353 | 楚雄 COM 1354 | 榆林 ALY 1355 | 榆树 YRT 1356 | 榆树台 YUT 1357 | 榆树屯 YSX 1358 | 榆树沟 YGP 1359 | 榆次 YCV 1360 | 榆社 YSV 1361 | 榕江 RVW 1362 | 樟木头 ZOQ 1363 | 樟木头东 ZRQ 1364 | 樟树 ZSG 1365 | 樟树东 ZOG 1366 | 横峰 HFG 1367 | 横沟桥东 HNN 1368 | 横道河子 HDB 1369 | 歙县 OVH 1370 | 歙县北 NPH 1371 | 正定 ZDP 1372 | 正定机场 ZHP 1373 | 正镶白旗 ZXC 1374 | 武义 RYH 1375 | 武义北 WDH 1376 | 武乡 WVV 1377 | 武功 WGY 1378 | 武夷山 WAS 1379 | 武夷山东 WCS 1380 | 武夷山北 WBS 1381 | 武威 WUJ 1382 | 武威南 WWJ 1383 | 武安 WAP 1384 | 武山 WSJ 1385 | 武当山 WRN 1386 | 武昌 WCN 1387 | 武汉 WHN 1388 | 武清 WWP 1389 | 武穴 WXN 1390 | 武胜 WSE 1391 | 武陟 WIF 1392 | 武隆 WLW 1393 | 歪头山 WIT 1394 | 毛坝 MBY 1395 | 毛坝关 MGY 1396 | 民乐 MBJ 1397 | 民和南 MNO 1398 | 民权 MQF 1399 | 水家湖 SQH 1400 | 水富 OTW 1401 | 水泉 SID 1402 | 水洋 OYP 1403 | 水洞 SIL 1404 | 水源 OYJ 1405 | 永丰营 YYM 1406 | 永乐店 YDY 1407 | 永修 ACG 1408 | 永嘉 URH 1409 | 永安 YAS 1410 | 永安乡 YNB 1411 | 永定 YGS 1412 | 永寿 ASY 1413 | 永川 YCW 1414 | 永川东 WMW 1415 | 永州 AOQ 1416 | 永康 RFH 1417 | 永康南 QUH 1418 | 永泰 YTS 1419 | 永济 YIV 1420 | 永济北 AJV 1421 | 永登 YDJ 1422 | 永福南 YBZ 1423 | 永郎 YLW 1424 | 汉中 HOY 1425 | 汉口 HKN 1426 | 汉寿 VSQ 1427 | 汉川 HCN 1428 | 汉沽 HGP 1429 | 汉源 WHW 1430 | 汉阴 HQY 1431 | 汐子 XZD 1432 | 汕头 OTQ 1433 | 汕尾 OGQ 1434 | 汝州 ROF 1435 | 汝箕沟 RQJ 1436 | 汝阳 RYF 1437 | 江华 JHZ 1438 | 江宁 JJH 1439 | 江宁西 OKH 1440 | 江山 JUH 1441 | 江所田 JOM 1442 | 江桥 JQX 1443 | 江永 JYZ 1444 | 江油 JFW 1445 | 江津 JJW 1446 | 江源 SZL 1447 | 江边村 JBG 1448 | 江都 UDH 1449 | 江门 JWQ 1450 | 池州 IYH 1451 | 汤原 TYB 1452 | 汤山城 TCT 1453 | 汤旺河 THB 1454 | 汤池 TCX 1455 | 汤逊湖 THN 1456 | 汤阴 TYF 1457 | 汨罗 MLQ 1458 | 汨罗东 MQQ 1459 | 汪清 WQL 1460 | 汾河 FEV 1461 | 汾阳 FAV 1462 | 沁县 QVV 1463 | 沁阳 QYF 1464 | 沂南 YNK 1465 | 沂水 YUK 1466 | 沃皮 WPT 1467 | 沈丘 SQN 1468 | 沈家 OJB 1469 | 沈家河 OJJ 1470 | 沈阳 SYT 1471 | 沈阳东 SDT 1472 | 沈阳北 SBT 1473 | 沈阳南 SOT 1474 | 沐滂 MPQ 1475 | 沙县 SAS 1476 | 沙后所 SSD 1477 | 沙坡头 SFJ 1478 | 沙城 SCP 1479 | 沙岭子 SLP 1480 | 沙桥 SQM 1481 | 沙沱 SFM 1482 | 沙河 SHP 1483 | 沙河口 SKT 1484 | 沙河市 VOP 1485 | 沙海 SED 1486 | 沙湾县 SXR 1487 | 沟帮子 GBD 1488 | 沥林北 KBQ 1489 | 沧州 COP 1490 | 沧州西 CBP 1491 | 沭阳 FMH 1492 | 河口北 HBM 1493 | 河口南 HKJ 1494 | 河唇 HCZ 1495 | 河津 HJV 1496 | 河源 VIQ 1497 | 河边 HBV 1498 | 河间西 HXP 1499 | 治安 ZAD 1500 | 沿河城 YHP 1501 | 泉州 QYS 1502 | 泉州东 QRS 1503 | 泉阳 QYL 1504 | 泊头 BZP 1505 | 泗县 GPH 1506 | 泗水 OSK 1507 | 泗洪 GQH 1508 | 泗阳 MPH 1509 | 泡子 POD 1510 | 泥河子 NHD 1511 | 泰和 THG 1512 | 泰宁 TNS 1513 | 泰安 TMK 1514 | 泰山 TAK 1515 | 泰州 UTH 1516 | 泰康 TKX 1517 | 泰来 TLX 1518 | 泽普 ZPR 1519 | 泽润里 ZLM 1520 | 泾县 LOH 1521 | 泾川 JAJ 1522 | 洋河 GTH 1523 | 洛湾三江 KRW 1524 | 洛门 LMJ 1525 | 洛阳 LYF 1526 | 洛阳东 LDF 1527 | 洛阳龙门 LLF 1528 | 洞庙河 DEP 1529 | 洪河 HPB 1530 | 洪洞 HDV 1531 | 洪洞西 HTV 1532 | 洮南 TVT 1533 | 流水沟 USP 1534 | 济南 JNK 1535 | 济南东 JAK 1536 | 济南西 JGK 1537 | 济宁 JIK 1538 | 济源 JYF 1539 | 浑河 HHT 1540 | 浠水 XZN 1541 | 浩良河 HHB 1542 | 浮图峪 FYP 1543 | 海东西 HDO 1544 | 海伦 HLB 1545 | 海北 HEB 1546 | 海口 VUQ 1547 | 海口东 HMQ 1548 | 海坨子 HZT 1549 | 海城 HCT 1550 | 海城西 HXT 1551 | 海宁 HNH 1552 | 海宁西 EUH 1553 | 海安县 HIH 1554 | 海拉尔 HRX 1555 | 海林 HRB 1556 | 海湾 RWH 1557 | 海石湾 HSO 1558 | 海阳 HYK 1559 | 海阳北 HEK 1560 | 海龙 HIL 1561 | 涉县 OEP 1562 | 涞源 LYP 1563 | 涟源 LAQ 1564 | 涡阳 GYH 1565 | 涪陵 FLW 1566 | 涪陵北 FEW 1567 | 涵江 HJS 1568 | 涿州 ZXP 1569 | 涿州东 ZAP 1570 | 淄博 ZBK 1571 | 淮北 HRH 1572 | 淮南 HAH 1573 | 淮南东 HOH 1574 | 淮安 AUH 1575 | 淮安南 AMH 1576 | 淮滨 HVN 1577 | 深井子 SWT 1578 | 深圳 SZQ 1579 | 深圳东 BJQ 1580 | 深圳北 IOQ 1581 | 深圳坪山 IFQ 1582 | 深圳西 OSQ 1583 | 深州 OZP 1584 | 清华园 QHP 1585 | 清原 QYT 1586 | 清徐 QUV 1587 | 清水 QUJ 1588 | 清水北 QEJ 1589 | 清河 QIP 1590 | 清河城 QYP 1591 | 清河门 QHD 1592 | 清涧县 QNY 1593 | 清远 QBQ 1594 | 渑池 MCF 1595 | 渑池南 MNF 1596 | 渠县 QRW 1597 | 渠旧 QJZ 1598 | 渠黎 QLZ 1599 | 温岭 VHH 1600 | 温州 RZH 1601 | 温州南 VRH 1602 | 温春 WDB 1603 | 渭南 WNY 1604 | 渭南北 WBY 1605 | 渭南南 WVY 1606 | 渭南镇 WNJ 1607 | 渭津 WJL 1608 | 湖口 HKG 1609 | 湖州 VZH 1610 | 湘乡 XXQ 1611 | 湘潭 XTQ 1612 | 湘潭北 EDQ 1613 | 湛江 ZJZ 1614 | 湛江西 ZWQ 1615 | 湟源 HNO 1616 | 湾沟 WGL 1617 | 溆浦 EPQ 1618 | 溆浦南 EMQ 1619 | 源潭 YTQ 1620 | 源迁 AQK 1621 | 溧水 LDH 1622 | 溧阳 LEH 1623 | 滁州 CXH 1624 | 滁州北 CUH 1625 | 滕州 TXK 1626 | 滕州东 TEK 1627 | 满归 MHX 1628 | 满洲里 MLX 1629 | 滦县 UXP 1630 | 滦平 UPP 1631 | 滦河 UDP 1632 | 滦河沿 UNP 1633 | 滨州 BIK 1634 | 滨江 BJB 1635 | 滨海 FHP 1636 | 滨海北 FCP 1637 | 滴道 DDB 1638 | 漠河 MVX 1639 | 漫水湾 MKW 1640 | 漯河 LON 1641 | 漯河西 LBN 1642 | 漳州 ZUS 1643 | 漳州东 GOS 1644 | 漳平 ZPS 1645 | 漳浦 ZCS 1646 | 潍坊 WFK 1647 | 潘家店 PDP 1648 | 潜江 QJN 1649 | 潞城 UTP 1650 | 潢川 KCN 1651 | 潮州 CKQ 1652 | 潮汕 CBQ 1653 | 潮阳 CNQ 1654 | 潼关 TGY 1655 | 潼南 TVW 1656 | 澄城 CUY 1657 | 澧县 LEQ 1658 | 濑湍 LVZ 1659 | 濮阳 PYF 1660 | 灌水 GST 1661 | 火连寨 HLT 1662 | 灯塔 DGT 1663 | 灵丘 LVV 1664 | 灵宝 LBF 1665 | 灵宝西 LPF 1666 | 灵武 LNJ 1667 | 灵璧 GMH 1668 | 灵石 LSV 1669 | 灵石东 UDV 1670 | 炎陵 YAG 1671 | 烟台 YAK 1672 | 烟台南 YLK 1673 | 烟筒屯 YUX 1674 | 烟筒山 YSL 1675 | 热水 RSD 1676 | 焉耆 YSR 1677 | 焦作 JOF 1678 | 焦作东 WEF 1679 | 照福铺 ZFM 1680 | 熊岳城 XYT 1681 | 燕子砭 YZY 1682 | 燕家庄 AZK 1683 | 燕山 AOP 1684 | 燕岗 YGW 1685 | 燕郊 AJP 1686 | 牙克石 YKX 1687 | 牙屯堡 YTZ 1688 | 牛家 NJB 1689 | 牛心台 NXT 1690 | 牟平 MBK 1691 | 牡丹江 MDB 1692 | 犀浦 XIW 1693 | 犀浦东 XAW 1694 | 独山 RWW 1695 | 独立屯 DTX 1696 | 狮山 KSQ 1697 | 狮山北 NSQ 1698 | 狼尾山 LRJ 1699 | 猛洞河 MUQ 1700 | 玉屏 YZW 1701 | 玉山 YNG 1702 | 玉山南 YGG 1703 | 玉林 YLZ 1704 | 玉泉 YQB 1705 | 玉溪 YXM 1706 | 玉田县 ATP 1707 | 玉石 YSJ 1708 | 玉门 YXJ 1709 | 王兆屯 WZB 1710 | 王团庄 WZJ 1711 | 王安镇 WVP 1712 | 王家湾 WJJ 1713 | 王家营西 KNM 1714 | 王岗 WGB 1715 | 王府 WUT 1716 | 王杨 WYB 1717 | 王瞳 WTP 1718 | 玛纳斯 MSR 1719 | 玛纳斯湖 MNR 1720 | 珠海 ZHQ 1721 | 珠海北 ZIQ 1722 | 珠窝 ZOP 1723 | 班猫箐 BNM 1724 | 珲春 HUL 1725 | 琼海 QYQ 1726 | 瑞安 RAH 1727 | 瑞昌 RCG 1728 | 瑞金 RJG 1729 | 璧山 FZW 1730 | 瓜州 GZJ 1731 | 瓢儿屯 PRT 1732 | 瓦屋山 WAH 1733 | 瓦房店 WDT 1734 | 瓦房店西 WXT 1735 | 瓦拉干 WVX 1736 | 瓦窑田 WIM 1737 | 甘旗卡 GQD 1738 | 甘河 GAX 1739 | 甘泉 GQY 1740 | 甘泉北 GEY 1741 | 甘洛 VOW 1742 | 甘草店 GDJ 1743 | 甘谷 GGJ 1744 | 田东 TDZ 1745 | 田东北 TBZ 1746 | 田师府 TFT 1747 | 田林 TFZ 1748 | 田阳 TRZ 1749 | 甲山 JOP 1750 | 甸心 DXM 1751 | 界首市 JUN 1752 | 略阳 LYY 1753 | 疏勒 SUR 1754 | 疏勒河 SHJ 1755 | 登沙河 DWT 1756 | 白云鄂博 BEC 1757 | 白城 BCT 1758 | 白壁关 BGV 1759 | 白奎堡 BKB 1760 | 白山市 HJL 1761 | 白旗 BQP 1762 | 白水县 BGY 1763 | 白水江 BSY 1764 | 白水镇 BUM 1765 | 白沙 BSW 1766 | 白沙坡 BPM 1767 | 白沟 FEP 1768 | 白河 BEL 1769 | 白河东 BIY 1770 | 白河县 BEY 1771 | 白泉 BQL 1772 | 白洋淀 FWP 1773 | 白涧 BAP 1774 | 白狼 BAT 1775 | 白石山 BAL 1776 | 白芨沟 BJJ 1777 | 白银市 BNJ 1778 | 白银西 BXJ 1779 | 白音他拉 BID 1780 | 白音华南 FNC 1781 | 白音察干 BYC 1782 | 白音胡硕 BCD 1783 | 白马井 BFQ 1784 | 白鸡坡 BBM 1785 | 百宜 FHW 1786 | 百浪 BRZ 1787 | 百色 BIZ 1788 | 百里峡 AAP 1789 | 皇姑屯 HTT 1790 | 皋兰 GEJ 1791 | 皮口 PUT 1792 | 皮口南 PKT 1793 | 皮山 PSR 1794 | 益阳 AEQ 1795 | 盐城 AFH 1796 | 盐池 YKJ 1797 | 盐津 AEW 1798 | 盖州 GXT 1799 | 盖州西 GAT 1800 | 盘关 PAM 1801 | 盘锦 PVD 1802 | 盘锦北 PBD 1803 | 眉山 MSW 1804 | 眉山东 IUW 1805 | 石人 SRL 1806 | 石人城 SRB 1807 | 石嘴山 QQJ 1808 | 石坝 OBJ 1809 | 石城 SCT 1810 | 石头 OTB 1811 | 石家庄 SJP 1812 | 石家庄北 VVP 1813 | 石山 SAD 1814 | 石岘 SXL 1815 | 石岭 SOL 1816 | 石峡子 SXJ 1817 | 石景山南 SRP 1818 | 石林 SLM 1819 | 石林南 LNM 1820 | 石柱县 OSW 1821 | 石桥 SQE 1822 | 石桥子 SQT 1823 | 石梯 STE 1824 | 石河子 SZR 1825 | 石泉县 SXY 1826 | 石磷 SPB 1827 | 石门县 OMQ 1828 | 石门县北 VFQ 1829 | 石龙 SLQ 1830 | 砀山 DKH 1831 | 砚川 YYY 1832 | 确山 QSN 1833 | 碧江 BLQ 1834 | 碧鸡关 BJM 1835 | 碾子山 NZX 1836 | 磁县 CIP 1837 | 磁山 CSP 1838 | 磁窑 CYK 1839 | 磁西 CRP 1840 | 磐安镇 PAJ 1841 | 磐石 PSL 1842 | 磨刀石 MOB 1843 | 礼泉 LGY 1844 | 祁东 QMQ 1845 | 祁东北 QRQ 1846 | 祁县 QXV 1847 | 祁县东 QGV 1848 | 祁家堡 QBT 1849 | 祁门 QIH 1850 | 祁阳 QWQ 1851 | 祁阳北 QVQ 1852 | 神头 SEV 1853 | 神州 SRQ 1854 | 神木 OMY 1855 | 神树 SWB 1856 | 神池 SMV 1857 | 祥云 EXM 1858 | 禄丰南 LQM 1859 | 福利区 FLJ 1860 | 福利屯 FTB 1861 | 福安 FAS 1862 | 福山口 FKP 1863 | 福山镇 FZQ 1864 | 福州 FZS 1865 | 福州南 FYS 1866 | 福泉 VMW 1867 | 福海 FHR 1868 | 福清 FQS 1869 | 福田 NZQ 1870 | 福鼎 FES 1871 | 禹城 YCK 1872 | 离堆公园 INW 1873 | 秀山 ETW 1874 | 秦家 QJB 1875 | 秦家庄 QZV 1876 | 秦岭 QLY 1877 | 秦皇岛 QTP 1878 | 秧草地 YKM 1879 | 稷山 JVV 1880 | 穆棱 MLB 1881 | 窑上 ASP 1882 | 立志 LZX 1883 | 章丘 ZTK 1884 | 章党 ZHT 1885 | 章古台 ZGD 1886 | 端州 WZQ 1887 | 竹园坝 ZAW 1888 | 笔架山 BSB 1889 | 简阳 JYW 1890 | 简阳南 JOW 1891 | 米易 MMW 1892 | 米沙子 MST 1893 | 米脂 MEY 1894 | 精河 JHR 1895 | 精河南 JIR 1896 | 索伦 SNT 1897 | 索图罕 SHX 1898 | 紫荆关 ZYP 1899 | 紫阳 ZVY 1900 | 綦江 QJW 1901 | 繁峙 FSV 1902 | 繁昌西 PUH 1903 | 红光镇 IGW 1904 | 红兴隆 VHB 1905 | 红安 HWN 1906 | 红安西 VXN 1907 | 红寺堡 HSJ 1908 | 红山 VSB 1909 | 红岘台 HTJ 1910 | 红彦 VIX 1911 | 红星 VXB 1912 | 红果 HEM 1913 | 红江 HFM 1914 | 红砂岘 VSJ 1915 | 红花沟 VHD 1916 | 纪家沟 VJD 1917 | 纳雍 NYE 1918 | 纸坊东 ZMN 1919 | 绅坊 OLH 1920 | 织金 IZW 1921 | 织金北 ZJE 1922 | 绍兴 SOH 1923 | 绍兴北 SLH 1924 | 经棚 JPC 1925 | 绕阳河 RHD 1926 | 统军庄 TZP 1927 | 绥中 SZD 1928 | 绥中北 SND 1929 | 绥化 SHB 1930 | 绥德 ODY 1931 | 绥棱 SIB 1932 | 绥芬河 SFB 1933 | 绥阳 SYB 1934 | 绩溪北 NRH 1935 | 绩溪县 JRH 1936 | 绵阳 MYW 1937 | 绿化 LWJ 1938 | 绿博园 LCF 1939 | 缙云 JYH 1940 | 缙云西 PYH 1941 | 罗城 VCZ 1942 | 罗山 LRN 1943 | 罗平 LPM 1944 | 罗江 LJW 1945 | 罗江东 IKW 1946 | 罗源 LVS 1947 | 羊场 YED 1948 | 羊堡 ABM 1949 | 羊尾哨 YWM 1950 | 羊者窝 AEM 1951 | 羊臼河 YHM 1952 | 羊草 YAB 1953 | 美兰 MHQ 1954 | 美溪 MEB 1955 | 老城镇 ACQ 1956 | 老府 UFD 1957 | 老莱 LAX 1958 | 老营 LXL 1959 | 老边 LLT 1960 | 耒阳 LYQ 1961 | 耒阳西 LPQ 1962 | 聊城 UCK 1963 | 肃宁 SYP 1964 | 肇东 ZDB 1965 | 肇庆 ZVQ 1966 | 肇庆东 FCQ 1967 | 肥东 FIH 1968 | 背荫河 BYB 1969 | 胜芳 SUP 1970 | 胶州 JXK 1971 | 胶州北 JZK 1972 | 能家 NJD 1973 | 自贡 ZGW 1974 | 舍力虎 VLD 1975 | 舒兰 SLL 1976 | 舒城 OCH 1977 | 良各庄 LGP 1978 | 艾家村 AJJ 1979 | 艾河 AHP 1980 | 芜湖 WHH 1981 | 芦台 LTP 1982 | 芦沟 LOM 1983 | 芦溪 LUG 1984 | 芦潮港 UCH 1985 | 芨岭 JLJ 1986 | 花园 HUN 1987 | 花园口 HYT 1988 | 花家庄 HJM 1989 | 花山南 KNN 1990 | 花桥 VQH 1991 | 花棚子 HZM 1992 | 花湖 KHN 1993 | 芷江 ZPQ 1994 | 苇子沟 WZL 1995 | 苇河 WHB 1996 | 苍南 CEH 1997 | 苍溪 CXE 1998 | 苍石 CST 1999 | 苏家屯 SXT 2000 | 苏州 SZH 2001 | 苏州北 OHH 2002 | 苏州园区 KAH 2003 | 苏州新区 ITH 2004 | 英吉沙 YIR 2005 | 英德 YDQ 2006 | 英德西 IIQ 2007 | 茂名 MMZ 2008 | 茂名东 MDQ 2009 | 茂林 MLD 2010 | 茂舍祖 MOM 2011 | 范家屯 FTT 2012 | 范镇 VZK 2013 | 茅岭 MLZ 2014 | 茅草坪 KPM 2015 | 茶陵 CDG 2016 | 茶陵南 CNG 2017 | 荆州 JBN 2018 | 荆门 JMN 2019 | 草市 CSL 2020 | 草河口 CKT 2021 | 草海 WBW 2022 | 荣成 RCK 2023 | 荣昌 RCW 2024 | 荣昌北 RQW 2025 | 莆田 PTS 2026 | 莎车 SCR 2027 | 莒南 JOK 2028 | 莒县 JKK 2029 | 莫尔道嘎 MRX 2030 | 莱芜东 LWK 2031 | 莱芜西 UXK 2032 | 莱西 LXK 2033 | 莱西北 LBK 2034 | 莱阳 LYK 2035 | 莲江口 LHB 2036 | 获嘉 HJF 2037 | 菇园 GYL 2038 | 菏泽 HIK 2039 | 萍乡 PXG 2040 | 萍乡北 PBG 2041 | 营口 YKT 2042 | 营口东 YGT 2043 | 营城子 YCT 2044 | 营山 NUW 2045 | 营盘水 YZJ 2046 | 营街 YAM 2047 | 萨拉齐 SLC 2048 | 落坡岭 LPP 2049 | 落垡 LOP 2050 | 葛店南 GNN 2051 | 葛根庙 GGT 2052 | 葡萄菁 PTW 2053 | 葫芦岛 HLD 2054 | 葫芦岛北 HPD 2055 | 葵潭 KTQ 2056 | 蒙自 MZM 2057 | 蒙自北 MBM 2058 | 蒲城 PCY 2059 | 蒲城东 PEY 2060 | 蓝村 LCK 2061 | 蓟县 JKP 2062 | 蓬安 PAW 2063 | 蔡家坡 CJY 2064 | 蔡家沟 CJT 2065 | 蔡山 CON 2066 | 蔺家楼 ULK 2067 | 蕲春 QRN 2068 | 藁城 GEP 2069 | 藤县 TAZ 2070 | 虎什哈 HHP 2071 | 虎林 VLB 2072 | 虎石台 HUT 2073 | 虎门 IUQ 2074 | 虞城县 IXH 2075 | 虢镇 GZY 2076 | 蚌埠 BBH 2077 | 蚌埠南 BMH 2078 | 蛟河 JHL 2079 | 蛟河西 JOL 2080 | 融安 RAZ 2081 | 融水 RSZ 2082 | 衡南 HNG 2083 | 衡山 HSQ 2084 | 衡山西 HEQ 2085 | 衡水 HSP 2086 | 衡阳 HYQ 2087 | 衡阳东 HVQ 2088 | 衢州 QEH 2089 | 裴德 PDB 2090 | 褚家湾 CWJ 2091 | 襄垣 EIF 2092 | 襄汾 XFV 2093 | 襄汾西 XTV 2094 | 襄河 XXB 2095 | 襄阳 XFN 2096 | 襄阳东 XWN 2097 | 西丰 XFT 2098 | 西乌旗 XWC 2099 | 西乡 XQY 2100 | 西八里 XLP 2101 | 西哲里木 XRD 2102 | 西固 XIJ 2103 | 西固城 XUJ 2104 | 西大庙 XMP 2105 | 西宁 XNO 2106 | 西安 XAY 2107 | 西安北 EAY 2108 | 西安南 CAY 2109 | 西小召 XZC 2110 | 西岗子 NBB 2111 | 西峡 XIF 2112 | 西平 XPN 2113 | 西昌 ECW 2114 | 西昌南 ENW 2115 | 西林 XYB 2116 | 西柳 GCT 2117 | 西湖东 WDQ 2118 | 西街口 EKM 2119 | 西阳村 XQF 2120 | 西麻山 XMB 2121 | 角美 JES 2122 | 讷河 NHX 2123 | 许三湾 XSJ 2124 | 许家台 XTJ 2125 | 许家屯 XJT 2126 | 许昌 XCF 2127 | 许昌东 XVF 2128 | 诏安 ZDS 2129 | 诸城 ZQK 2130 | 诸暨 ZDH 2131 | 读书铺 DPM 2132 | 谢家镇 XMT 2133 | 谭家井 TNJ 2134 | 谷城 GCN 2135 | 豆庄 ROP 2136 | 豆张庄 RZP 2137 | 豆罗 DLV 2138 | 贲红 BVC 2139 | 贵定 GTW 2140 | 贵定北 FMW 2141 | 贵定南 IDW 2142 | 贵定县 KIW 2143 | 贵港 GGZ 2144 | 贵溪 GXG 2145 | 贵阳 GIW 2146 | 贵阳北 KQW 2147 | 费县 FXK 2148 | 贺家店 HJJ 2149 | 贺州 HXZ 2150 | 贺胜桥东 HLN 2151 | 贾鲁河 JLF 2152 | 资中 ZZW 2153 | 资中北 WZW 2154 | 资溪 ZXS 2155 | 资阳 ZYW 2156 | 资阳北 FYW 2157 | 赛汗塔拉 SHC 2158 | 赣州 GZG 2159 | 赤壁 CBN 2160 | 赤壁北 CIN 2161 | 赤峰 CFD 2162 | 赤峰西 CID 2163 | 赵光 ZGB 2164 | 赵城 ZCV 2165 | 赶水 GSW 2166 | 超梁沟 CYP 2167 | 越西 YHW 2168 | 路口铺 LKQ 2169 | 车转湾 CWM 2170 | 轩岗 XGV 2171 | 轮台 LAR 2172 | 辛集 ENP 2173 | 辰清 CQB 2174 | 辰溪 CXQ 2175 | 辽中 LZD 2176 | 辽源 LYL 2177 | 辽阳 LYT 2178 | 达家沟 DJT 2179 | 达州 RXW 2180 | 达拉特旗 DIC 2181 | 达拉特西 DNC 2182 | 迁安 QQP 2183 | 迎宾路 YFW 2184 | 迎春 YYB 2185 | 运城 YNV 2186 | 运城北 ABV 2187 | 运粮河 YEF 2188 | 进贤 JUG 2189 | 进贤南 JXG 2190 | 连云港 UIH 2191 | 连云港东 UKH 2192 | 连山关 LGT 2193 | 连江 LKS 2194 | 迤资 YQM 2195 | 通化 THL 2196 | 通化县 TXL 2197 | 通北 TBB 2198 | 通安驿 TAJ 2199 | 通州西 TAP 2200 | 通沟 TOL 2201 | 通海 TAM 2202 | 通辽 TLD 2203 | 通远堡 TYT 2204 | 通远堡西 TST 2205 | 通途 TUT 2206 | 通道 TRQ 2207 | 遂宁 NIW 2208 | 遂平 SON 2209 | 遂溪 SXZ 2210 | 道州 DFZ 2211 | 道清 DML 2212 | 遵义 ZIW 2213 | 邓州 DOF 2214 | 邢台 XTP 2215 | 邢台东 EDP 2216 | 那曲 NQO 2217 | 那罗 ULZ 2218 | 那铺 NPZ 2219 | 邯郸 HDP 2220 | 邯郸东 HPP 2221 | 邳州 PJH 2222 | 邵东 FIQ 2223 | 邵家堂 SJJ 2224 | 邵武 SWS 2225 | 邵阳 SYQ 2226 | 邵阳北 OVQ 2227 | 邹城 ZIK 2228 | 郁南 YKQ 2229 | 郑州 ZZF 2230 | 郑州东 ZAF 2231 | 郑州西 XPF 2232 | 郓城 YPK 2233 | 郫县 PWW 2234 | 郫县西 PCW 2235 | 郭家店 GDT 2236 | 郭磊庄 GLP 2237 | 郯城 TZK 2238 | 郴州 CZQ 2239 | 郴州西 ICQ 2240 | 都匀 RYW 2241 | 都匀东 KJW 2242 | 都格 DMM 2243 | 都江堰 DDW 2244 | 鄂尔多斯 EEC 2245 | 鄂州 ECN 2246 | 鄂州东 EFN 2247 | 鄄城 JCK 2248 | 鄯善 SSR 2249 | 鄯善北 SMR 2250 | 酉阳 AFW 2251 | 酒泉 JQJ 2252 | 酒泉南 JNJ 2253 | 醴陵 LLG 2254 | 醴陵东 UKQ 2255 | 里木店 LMB 2256 | 重庆 CQW 2257 | 重庆北 CUW 2258 | 重庆南 CRW 2259 | 野三坡 AIP 2260 | 金华 JBH 2261 | 金华南 RNH 2262 | 金坑 JKT 2263 | 金城江 JJZ 2264 | 金宝屯 JBD 2265 | 金寨 JZH 2266 | 金山北 EGH 2267 | 金山屯 JTB 2268 | 金州 JZT 2269 | 金昌 JCJ 2270 | 金杖子 JYD 2271 | 金沟屯 VGP 2272 | 金河 JHX 2273 | 金马村 JMM 2274 | 钟家村 ZJY 2275 | 钟山 ZSZ 2276 | 钟山西 ZAZ 2277 | 钟祥 ZTN 2278 | 钦州 QRZ 2279 | 钦州东 QDZ 2280 | 铁力 TLB 2281 | 铁厂 TCL 2282 | 铁岭 TLT 2283 | 铁岭西 PXT 2284 | 铜仁 RDQ 2285 | 铜仁南 TNW 2286 | 铜陵 TJH 2287 | 铜陵北 KXH 2288 | 银川 YIJ 2289 | 银浪 YJX 2290 | 银滩 CTQ 2291 | 银瓶 KPQ 2292 | 锡林浩特 XTC 2293 | 锦州 JZD 2294 | 锦州南 JOD 2295 | 锦河 JHB 2296 | 镇城底 ZDV 2297 | 镇安 ZEY 2298 | 镇平 ZPF 2299 | 镇江 ZJH 2300 | 镇江南 ZEH 2301 | 镇西 ZVT 2302 | 镇赉 ZLT 2303 | 镇远 ZUW 2304 | 镜铁山 JVJ 2305 | 长临河 FVH 2306 | 长兴 CBH 2307 | 长兴南 CFH 2308 | 长农 CNJ 2309 | 长冲 CCM 2310 | 长坡岭 CPM 2311 | 长垣 CYF 2312 | 长城 CEJ 2313 | 长寿 EFW 2314 | 长寿北 COW 2315 | 长山屯 CVT 2316 | 长岭子 CLT 2317 | 长庆桥 CQJ 2318 | 长征 CZJ 2319 | 长春 CCT 2320 | 长春南 CET 2321 | 长春西 CRT 2322 | 长武 CWY 2323 | 长汀 CES 2324 | 长汀南 CNS 2325 | 长汀镇 CDB 2326 | 长沙 CSQ 2327 | 长沙南 CWQ 2328 | 长治 CZF 2329 | 长治北 CBF 2330 | 长甸 CDT 2331 | 长葛 CEF 2332 | 长阳 CYN 2333 | 门源 MYO 2334 | 闻喜 WXV 2335 | 闻喜西 WOV 2336 | 闽清 MQS 2337 | 闽清北 MBS 2338 | 阆中 LZE 2339 | 阎良 YNY 2340 | 阜南 FNH 2341 | 阜宁 AKH 2342 | 阜新 FXD 2343 | 阜阳 FYH 2344 | 防城港北 FBZ 2345 | 阳信 YVK 2346 | 阳城 YNF 2347 | 阳岔 YAL 2348 | 阳平关 YAY 2349 | 阳新 YON 2350 | 阳明堡 YVV 2351 | 阳春 YQQ 2352 | 阳曲 YQV 2353 | 阳朔 YCZ 2354 | 阳泉 AQP 2355 | 阳泉北 YPP 2356 | 阳泉曲 YYV 2357 | 阳澄湖 AIH 2358 | 阳谷 YIK 2359 | 阳邑 ARP 2360 | 阳高 YOV 2361 | 阿克苏 ASR 2362 | 阿克陶 AER 2363 | 阿南庄 AZM 2364 | 阿图什 ATR 2365 | 阿城 ACB 2366 | 阿尔山 ART 2367 | 阿拉山口 AKR 2368 | 阿木尔 JTX 2369 | 阿里河 AHX 2370 | 阿金 AJD 2371 | 阿龙山 ASX 2372 | 陆丰 LLQ 2373 | 陆川 LKZ 2374 | 陆良 LRM 2375 | 陇县 LXY 2376 | 陇西 LXJ 2377 | 陈官营 CAJ 2378 | 陈相屯 CXT 2379 | 陵城 LGK 2380 | 陵水 LIQ 2381 | 陶家屯 TOT 2382 | 陶赖昭 TPT 2383 | 隆化 UHP 2384 | 隆安东 IDZ 2385 | 隆昌 LCW 2386 | 隆昌北 NWW 2387 | 随州 SZN 2388 | 雁翅 YAP 2389 | 雁荡山 YGH 2390 | 集宁南 JAC 2391 | 集安 JAL 2392 | 雨格 VTM 2393 | 零陵 UWZ 2394 | 雷州 UAQ 2395 | 霍尔果斯 HFR 2396 | 霍州 HZV 2397 | 霍州东 HWV 2398 | 霍林郭勒 HWD 2399 | 霍邱 FBH 2400 | 霞浦 XOS 2401 | 露水河 LUL 2402 | 霸州 RMP 2403 | 霸州西 FOP 2404 | 青县 QXP 2405 | 青城山 QSW 2406 | 青堆 QET 2407 | 青山 QSB 2408 | 青岛 QDK 2409 | 青岛北 QHK 2410 | 青州市 QZK 2411 | 青田 QVH 2412 | 青白江东 QFW 2413 | 青神 QVW 2414 | 青莲 QEW 2415 | 青铜峡 QTJ 2416 | 青龙 QIB 2417 | 青龙山 QGH 2418 | 靖宇 JYL 2419 | 靖州 JEQ 2420 | 靖西 JMZ 2421 | 靖边 JIY 2422 | 靖远 JYJ 2423 | 靖远西 JXJ 2424 | 静海 JHP 2425 | 革居 GEM 2426 | 革镇堡 GZT 2427 | 鞍山 AST 2428 | 鞍山西 AXT 2429 | 韦庄 WZY 2430 | 韩城 HCY 2431 | 韩府湾 HXJ 2432 | 韩麻营 HYP 2433 | 韶关 SNQ 2434 | 韶关东 SGQ 2435 | 韶山 SSQ 2436 | 韶山南 INQ 2437 | 项城 ERN 2438 | 顺义 SOP 2439 | 顺德 ORQ 2440 | 顺德学院 OJQ 2441 | 顺昌 SCS 2442 | 额济纳 EJC 2443 | 风陵渡 FLV 2444 | 饶平 RVQ 2445 | 饶阳 RVP 2446 | 首山 SAT 2447 | 香兰 XNB 2448 | 香坊 XFB 2449 | 马三家 MJT 2450 | 马兰 MLR 2451 | 马林 MID 2452 | 马桥河 MQB 2453 | 马皇 MHZ 2454 | 马莲河 MHB 2455 | 马鞍山 MAH 2456 | 马鞍山东 OMH 2457 | 马龙 MGM 2458 | 驻马店 ZDN 2459 | 驻马店西 ZLN 2460 | 驼腰岭 TIL 2461 | 骆驼巷 LTJ 2462 | 高台 GTJ 2463 | 高台南 GAJ 2464 | 高各庄 GGP 2465 | 高安 GCG 2466 | 高密 GMK 2467 | 高山子 GSD 2468 | 高州 GSQ 2469 | 高平 GPF 2470 | 高村 GCV 2471 | 高桥镇 GZD 2472 | 高楼房 GFM 2473 | 高滩 GAY 2474 | 高碑店 GBP 2475 | 高碑店东 GMP 2476 | 高邑 GIP 2477 | 高邑西 GNP 2478 | 魏善庄 WSP 2479 | 魏杖子 WKD 2480 | 鲁山 LAF 2481 | 鲁番 LVM 2482 | 鲅鱼圈 BYT 2483 | 鲘门 KMQ 2484 | 鳌江 ARH 2485 | 鸡东 JOB 2486 | 鸡冠山 JST 2487 | 鸡西 JXB 2488 | 鸭园 YYL 2489 | 鸳鸯镇 YYJ 2490 | 鹤北 HMB 2491 | 鹤壁 HAF 2492 | 鹤壁东 HFF 2493 | 鹤岗 HGB 2494 | 鹤庆 HQM 2495 | 鹤立 HOB 2496 | 鹰手营子 YIP 2497 | 鹰潭 YTG 2498 | 鹰潭北 YKG 2499 | 鹿寨 LIZ 2500 | 鹿寨北 LSZ 2501 | 鹿道 LDL 2502 | 麦园 MYS 2503 | 麻城 MCN 2504 | 麻城北 MBN 2505 | 麻尾 VAW 2506 | 麻山 MAB 2507 | 麻阳 MVQ 2508 | 黄冈 KGN 2509 | 黄冈东 KAN 2510 | 黄冈西 KXN 2511 | 黄口 KOH 2512 | 黄山 HKH 2513 | 黄山北 NYH 2514 | 黄州 VON 2515 | 黄村 HCP 2516 | 黄松甸 HDL 2517 | 黄柏 HBL 2518 | 黄梅 VEH 2519 | 黄河景区 HCF 2520 | 黄泥河 HHL 2521 | 黄流 KLQ 2522 | 黄石 HSN 2523 | 黄石东 OSN 2524 | 黄石北 KSN 2525 | 黄羊滩 HGJ 2526 | 黄羊镇 HYJ 2527 | 黄花筒 HUD 2528 | 黄陵 ULY 2529 | 黄陵南 VLY 2530 | 黎城 UCP 2531 | 黎塘 LTZ 2532 | 黑井 HIM 2533 | 黑冲滩 HCJ 2534 | 黑台 HQB 2535 | 黑旺 HWK 2536 | 黑水 HOT 2537 | 黑河 HJB 2538 | 黔江 QNW 2539 | 鼎湖东 UWQ 2540 | 鼎湖山 NVQ 2541 | 齐齐哈尔 QHX 2542 | 齐齐哈尔南 QNB 2543 | 龙丰 KFQ 2544 | 龙井 LJL 2545 | 龙华 LHP 2546 | 龙南 UNG 2547 | 龙嘉 UJL 2548 | 龙塘坝 LBM 2549 | 龙山镇 LAS 2550 | 龙岩 LYS 2551 | 龙川 LUQ 2552 | 龙市 LAG 2553 | 龙江 LJX 2554 | 龙沟 LGJ 2555 | 龙泉寺 UQJ 2556 | 龙洞堡 FVW 2557 | 龙游 LMH 2558 | 龙爪沟 LZT 2559 | 龙里 LLW 2560 | 龙里北 KFW 2561 | 龙镇 LZA 2562 | 龙骨甸 LGM 2563 | -------------------------------------------------------------------------------- /iquery/hospitals.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.hospitals 5 | ~~~~~~~~~~~~~~~~~~~~~~ 6 | 7 | Check whether a hospital is putian series or display 8 | all putian series hospitals in a city. The datas come 9 | from: 10 | https://github.com/open-power-workgroup/Hospital 11 | """ 12 | 13 | from prettytable import PrettyTable 14 | from .utils import colored, requests_get, exit_after_echo 15 | 16 | 17 | __all__ = ['query'] 18 | 19 | QUERY_URL = ('https://raw.githubusercontent.com/' 20 | 'open-power-workgroup/Hospital/master/' 21 | 'resource/API_resource/hospital_list.json') 22 | 23 | 24 | class HospitalCollection(object): 25 | 26 | """Putian hospitals data sets.""" 27 | 28 | def __init__(self, rows, params): 29 | self._rows = rows 30 | self._params = params 31 | self._city = self._params[0] 32 | 33 | if len(self._params) == 2: 34 | #: User input a hospital name after city 35 | self._hospital = self._params[1] 36 | else: 37 | self._hospital = '' 38 | 39 | @property 40 | def putian_hospitals_in_city(self): 41 | hospitals = self._rows.get(self._city, None) 42 | if hospitals is None: 43 | exit_after_echo('City is not supported.') 44 | return iter(hospitals) 45 | 46 | def pretty_print(self): 47 | 48 | if not self._hospital: 49 | pt = PrettyTable() 50 | pt._set_field_names([self._city]) 51 | for hospital in self.putian_hospitals_in_city: 52 | pt.add_row([colored.green(hospital)]) 53 | print(pt) 54 | 55 | else: 56 | is_putian, field_name = False, self._city + self._hospital 57 | 58 | for hospital in self.putian_hospitals_in_city: 59 | pt = PrettyTable() 60 | if self._hospital in hospital: 61 | is_putian, field_name = True, hospital 62 | pt._set_field_names([field_name]) 63 | pt.add_row([colored.green(str(is_putian))]) 64 | print(pt) 65 | 66 | 67 | def query(params): 68 | """`params` is a city name or a city name + hospital name. 69 | 70 | CLI: 71 | 72 | 1. query all putian hospitals in a city: 73 | 74 | $ iquery -p 南京 75 | +------+ 76 | | 南京 | 77 | +------+ 78 | |... | 79 | +------+ 80 | |... | 81 | +------+ 82 | ... 83 | 84 | 85 | 2. query if the hospital in the city is putian 86 | series, you can only input hospital's short name: 87 | 88 | $ iquery -p 南京 曙光 89 | +------------+ 90 | |南京曙光医院| 91 | +------------+ 92 | | True | 93 | +------------+ 94 | 95 | """ 96 | 97 | r = requests_get(QUERY_URL, verify=True) 98 | 99 | return HospitalCollection(r.json(), params) 100 | -------------------------------------------------------------------------------- /iquery/lottery.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.lottery 5 | ~~~~~~~~~~~~~ 6 | 7 | lottery query from `http://baidu.lecai.com/`. 8 | """ 9 | 10 | from pyquery import PyQuery as pq 11 | from prettytable import PrettyTable 12 | from .utils import colored, requests_get 13 | 14 | 15 | __all__ = ['query'] 16 | 17 | # 目前基于百度乐彩的开奖信息 18 | QUERY_URL = 'http://baidu.lecai.com/lottery/draw/?agentId=5571' 19 | QUERY_DETAIL_URL = 'http://baidu.lecai.com/lottery/draw/list/{id}' 20 | # ERR MSG 21 | # LOTTERY_NOT_FOUND = 'Sorry, not found.' 22 | 23 | 24 | class LotteryPage(object): 25 | 26 | """基于百度乐彩 """ 27 | 28 | header = '编号 彩种 期号 开奖时间 开奖号码 奖池滚存(元)'.split() 29 | need_to_show = u'双色球 七乐彩 大乐透 七星彩'.split() 30 | 31 | def __init__(self, lottery_url): 32 | self.url = lottery_url 33 | self.html_content = requests_get(self.url).text 34 | 35 | #: pyquery object 36 | d = pq(self.html_content) 37 | self._rows = d('table.kj_tab tr') 38 | 39 | def __repr__(self): 40 | return ''.format(self.url) 41 | 42 | @property 43 | def lotteries(self): 44 | """用于生成所有彩种最近开奖信息""" 45 | for idx, row in enumerate(self._rows): 46 | i = pq(row) 47 | cz = i('td:eq(0)').text().strip() 48 | if cz in self.need_to_show: 49 | qh = i('td:eq(1)').text().strip() 50 | kjsj = i('td:eq(2)').text().strip() 51 | hm_r = colored.red(i('td:eq(3) span.ball_1').text().strip()) 52 | hm_g = colored.green(i('td:eq(3) span.ball_2').text().strip()) 53 | kjhm = ' '.join([hm_r, hm_g]) 54 | jcgc = i('td:eq(4)').text().strip() 55 | 56 | lottery = [idx, cz, qh, kjsj, kjhm, jcgc] 57 | yield lottery 58 | 59 | def _get_lottery_detail_by_id(self, id): 60 | """ 61 | 相应彩种历史信息生成 62 | 百度详细信息页有两种结构,需要分开处理 63 | """ 64 | header = '编号 期号 开奖日期 开奖号码'.split() 65 | pt = PrettyTable() 66 | pt._set_field_names(header) 67 | 68 | url = QUERY_DETAIL_URL.format(id=id) 69 | import requests 70 | content = requests.get(url).text 71 | d = pq(content) 72 | if d('table.historylist'): 73 | # 输出彩种 74 | info = d('div.historyHd1 h2').text() 75 | print(info) 76 | # 输出table 77 | rows = d('table.historylist>tbody>tr') 78 | for idx, row in enumerate(rows): 79 | i = pq(row) 80 | qh = i('td:eq(0)').text().strip() 81 | kjrq = i('td:eq(1)').text().strip() 82 | hm_r = colored.red(i('td:eq(2) td.redBalls').text().strip()) 83 | hm_g = colored.green(i('td:eq(2) td.blueBalls').text().strip()) 84 | kjhm = ' '.join([hm_r, hm_g]) 85 | item = [idx + 1, qh, kjrq, kjhm] 86 | pt.add_row(item) 87 | print(pt) 88 | elif d('table#draw_list'): 89 | # 输出彩种 90 | info = d('div.cpinfo>div.title').text() 91 | print(info) 92 | # 输出table 93 | rows = d('table#draw_list>tbody>tr') 94 | for idx, row in enumerate(rows): 95 | i = pq(row) 96 | qh = i('td.td2').text().strip() 97 | kjrq = i('td.td1').text().strip() 98 | hm_r = colored.red(i('td.td3 span.ball_1').text().strip()) 99 | hm_g = colored.green(i('td.td3 span.ball_2').text().strip()) 100 | kjhm = ' '.join([hm_r, hm_g]) 101 | item = [idx + 1, qh, kjrq, kjhm] 102 | pt.add_row(item) 103 | print(pt) 104 | else: 105 | print('请联系作者') 106 | 107 | def get_lottery_detail(self, num): 108 | item = self._rows[num] 109 | i = pq(item) 110 | cz = i('td:eq(0)').text().strip() 111 | if cz in self.need_to_show: 112 | url = i('td:eq(0)>a').attr('href').strip() 113 | lottery_id = int(url.split('/')[-1]) 114 | self._get_lottery_detail_by_id(lottery_id) 115 | else: 116 | print('Invalid number.请按编号栏输入编号') 117 | 118 | def pretty_print(self): 119 | pt = PrettyTable() 120 | pt._set_field_names(self.header) 121 | # align left 122 | pt.align["开奖号码"] = "l" 123 | pt.align["奖池滚存(元)"] = "l" 124 | for item in self.lotteries: 125 | pt.add_row(item) 126 | print(pt) 127 | 128 | print('输入编号获取相应彩种往期中奖号码:') 129 | while True: 130 | raw = input('>> ') 131 | if raw in ('q', 'quit'): 132 | exit() 133 | try: 134 | num = int(raw) 135 | except ValueError: 136 | print('Invalid number.请按编号栏输入编号') 137 | continue 138 | 139 | if (num - 1) in range(len(self._rows)): 140 | self.get_lottery_detail(num) 141 | else: 142 | print('Invalid number.') 143 | 144 | 145 | def query(): 146 | """Query lottery infomation from baidu lecai.""" 147 | 148 | return LotteryPage(QUERY_URL) 149 | -------------------------------------------------------------------------------- /iquery/lyrics.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.lyrics 5 | ~~~~~~~~~~~~~ 6 | 7 | Lyric query from `http://www.xiami.com`. 8 | """ 9 | 10 | import re 11 | import pyquery 12 | from pyquery import PyQuery 13 | from prettytable import PrettyTable 14 | from .utils import colored, requests_get, exit_after_echo 15 | 16 | 17 | __all__ = ['query'] 18 | 19 | SONG_SEARCH_URL = 'http://www.xiami.com/search?key={}' 20 | # ERR MSG 21 | SONG_NOT_FOUND = 'Sorry, song not found.' 22 | 23 | 24 | class SongPage(object): 25 | 26 | """The query song's page on xiami. """ 27 | 28 | def __init__(self, song_url): 29 | self.url = song_url 30 | self.html_content = requests_get(self.url).text 31 | 32 | #: pyquery object 33 | self._d = PyQuery(self.html_content) 34 | 35 | def __repr__(self): 36 | return ''.format(self.url) 37 | 38 | @property 39 | def song_infos(self): 40 | # TODO: 41 | pass 42 | 43 | @property 44 | def lyric(self): 45 | raw = self._d('.lrc_main').html() 46 | if raw: 47 | lyric = raw.strip().replace('
', '') \ 48 | .replace(' ', '\n') \ 49 | .replace('\n\n', '\n') 50 | else: 51 | exit_after_echo(SONG_NOT_FOUND) 52 | return lyric 53 | 54 | def pretty_print(self): 55 | print('\n' + self.lyric) 56 | 57 | 58 | def query(song_name): 59 | """CLI: 60 | 61 | $ iquery -l song_name 62 | """ 63 | r = requests_get(SONG_SEARCH_URL.format(song_name)) 64 | 65 | try: 66 | # Get the first result. 67 | song_url = re.search(r'(http://www.xiami.com/song/\d+)', r.text).group(0) 68 | except AttributeError: 69 | exit_after_echo(SONG_NOT_FOUND) 70 | 71 | return SongPage(song_url) 72 | -------------------------------------------------------------------------------- /iquery/movies.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.movies 5 | ~~~~~~~~~~~~~~ 6 | 7 | Movies query and display. The datas come 8 | from: 9 | m.douban.com/movie 10 | """ 11 | 12 | import re 13 | import textwrap 14 | from bs4 import BeautifulSoup 15 | from prettytable import PrettyTable 16 | from .utils import colored, requests_get, exit_after_echo 17 | 18 | 19 | __all__ = ['query'] 20 | 21 | QUERY_URL = ('https://frodo.douban.com/jsonp/' 22 | 'subject_collection/movie_showing/items') 23 | 24 | 25 | class MoviesCollection(object): 26 | 27 | """Docstring for HotAndComingMovies. """ 28 | 29 | header = '编号 电影名称+上映日期 导演+主演+类型 豆瓣评分'.split() 30 | 31 | def __init__(self, rows): 32 | self._rows = rows 33 | 34 | def __len__(self): 35 | return len(self._rows) 36 | 37 | @property 38 | def movies(self): 39 | for idx, row in enumerate(self._rows): 40 | rating = row.get('rating') 41 | # douban score 42 | score = '{:.1f}'.format(rating.get('value')) if rating else '暂无' 43 | infos = row['info'].split('/') 44 | if re.match('\d', infos[-1]): 45 | time = infos[-1:] 46 | infos = '/'.join(infos[:-1]) 47 | else: 48 | time = infos[-2:] 49 | infos = '/'.join(infos[:-2]) 50 | m = [ 51 | idx + 1, 52 | '\n'.join([ 53 | colored.green(row['title']), 54 | colored.red(time[0][:10]), 55 | ]), 56 | infos, 57 | score 58 | ] 59 | yield m 60 | 61 | def _get_movie_summary(self, num): 62 | url = self._rows[num - 1].get('url') 63 | r = requests_get(url) 64 | soup = BeautifulSoup(r.text, 'html.parser') 65 | s = re.sub(r'\s+', '', soup.find(property="v:summary").text) 66 | print(textwrap.fill(colored.green(s), 40, initial_indent='')) 67 | 68 | def pretty_print(self): 69 | 70 | pt = PrettyTable() 71 | pt._set_field_names(self.header) 72 | for m in self.movies: 73 | pt.add_row(m) 74 | print(pt) 75 | 76 | print('输入编号获取剧情简介:') 77 | while True: 78 | raw = input('>> ') 79 | if raw in ('q', 'quit'): 80 | exit() 81 | try: 82 | num = int(raw) 83 | except ValueError: 84 | print('Invalid number.') 85 | continue 86 | 87 | if (num - 1) in range(len(self)): 88 | self._get_movie_summary(num) 89 | else: 90 | print('Invalid number.') 91 | 92 | 93 | def query(): 94 | """Query hot movies infomation from douban.""" 95 | 96 | r = requests_get(QUERY_URL) 97 | 98 | try: 99 | rows = r.json()['subject_collection_items'] 100 | except (IndexError, TypeError): 101 | rows = [] 102 | 103 | return MoviesCollection(rows) 104 | -------------------------------------------------------------------------------- /iquery/showes.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.showes 5 | ~~~~~~~~~~~~~~ 6 | 7 | Show tickets query and display. The datas come 8 | from: 9 | www.damain.cn 10 | """ 11 | 12 | import os 13 | import re 14 | from bs4 import BeautifulSoup 15 | from prettytable import PrettyTable 16 | from datetime import datetime, timedelta 17 | from .utils import colored, requests_get, exit_after_echo 18 | 19 | 20 | __all__ = ['is_show_type', 'query'] 21 | 22 | SHOWES_QUERY_URL = 'http://www.damai.cn/projectlist.do' 23 | 24 | # ERR MSG 25 | QUERY_DAYS_INVALID = 'Invalid days.' 26 | CITY_NOT_FOUND = 'Sorry, your city is not supported.' 27 | SHOW_NOT_FOUND = 'No result.' 28 | 29 | # All supported show types and its query params. 30 | SHOW_TYPES = { 31 | '演唱会': {'mcid': 1, 'ccid': ''}, 32 | '音乐会': {'mcid': 2, 'ccid': ''}, 33 | '音乐剧': {'mcid': 3, 'ccid': 22}, 34 | '儿童剧': {'mcid': 3, 'ccid': 23}, 35 | '歌舞剧': {'mcid': 3, 'ccid': 21}, 36 | '话剧': {'mcid': 3, 'ccid': 19}, 37 | '歌剧': {'mcid': 3, 'ccid': 20}, 38 | '舞蹈': {'mcid': 4, 'ccid': ''}, 39 | '相声': {'mcid': 5, 'ccid': 27}, 40 | '魔术': {'mcid': 5, 'ccid': 28}, 41 | '马戏': {'mcid': 5, 'ccid': 29}, 42 | '杂技': {'mcid': 5, 'ccid': 30}, 43 | '戏曲': {'mcid': 5, 'ccid': 31}, 44 | '比赛': {'mcid': 6, 'ccid': ''} 45 | } 46 | 47 | 48 | is_show_type = frozenset(SHOW_TYPES.keys()).__contains__ 49 | 50 | 51 | class ShowesCollection(object): 52 | 53 | """A set of showes from a query.""" 54 | 55 | #: The header of every column 56 | headers = '主题 票价 场馆 '.split() 57 | 58 | def __init__(self, rows): 59 | self._rows = rows 60 | 61 | def __repr__(self): 62 | return ''.format(len(self)) 63 | 64 | def __len__(self): 65 | return len(self._rows) 66 | 67 | def pretty_print(self): 68 | pt = PrettyTable() 69 | if len(self) == 0: 70 | pt._set_field_names(['Sorry,']) 71 | pt.add_row([SHOW_NOT_FOUND]) 72 | else: 73 | pt._set_field_names(self.headers) 74 | for row in self._rows: 75 | pt.add_row(row) 76 | print(pt) 77 | 78 | 79 | class ShowTicketsQuery(object): 80 | 81 | """Perform a show query.""" 82 | 83 | def __init__(self, city, show_type, days=15): 84 | self.city = city 85 | self.show_type = show_type 86 | self.days = days 87 | 88 | def __repr__(self): 89 | return ''.format( 90 | self._city, self._type, self._days 91 | ) 92 | 93 | @property 94 | def cities(self): 95 | filepath = os.path.join( 96 | os.path.dirname(__file__), 97 | 'datas', 'cities.dat' 98 | ) 99 | d = {} 100 | with open(filepath, 'r', encoding='utf-8') as f: 101 | for line in f.readlines(): 102 | name, number = line.split() 103 | d.setdefault(name, int(number)) 104 | return d 105 | 106 | @property 107 | def _city_id(self): 108 | ci = self.cities.get(self.city) 109 | if not ci: 110 | exit_after_echo(CITY_NOT_FOUND) 111 | return ci 112 | 113 | @property 114 | def _show_type(self): 115 | st = SHOW_TYPES.get(self.show_type) 116 | if not st: 117 | exit_after_echo(SHOW_NOT_FOUND) 118 | return st 119 | 120 | @property 121 | def date_range(self): 122 | """Generate date range according to the `days` user input.""" 123 | try: 124 | days = int(self.days) 125 | except ValueError: 126 | exit_after_echo(QUERY_DAYS_INVALID) 127 | 128 | if days < 1: 129 | exit_after_echo(QUERY_DAYS_INVALID) 130 | start = datetime.today() 131 | end = start + timedelta(days=days) 132 | return ( 133 | datetime.strftime(start, '%Y-%m-%d'), 134 | datetime.strftime(end, '%Y-%m-%d') 135 | ) 136 | 137 | def _build_params(self): 138 | start, end = self.date_range 139 | return dict( 140 | cityID=self._city_id, isText=1, 141 | pageIndex=1, startDate=start, 142 | endDate=end, order=2, 143 | **self._show_type 144 | ) 145 | 146 | def parse(self, items): 147 | """Parse `主题`, `时间`, `场馆`, 票价` in every item.""" 148 | rows = [] 149 | for i, item in enumerate(items): 150 | theme = colored.green(item.find(class_='ico').a.text.strip()) 151 | text = item.find(class_='mt10').text.strip() 152 | mix = re.sub('\s+', ' ', text).split(':') 153 | time = mix[1][:-3] 154 | place = mix[2][:-7] 155 | # display time below theme 156 | theme_time = '\n'.join([theme, colored.red(time)]) 157 | price = item.find(class_='price-sort').text.strip() 158 | rows.append([theme_time, price, place]) 159 | return rows 160 | 161 | def query(self): 162 | params = self._build_params() 163 | rows = [] 164 | 165 | while True: 166 | r = requests_get(SHOWES_QUERY_URL, params=params) 167 | soup = BeautifulSoup(r.text, 'html.parser') 168 | 169 | items = soup.find_all(class_='ri-infos') 170 | if not items: 171 | return ShowesCollection(rows) 172 | 173 | rows += self.parse(items) 174 | params['pageIndex'] += 1 175 | 176 | 177 | def query(params): 178 | """`params` is a list, contains `city`, 'show_type`, `days`.""" 179 | 180 | return ShowTicketsQuery(*params).query() 181 | -------------------------------------------------------------------------------- /iquery/trains.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.trains 5 | ~~~~~~~~~~~~~~ 6 | 7 | Train tickets query and display. The datas come 8 | from: 9 | www.12306.cn 10 | """ 11 | 12 | import os 13 | import re 14 | import tempfile 15 | try: 16 | import cPickle as pickle 17 | except ImportError: 18 | import pickle 19 | from datetime import datetime 20 | from collections import OrderedDict 21 | from prettytable import PrettyTable 22 | from .utils import colored, requests_get, exit_after_echo 23 | 24 | 25 | __all__ = ['query'] 26 | 27 | QUERY_URL = 'https://kyfw.12306.cn/otn/lcxxcx/query' 28 | # ERR 29 | FROM_STATION_NOT_FOUND = 'From station not found.' 30 | TO_STATION_NOT_FOUND = 'To station not found.' 31 | INVALID_DATE = 'Invalid query date.' 32 | TRAIN_NOT_FOUND = 'No result.' 33 | NO_RESPONSE = 'Sorry, server is not responding.' 34 | 35 | 36 | class TrainsCollection(object): 37 | 38 | """A set of raw datas from a query.""" 39 | 40 | headers = '车次 车站 时间 历时 商务 一等 二等 软卧 硬卧 软座 硬座 无座'.split() 41 | 42 | def __init__(self, rows, opts): 43 | self._rows = rows 44 | self._opts = opts 45 | 46 | def __repr__(self): 47 | return ''.format(len(self)) 48 | 49 | def __len__(self): 50 | return len(self._rows) 51 | 52 | def _get_duration(self, row): 53 | duration = row.get('lishi').replace(':', '小时') + '分钟' 54 | # take 0 hour , only show minites 55 | if duration.startswith('00'): 56 | return duration[4:] 57 | # take <10 hours, show 1 bit 58 | if duration.startswith('0'): 59 | return duration[1:] 60 | return duration 61 | 62 | @property 63 | def trains(self): 64 | """Filter rows according to `headers`""" 65 | for row in self._rows: 66 | train_no = row.get('station_train_code') 67 | initial = train_no[0].lower() 68 | if not self._opts or initial in self._opts: 69 | train = [ 70 | # Column: '车次' 71 | train_no, 72 | # Column: '车站' 73 | '\n'.join([ 74 | colored.green(row.get('from_station_name')), 75 | colored.red(row.get('to_station_name')), 76 | ]), 77 | # Column: '时间' 78 | '\n'.join([ 79 | colored.green(row.get('start_time')), 80 | colored.red(row.get('arrive_time')), 81 | ]), 82 | # Column: '历时' 83 | self._get_duration(row), 84 | # Column: '商务' 85 | row.get('swz_num'), 86 | # Column: '一等' 87 | row.get('zy_num'), 88 | # Column: '二等' 89 | row.get('ze_num'), 90 | # Column: '软卧' 91 | row.get('rw_num'), 92 | # Column: '硬卧' 93 | row.get('yw_num'), 94 | # Column: '软座' 95 | row.get('rz_num'), 96 | # Column: '硬座' 97 | row.get('yz_num'), 98 | # Column: '无座' 99 | row.get('wz_num') 100 | ] 101 | yield train 102 | 103 | def pretty_print(self): 104 | """Use `PrettyTable` to perform formatted outprint.""" 105 | pt = PrettyTable() 106 | if len(self) == 0: 107 | pt._set_field_names(['Sorry,']) 108 | pt.add_row([TRAIN_NOT_FOUND]) 109 | else: 110 | pt._set_field_names(self.headers) 111 | for train in self.trains: 112 | pt.add_row(train) 113 | print(pt) 114 | 115 | 116 | class TrainTicketsQuery(object): 117 | 118 | """Docstring for TrainTicketsCollection. """ 119 | 120 | def __init__(self, from_station, to_station, date, opts=None): 121 | 122 | self.from_station = from_station 123 | self.to_station = to_station 124 | self.date = date 125 | self.opts = opts 126 | 127 | def __repr__(self): 128 | return 'TrainTicketsQuery from={} to={} date={}'.format( 129 | self._from_station, self._to_station, self._date 130 | ) 131 | 132 | @property 133 | def stations(self): 134 | filename = 'iquery.stations.cache' 135 | _cache_file = os.environ.get( 136 | 'IQUERY_STATIONS_CACHE', 137 | os.path.join(tempfile.gettempdir(), filename) 138 | ) 139 | 140 | if os.path.exists(_cache_file): 141 | try: 142 | with open(_cache_file, 'rb') as f: 143 | return pickle.load(f) 144 | except: 145 | pass 146 | 147 | filepath = os.path.join( 148 | os.path.dirname(__file__), 149 | 'datas', 'stations.dat' 150 | ) 151 | d = {} 152 | with open(filepath, 'r', encoding='utf-8') as f: 153 | for line in f.readlines(): 154 | name, telecode = line.split() 155 | d.setdefault(name, telecode) 156 | 157 | with open(_cache_file, 'wb') as f: 158 | pickle.dump(d, f) 159 | 160 | return d 161 | 162 | @property 163 | def _from_station_telecode(self): 164 | code = self.stations.get(self.from_station) 165 | if not code: 166 | exit_after_echo(FROM_STATION_NOT_FOUND) 167 | return code 168 | 169 | @property 170 | def _to_station_telecode(self): 171 | code = self.stations.get(self.to_station) 172 | if not code: 173 | exit_after_echo(TO_STATION_NOT_FOUND) 174 | return code 175 | 176 | @property 177 | def _valid_date(self): 178 | """Check and return a valid query date.""" 179 | date = self._parse_date(self.date) 180 | 181 | if not date: 182 | exit_after_echo(INVALID_DATE) 183 | 184 | try: 185 | date = datetime.strptime(date, '%Y%m%d') 186 | except ValueError: 187 | exit_after_echo(INVALID_DATE) 188 | 189 | # A valid query date should within 50 days. 190 | offset = date - datetime.today() 191 | if offset.days not in range(-1, 50): 192 | exit_after_echo(INVALID_DATE) 193 | 194 | return datetime.strftime(date, '%Y-%m-%d') 195 | 196 | @staticmethod 197 | def _parse_date(date): 198 | """Parse from the user input `date`. 199 | 200 | e.g. current year 2016: 201 | input 6-26, 626, ... return 2016626 202 | input 2016-6-26, 2016/6/26, ... retrun 2016626 203 | 204 | This fn wouldn't check the date, it only gather the number as a string. 205 | """ 206 | result = ''.join(re.findall('\d', date)) 207 | l = len(result) 208 | 209 | # User only input month and day, eg 6-1, 6.26, 0626... 210 | if l in (2, 3, 4): 211 | year = str(datetime.today().year) 212 | return year + result 213 | 214 | # User input full format date, eg 201661, 2016-6-26, 20160626... 215 | if l in (6, 7, 8): 216 | return result 217 | 218 | return '' 219 | 220 | def _build_params(self): 221 | """Have no idea why wrong params order can't get data. 222 | So, use `OrderedDict` here. 223 | """ 224 | d = OrderedDict() 225 | d['purpose_codes'] = 'ADULT' 226 | d['queryDate'] = self._valid_date 227 | d['from_station'] = self._from_station_telecode 228 | d['to_station'] = self._to_station_telecode 229 | return d 230 | 231 | def query(self): 232 | 233 | params = self._build_params() 234 | 235 | r = requests_get(QUERY_URL, params=params, verify=False) 236 | 237 | try: 238 | rows = r.json()['data']['datas'] 239 | except KeyError: 240 | rows = [] 241 | except TypeError: 242 | exit_after_echo(NO_RESPONSE) 243 | 244 | return TrainsCollection(rows, self.opts) 245 | 246 | 247 | def query(params): 248 | """`params` is a list, contains `from`, `to`, `date`.""" 249 | 250 | return TrainTicketsQuery(*params).query() 251 | -------------------------------------------------------------------------------- /iquery/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | """ 4 | iquery.utils 5 | ~~~~~~~~~~~~~ 6 | 7 | A simple args parser and a color wrapper. 8 | """ 9 | 10 | import sys 11 | import random 12 | import requests 13 | from requests.exceptions import ConnectionError, Timeout 14 | 15 | 16 | __all__ = ['args', 'colored', 'requests_get', 'exit_after_echo'] 17 | 18 | 19 | def exit_after_echo(msg, color='red'): 20 | if color == 'red': 21 | print(colored.red(msg)) 22 | else: 23 | print(msg) 24 | exit(1) 25 | 26 | 27 | def requests_get(url, **kwargs): 28 | USER_AGENTS = ( 29 | 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0', 30 | 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100 101 Firefox/22.0', 31 | 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0', 32 | ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) ' 33 | 'Chrome/19.0.1084.46 Safari/536.5'), 34 | ('Mozilla/5.0 (Windows; Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46' 35 | 'Safari/536.5') 36 | ) 37 | try: 38 | r = requests.get( 39 | url, 40 | timeout=12, 41 | headers={'User-Agent': random.choice(USER_AGENTS)}, **kwargs 42 | ) 43 | except ConnectionError: 44 | exit_after_echo('Network connection failed.') 45 | except Timeout: 46 | exit_after_echo('timeout.') 47 | return r 48 | 49 | 50 | class Args(object): 51 | 52 | """A simple customed args parser for `iquery`.""" 53 | 54 | def __init__(self, args=None): 55 | self._args = sys.argv[1:] 56 | self._argc = len(self) 57 | 58 | def __repr__(self): 59 | return ''.format(repr(self._args)) 60 | 61 | def __len__(self): 62 | return len(self._args) 63 | 64 | @property 65 | def all(self): 66 | return self._args 67 | 68 | def get(self, idx): 69 | try: 70 | return self.all[idx] 71 | except IndexError: 72 | return None 73 | 74 | @property 75 | def is_null(self): 76 | return self._argc == 0 77 | 78 | @property 79 | def options(self): 80 | """Train tickets query options.""" 81 | arg = self.get(0) 82 | if arg.startswith('-') and not self.is_asking_for_help: 83 | return arg[1:] 84 | return ''.join(x for x in arg if x in 'dgktz') 85 | 86 | def contain_show_type(self): 87 | arg = self.get(2) 88 | if is_show_type(arg): 89 | return arg 90 | return None 91 | 92 | @property 93 | def is_asking_for_help(self): 94 | arg = self.get(0) 95 | if arg in ('-h', '--help'): 96 | return True 97 | return False 98 | 99 | @property 100 | def is_querying_show(self): 101 | from .showes import is_show_type 102 | arg = self.get(1) 103 | if self._argc not in (2, 3): 104 | return False 105 | if is_show_type(arg): 106 | return True 107 | return False 108 | 109 | @property 110 | def is_querying_train(self): 111 | if self._argc not in (3, 4): 112 | return False 113 | if self.is_querying_show: 114 | return False 115 | if self._argc == 4: 116 | arg = self.get(0) 117 | if not arg.startswith('-'): 118 | return False 119 | if arg[1] not in 'dgktz': 120 | return False 121 | return True 122 | 123 | @property 124 | def is_querying_lottery(self): 125 | arg = self.get(0) 126 | if arg in ('-c', '彩票'): 127 | return True 128 | return False 129 | 130 | @property 131 | def is_querying_movie(self): 132 | arg = self.get(0) 133 | if arg in ('-m', '电影'): 134 | return True 135 | return False 136 | 137 | @property 138 | def is_querying_lyric(self): 139 | arg = self.get(0) 140 | if arg == '-l': 141 | return True 142 | return False 143 | 144 | @property 145 | def is_querying_putian_hospital(self): 146 | return self.get(0) == '-p' and self._argc in (2, 3) 147 | 148 | @property 149 | def as_train_query_params(self): 150 | opts = self.options 151 | if opts: 152 | # apped valid options to end of list 153 | return self._args[1:] + [opts] 154 | return self._args 155 | 156 | @property 157 | def as_show_query_params(self): 158 | return self._args 159 | 160 | @property 161 | def as_hospital_query_params(self): 162 | return self._args[1:] 163 | 164 | @property 165 | def as_lyric_query_params(self): 166 | return '+'.join(self._args[1:]) 167 | 168 | 169 | class Colored(object): 170 | 171 | """Keep it simple, only use `red` and `green` color.""" 172 | 173 | RED = '\033[91m' 174 | GREEN = '\033[92m' 175 | 176 | #: no color 177 | RESET = '\033[0m' 178 | 179 | def color_str(self, color, s): 180 | return '{}{}{}'.format( 181 | getattr(self, color), 182 | s, 183 | self.RESET 184 | ) 185 | 186 | def red(self, s): 187 | return self.color_str('RED', s) 188 | 189 | def green(self, s): 190 | return self.color_str('GREEN', s) 191 | 192 | 193 | args = Args() 194 | colored = Colored() 195 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from iquery.core import cli 4 | 5 | 6 | if __name__ == '__main__': 7 | cli() 8 | -------------------------------------------------------------------------------- /screenshot/iquery.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/protream/iquery/7272e68af610f1dd63cf695209cfa44b75adc0e6/screenshot/iquery.gif -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from codecs import open 4 | from iquery import __version__ 5 | from setuptools import setup 6 | 7 | 8 | def read(f): 9 | return open(f, encoding='utf-8').read() 10 | 11 | 12 | setup( 13 | name='iquery', 14 | version=__version__, 15 | description='Various information query via command line.', 16 | long_description=read('README.rst') + '\n\n' + read('HISTORY.rst'), 17 | author='protream', 18 | author_email='protream@gmail.com', 19 | url='https://github.com/protream/iquery', 20 | packages=[ 21 | 'iquery' 22 | ], 23 | py_modules=['run'], 24 | include_package_data=True, 25 | platforms='any', 26 | install_requires=[ 27 | 'prettytable', 28 | 'requests', 29 | 'bs4', 30 | 'pyquery', 31 | ], 32 | entry_points={ 33 | 'console_scripts': ['iquery=run:cli'] 34 | }, 35 | license='MIT', 36 | zip_safe=False, 37 | classifiers=[ 38 | 'Environment :: Console', 39 | 'Programming Language :: Python', 40 | 'Programming Language :: Python :: 3', 41 | 'Programming Language :: Python :: 3.1', 42 | 'Programming Language :: Python :: 3.2', 43 | 'Programming Language :: Python :: 3.3', 44 | 'Programming Language :: Python :: 3.4', 45 | 'Programming Language :: Python :: 3.5', 46 | 'Programming Language :: Python :: Implementation :: CPython' 47 | ] 48 | ) 49 | -------------------------------------------------------------------------------- /test_iquery.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """Tests for iqeury.""" 4 | 5 | import os 6 | import unittest 7 | 8 | 9 | class TicketsTestCase(unittest.TestCase): 10 | pass 11 | --------------------------------------------------------------------------------