第三方免費開放API 獲取用戶IP 並查詢其地理位置

需求:有一個項目是微信公衆號,屬於汽車服務。當車主在填寫車主資料或者車輛認證時,需要填寫車牌號或者車架號;車牌號需要選擇省,爲了方便用戶操作,所以想自動定位默認省,如下圖:

我查詢了一些博客,找到了一些方法,經過測試,記錄一下還能用的。

 

方法一:搜狐API

有時候cname這個字段返回的不是省市,因爲在2/3/4G網絡時,定位失敗,但是IP還是可以用的,亦可以配合第二種方法使用。

 <!-- 獲取用戶IP以及位置信息、http&&https兼容-->

<script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>

<script>
// 打印returnCitySN : {"cip": "222.66.154.186", "cid": "310000", "cname": "上海市"};
  console.log(returnCitySN )
 
  let hcityIp = returnCitySN['cip'];
  let hxreturnCitySN = {cip:hcityIp,cname:returnCitySN['cname']};
  sessionStorage['hxreturnCitySN'] = JSON.stringify(hxreturnCitySN);
</script>

 

方法二:126API

// 126API

http://ip.ws.126.net/ipquery?ip=IP

// 返回結果:
var lo="上海市", lc="徐彙區"; var localAddress={city:"徐彙區", province:"上海市"}

缺點:返回格式有點問題,不是UTF-8格式,轉格式也失敗

其實,我發現不加IP,也是可以返回正常結果的。鑑於第一種方法搜狐API的cname有時候拿不到正確的省市值,(確保cname在省市裏面查不到,sessionStorage存儲的時候就存儲爲空)我把他們結合了一下使用,當cname拿不到正確值時,拿到IP用於126API使用,我用了ajax的get請求,但是不知爲何success情況下拿不到值,只能在error時才能拿到(如果有大佬知道,請告訴我一下,灰常感謝!!!),所以:

 error:function (err) {
   let hsStr = err.responseText;
   hsStr = hsStr.substring(hsStr.indexOf("{"), hsStr.indexOf("}")+1);
   hsStr = hsStr.substring(hsStr.indexOf("e")+3,hsStr.indexOf("}")-1)
   window.sessionStorage.setItem('hxProvince',hsStr);
 }

我在error裏操作了,因爲err.responseText結果返回格式是string,所以我截取了,拿到了

   // 20191227-Echo_hx-IP定位

 // 各省對應的簡稱
  hsimpleLicense:Array<any>= simpleLicense;
  hsimProvince:string='北京市';

  let hxProName = JSON.parse(sessionStorage['hxreturnCitySN']).cname;
  let hxProvince = sessionStorage['hxProvince'];
  let hsp = hxProName ? hxProName : hxProvince;

  this.hsimProvince = hsp ? hsp : '北京市'

  this.hsimpleLicense.forEach((val,index,arr)=>{
    if(this.hsimProvince.indexOf(val.fullLic)> -1){
       this.selectedLicense = val.simLic;
     }
   })

我還寫了一個數組,用於得到相對應的省市的簡稱,如下:

export const simpleLicense = [
  { fullLic:'北京市', simLic:'京' },
  { fullLic:'天津市', simLic:'津' },
  { fullLic:'河北省', simLic:'冀' },
  { fullLic:'山西省', simLic:'晉' },
  { fullLic:'內蒙古自治區', simLic:'蒙' },
  { fullLic:'遼寧省', simLic:'遼' },
  { fullLic:'吉林省', simLic:'吉' },
  { fullLic:'黑龍江省', simLic:'黑' },
  { fullLic:'上海市', simLic:'滬' },
  { fullLic:'江蘇省', simLic:'蘇' },
  { fullLic:'浙江省', simLic:'浙' },
  { fullLic:'安徽省', simLic:'皖' },
  { fullLic:'福建省', simLic:'閩' },
  { fullLic:'江西省', simLic:'贛' },
  { fullLic:'山東省', simLic:'魯' },
  { fullLic:'河南省', simLic:'豫' },
  { fullLic:'湖北省', simLic:'鄂' },
  { fullLic:'湖南省', simLic:'湘' },
  { fullLic:'廣東省', simLic:'粵' },
  { fullLic:'廣西壯族自治區', simLic:'桂' },
  { fullLic:'海南省', simLic:'瓊' },
  { fullLic:'重慶市', simLic:'渝' },
  { fullLic:'四川省', simLic:'川' },
  { fullLic:'貴州省', simLic:'貴' },
  { fullLic:'雲南省', simLic:'雲' },
  { fullLic:'西藏自治區', simLic:'藏' },
  { fullLic:'陝西省', simLic:'陝' },
  { fullLic:'甘肅省', simLic:'甘' },
  { fullLic:'青海省', simLic:'青' },
  { fullLic:'寧夏回族自治區', simLic:'寧' },
  { fullLic:'新疆維吾爾自治區', simLic:'新' },
];

所以只要這兩個API不停用,基本上OK的 , ^_^;

 

方法三:淘寶

// 淘寶API:
http://ip.taobao.com/service/getIpInfo.php?ip=IP

返回的是

我用方法一獲取了一個IP給它用,返回的JSON結果也很詳細,但是!!!我不會用T_T,哭泣。。。有一篇博客說它有缺點:有時候調用速度很快,但是有時候回超過30秒而導致服務器報錯,終結頁面的運行,我不造,反正我用不動!!!

 

方法四:太平洋API

沒錯,正如那篇博客寫的,功能很強大!!!

// 太平洋API

http://whois.pconline.com.cn

訪問如下:

但是,我也不造咋用,之前時間比較緊,就沒研究了,,,勤快的小夥伴自己動手去研究一下唄,哈哈哈

後記:

因爲我沒有判斷好第一種方法裏的cname值,當定位不到的時候,好像是China啥的來着,但不是空,我就直接sessionStorage了,以至於後面判斷的時候出錯,這是我剛剛寫以上博客的時候,才發現之前忽視的一個bug,導致有的手機在2/3/4G的情況下,定位失敗,默認爲“京”。

但是寫這篇博客之前,我已經用了AMAP去獲取經緯度定位,無論什麼網絡狀況下,都會定位很準確,,哈哈哈哈,不想再改回去了,,我這是因爲項目其他地方用了AMAP之前就引入的,我直接用了,,如果有的小夥伴沒有引入AMAP的話,還是可以用第一種和第二種方法結合的,加油!!如果有大佬查漏補缺,指正錯誤就更好了,歡迎~

 

參考文章:

獲取用戶IP並查詢所在地理位置(附幾個第三方免費開放API)

 

發佈了56 篇原創文章 · 獲贊 41 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章