java根据IP获取当前区域天气信息

大致思路是客户端发起请求,我们首先根据请求获取到外网IP,然后再根据外网IP获取到用户所在城市,最后根据城市获取到天气信息

获取外网IP

万网获取外网IP地址: http://www.net.cn/static/customercare/yourip.asp

/*** @Description:获取客户端外网ip 此方法要接入互联网才行,内网不行**/
public static String getPublicIp() {try {String path = "http://www.net.cn/static/customercare/yourip.asp";// 要获得html页面内容的地址(万网)URL url = new URL(path);// 创建url对象HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 打开连接conn.setRequestProperty("contentType", "GBK"); // 设置url中文参数编码conn.setConnectTimeout(5 * 1000);// 请求的时间conn.setRequestMethod("GET");// 请求方式InputStream inStream = conn.getInputStream();// readLesoSysXML(inStream);BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "GBK"));StringBuilder buffer = new StringBuilder();String line;// 读取获取到内容的最后一行,写入while ((line = in.readLine()) != null) {buffer.append(line);}List<String> ips = new ArrayList<>();//用正则表达式提取String字符串中的IP地址String regEx="((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)";String str = buffer.toString();Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str);while (m.find()) {String result = m.group();ips.add(result);}// 返回公网IP值return ips.get(0);} catch (Exception e) {System.out.println("获取公网IP连接超时");return "";}
}

根据外网IP获取用户所在城市

首先你待需要一个ip2region.db文件,大家可以百度一下,我在这里整理了一份放在网盘上了,有需要的可以下载一下

链接:https://pan.baidu.com/s/1cR5VSzWEXjL5olOOjJBL6g
提取码:asdn

ip2region
准确率99.9%的ip地址定位库,0.0x毫秒级查询,数据库文件大小只有1.5M,提供了java,php,c,python,nodejs,golang查询绑定和Binary,B树,内存三种查询算法

下载地址:https://download.csdn.net/download/asn4513/20629211?spm=1001.2014.3001.5501

引入ip2region.db

maven依赖

<!--ip2region-->
<dependency><groupId>org.lionsoul</groupId><artifactId>ip2region</artifactId><version>1.7.2</version>
</dependency>

创建IPUtils工具类

@Log4j2
public class IPUtils {/*** 根据IP获取地址** @return 国家|区域|省份|城市|ISP*/public static String getAddress(String ip) {return getAddress(ip, DbSearcher.BTREE_ALGORITHM);}/*** 根据IP获取地址** @param ip* @param algorithm 查询算法* @return 国家|区域|省份|城市|ISP* @see DbSearcher* DbSearcher.BTREE_ALGORITHM; //B-tree* DbSearcher.BINARY_ALGORITHM //Binary* DbSearcher.MEMORY_ALGORITYM //Memory*/@SneakyThrowspublic static String getAddress(String ip, int algorithm) {if (!Util.isIpAddress(ip)) {log.error("错误格式的ip地址: {}", ip);return "";}String dbPath = IPUtils.class.getResource("/db/ip2region.db").getPath();File file = new File(dbPath);if (!file.exists()) {log.error("地址库文件不存在");return "";}DbSearcher searcher = new DbSearcher(new DbConfig(), dbPath);DataBlock dataBlock;switch (algorithm) {case DbSearcher.BTREE_ALGORITHM:dataBlock = searcher.btreeSearch(ip);break;case DbSearcher.BINARY_ALGORITHM:dataBlock = searcher.binarySearch(ip);break;case DbSearcher.MEMORY_ALGORITYM:dataBlock = searcher.memorySearch(ip);break;default:log.error("未传入正确的查询算法");return "";}searcher.close();return dataBlock.getRegion();}

根据城市获取天气信息

第三方天气接口:http://portalweather.comsys.net.cn/weather03/api/weatherService/getDailyWeather?cityName=

调用第三方天气接口获取天气信息,本文使用java自带工具类HttpUtils

@GetMapping("/weather")
@DecryptBody(encode = true) //响应加密
public Result getWeather(){String publicIp = GetIPUtils.getPublicIp();//获取外网IPif (StringUtils.isBlank(publicIp)) return ResultUtils.error("获取失败");String cityInfo = IPUtils.getAddress(publicIp);//国家|区域|省份|城市|ISPif (StringUtils.isBlank(cityInfo)) return ResultUtils.error("获取失败");String[] split = cityInfo.split("\|");String city = "";for (String aSplit : split) if (aSplit.contains("市")) city = aSplit;//拿取市级名称if (StringUtils.isBlank(city)) return ResultUtils.error("获取失败");String weatherInformation = HttpUtil.get("http://portalweather.comsys.net.cn/weather03/api/weatherService/getDailyWeather?cityName="+ city);//调用天气接口if (StringUtils.isBlank(weatherInformation)) return ResultUtils.error("获取失败");Object o = ObjectMapperUtils.strToObj(weatherInformation,Object.class);return ResultUtils.success("获取成功",o);
}

java根据IP获取当前区域天气信息相关推荐

  1. 用百度SDK获取地理位置和天气信息

    以下实现通过百度SDK获取地理位置和天气信息,请參考百度开发文档 1. 在相关下载最新的库文件.将so文件的压缩文件解压出来,把相应架构下的so文件放入开发人员自己APP的相应架构下的目录中,建议所有 ...

  2. Java基础:获取操作系统及浏览器信息

    Java基础:获取操作系统及浏览器信息 前言 今天博主将为大家分享Java基础:获取操作系统及浏览器信息,不喜勿喷,如有异议欢迎讨论! 有一个强大的地基才能写出健壮的程序! User Agent的含义 ...

  3. java解析pdf获取pdf中内容信息

    java解析pdf获取pdf中内容信息 今日项目中需要将pdf中的数据获取到进行校验数据,于是前往百度翻来覆去找到以下几种办法,做个笔记,方便日后查询. 废话不多说,我要直接上代码装逼了 第一种 使用 ...

  4. Python matplotlib获取openweather API天气信息,制作可视化图表和天气仪表盘

    使用Python matplotlib获取openweather API天气信息,制作可视化图表和天气仪表盘. Openweather网站:Сurrent weather and forecast - ...

  5. Java 通过 ip 获取所属城市信息

    文章目录 1 摘要 2 核心 Maven 依赖 3 离线数据 db 保存 4 核心代码 5 测试 6 推荐参考资料 1 摘要 在实际项目中可能会用到统计用户地理位置的需求,这时可以通过客户端的 ip ...

  6. java 根据ip获取mac地址_利用java如何根据IP获取mac地址

    利用java如何根据IP获取mac地址 发布时间:2020-11-25 15:49:42 来源:亿速云 阅读:74 作者:Leah 利用java如何根据IP获取mac地址?针对这个问题,这篇文章详细介 ...

  7. java 根据ip获取mac地址,java服务器端根据ip获取客户端mac地址

    java服务器端根据ip获取客户端mac地址 2014/8/20 22:01:29  475900947  程序员俱乐部  我要评论(1) 摘要://判断系统publicStringcheckSys( ...

  8. Java 根据IP获取城市(ip2region)

    简介: 1.疫情期间,大家注意防护哈 2.今天看到了抖音和快手的新功能,可以看到IP属性,于是灵感立马闪现,出于好奇就打开电脑埋头苦研,去查各种资料. Ip2region是什么? ip2region ...

  9. JAVA通过ip获取所在地址与经纬度

    ip,经纬度,taobao和百度api获取地址的方法 import java.io.BufferedReader; import java.io.DataOutputStream; import ja ...

最新文章

  1. java 自定义http头_HttpClient自定义HTTP头
  2. getopt()简介
  3. Linux 文件系统之 inode 概述
  4. 复赛今日启动,双赛道百支队伍上演算法精英对决
  5. Mount 挂载错误mount:block device /dev/sr0 is write – protected , mounting read-only
  6. mac mysql php_Mac下搭建PHP开发环境(Apache+PHP+MySQL+phpMyAdmin)
  7. H265框架编码流程(一)
  8. 练习项目--cookie数据脱敏
  9. 定了!这 35 所高校将设人工智能本科专业!
  10. java编写a b直接的偶数之和_java中如何 输入一个大于 6 的偶数n,如何把这个偶数拆分为a和b,并满足n=a+b。...
  11. Altium_Protel99SE的使用
  12. vscode 脑图插件mindmap
  13. ssh允许root账号登陆
  14. X11 Wayland 及 Mir 比较
  15. 计算机windows无效映像,应用程序或dll 为无效的windows映像怎么办
  16. 【JavaScript】数据类型
  17. 转豆瓣--梁海棠虽然死了,但却占据了陈少杰的身心。乔燕虽然还…
  18. 三级分销软件开发技术分销系统模式
  19. 如何利用wireshark抓取手机包
  20. MyBatis 开发有bug找不到?多看看执行流程

热门文章

  1. 公司篮球赛比赛规则策划
  2. win10 我的世界java_Minecraft Win10测试版即将发布——再也不用装Java啦
  3. 【R】程序注释乱码怎么办
  4. 华为防火墙做单臂路由_防火墙做单臂路由实现VLAN间通信
  5. web项目答辩总结_web经典答辩题
  6. 如何快速提取所有文件的文件名?
  7. win10+centos8双系统的安装
  8. 结构化程序设计与面向对象程序设计
  9. C语言(递归)使用递归方法,求解X^n
  10. 嘀嗒顺风车就关于乘客遗失物品的处理方式发起网友讨论