java如何根据IP获取当前区域天气信息详解

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

获取外网IP

万网获取外网IP地址:www.net.cn/static/cust

/**
 * @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文件,大家可以百度一下,我在这里整理了一份放在网盘上了,有需要的可以下载一下

下载地址:点击这里

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

引入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
     */
    @SneakyThrows
    public 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();
    }

根据城市获取天气信息

第三方天气接口:portalweather.comsys.net.cn/weather03/a

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

@GetMapping("/weather")
@DecryptBody(encode = true) //响应加密
public Result getWeather(){
    String publicIp = GetIPUtils.getPublicIp();//获取外网IP
    if (StringUtils.isBlank(publicIp)) return ResultUtils.error("获取失败");
    String cityInfo = IPUtils.getAddress(publicIp);//国家|区域|省份|城市|ISP
    if (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获取当前区域天气信息的文章就介绍到这了,更多相关java获取当前区域天气信息内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 调用天气Webservice详解及实例代码

    Java调用天气Webservice的小应用 废话不多说,直接贴代码: CityReq.java package com.weather; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="getWeatherbyCityName",namespace="http://WebXml.com.cn/

  • java调用中国天气网api获得天气预报信息的方法

    本文实例讲述了java调用中国天气网api获得天气预报信息的方法.分享给大家供大家参考.具体实现方法如下: //以冰城哈尔滨为例通过中国天气api调用天气信息 private String getWeatherInfo2(){ StringBuilder info = new StringBuilder(); try { DefaultHttpClient httpclient = new DefaultHttpClient(); HttpGet httget = new HttpGet("ht

  • 用Java实现全国天气预报的api接口调用示例

    step1:选择本文所示例的接口"全国天气预报接口" 聚合数据url:http://www.juhe.cn/docs/api/id/39/aid/87 step2:每个接口都需要传入一个参数key,相当于用户的令牌,所以第一步你需要申请一个key. step3:学过java的同学们都知道,当我们对一个类或者方法不明白其意图和思想时,我们可以去查看文档,这里也不例外,而且对于英文不是特别好的同学来说很幸运的是,聚合网站上的文档都是中文版本的,比起阅读java源码里的英文文档应该轻松很多.

  • java如何根据IP获取当前区域天气信息详解

    大致思路是客户端发起请求,我们首先根据请求获取到外网IP,然后再根据外网IP获取到用户所在城市,最后根据城市获取到天气信息 获取外网IP 万网获取外网IP地址:www.net.cn/static/cust- /** * @Description:获取客户端外网ip 此方法要接入互联网才行,内网不行 **/ public static String getPublicIp() { try { String path = "http://www.net.cn/static/customercare/

  • Java如何获取属性的注释信息详解

    前言 注解是JavaSE5.0开始提供的一项新特性,利用此特性可以通过特定的注解标签为程序提供一些描述性信息.这些描述性信息可以在编译或运行时为编译器.运行环境提供附加的信息,从而简化开发.本文将详细介绍Java获取属性注释信息的相关内容,下面来一起看看详细的实现代码 实例代码 1.数据模型 package com.example.demo; import java.util.List; /** * Description: * * @author jack * @date 2021/7/13

  • Java中的IP地址和InetAddress类使用详解

    Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TCP/IP协议,它是Internet中各方所遵循的公共协议.TCP(Transport Control Protocol)是一种传输控制协议,IP(Internet Protocol)是一种网际协议,TCP/IP代表这两个协议的. TCP/IP分为四个层次: 网络接口层:负责接收和发送物理帧: 网络层

  • 使用java技术抓取网站上彩票双色球信息详解

    前言 现在很多web应用,做过web项目的童鞋都知道,web结果由html+js+css组成,html结构都有一定的规范,数据动态交互可以通过js实现. 有些时候,需要抓取某一个你感兴趣的网站信息,一个网站信息肯定是通过某一个url,发送http请求,根据地址定位的,当知道这个地址,可以获取到很多的网络响应,需要认真分析,找到你那一个合适的地址,最后通过这个地址返回一个html给你,我们可以得到这个html,分析结构,解析这个结构获取你要的数据.Html的结构解析往往是复杂繁琐的,我们可以使用j

  • java使用枚举封装错误码及错误信息详解

    目录 枚举封装错误码及错误信息 用法如下 封装返回结果类和枚举错误码 枚举错误码 封装返回结果类 枚举封装错误码及错误信息 使用枚举类型来封装project中所需要的错误码和错误信息,十分方便. 用法如下 package com.dear.simpler.dbservice; /** * * @author lixiang *使用枚举类型来封装异常码和异常信息 * */ public enum DBServiceError { //RPC层调用错误码 DB_SERVICE_OK(20100,"服

  • java根据本地IP获取mac地址的方法

    本文实例为大家分享了java根据本地IP获取mac地址的具体代码,供大家参考,具体内容如下 import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; public class MacAddress { /** * @param args * @throws UnknownHostExcep

  • Java基础教程之获取操作系统及浏览器信息

    目录 User Agent 的含义 浏览器的 UA 字串 UserAgentUtils.jar 通过(User-Agent)获取 浏览器类型,操作系统类型,手机机型 再给出一个: 总结 在生产环境下,我们需要关闭swagger配置,避免暴露接口的这种危险行为. User Agent 的含义 User Agent 中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等. 一些网站常常通过判

  • Java 获取泛型的类型实例详解

    Java 获取泛型的类型实例详解 Java 泛型实际上有很多缺陷,比如不能直接获取泛型的类型,不能获取带泛型类等. 以下方式是不正确的: ①.获取带泛型的类的类型 Class lstUClazz = List<User>.class ②获取局部变量泛型的类型 List<User> listUser = new ArrayList<User>(); Type genType = listUser.getClass().getClass().getGenericSuperc

  • Java 获取服务器环境的实例详解

    Java 获取服务器环境的实例详解 废话不多说,直接上代码,代码中的注释写的比较清楚,请大家好好看, package com.rapido.utils; import java.util.Properties; /** * 获取服务器环境信息 * @author X-rapido * */ public class SystemDataUtil { public static Properties getSystemProperties() { Properties props = System

  • C#获取本地IP的四种方式示例详解

    1.第一种方式 采用System.Net.Dns的GetHostAddress的方式,具体请看代码: /// <summary> /// 网络不通畅可以获取 /// 不过能获取到具体的IP /// </summary> /// <returns></returns> public static List<IPAddress> GetByGetHostAddresses() { try { IPAddress[] adds = Dns.GetHos

随机推荐