調用新浪介面,擷取電腦ip,所在省份城市

來源:互聯網
上載者:User

  之前找到了調用騰訊介面的實現方式,

  [php] http://blog.csdn.net/a7758521haha/archive/2011/05/11/6411620.aspx

  [javascript] http://blog.csdn.net/a7758521haha/archive/2011/05/09/6406287.aspx

  試著寫了下調用新浪介面擷取地理位置資訊方式,錯誤百出,現在寫這篇文章,把我的編碼思想,遇到的問題,以及解決辦法整理總結如下:

  首先開啟新浪的介面http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js

  是一個數組,有類似/u4e2d/u56fd這樣的內容,我想到了 利用PHP實現騰訊介面調用的方法,剝離分解數組,和iconv函數轉換編碼,然後就去做了,寫出的代碼如下所示:

  <?php @header("Content-type: text/html; charset:GB2312"); function getIpPlace(){ $ip = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"); //echo $ip; //echo "<br/>"; $ip = iconv("GB2312","UTF-8",$ip); //echo $ip; //echo "<br/>"; $ip = str_replace('"',' ',$ip); //echo $ip; //echo "<br/>"; $ip2 = explode("{",$ip); //print_r($ip2); //echo "<br/>"; $a = substr($ip2[1],0,-2); //echo $a; //echo "<br/>"; $b = explode(",",$a); //print_r($b); //echo "<br/>"; $str = json_encode($b); //print_r($str); return $str; } ?> <mce:script type="text/javascript"><!-- var arr = <?php echo getIpPlace(); ?>; document.write(arr[3]); // --></mce:script>

  顯示結果為:country : /u4e2d/u56fd

  未得到中文顯示,然後檢查代碼無果,一句一句返回結果也沒有獲知原因,於是在論壇發帖求助,得到很多各種各樣的解答,(ps:csdn論壇真是高手入雲,臥虎藏龍),

  首先得到的建議就是使用htmlencode,我在網上搜了一下相關文章,得到的結論如下:
  1.有些文章是介紹js實現亂碼轉換是通過jsp實現的,我對jsp不瞭解
  2.js實現亂碼轉換是ajax部分,跟現在的這部分我太相關

  然後回帖交流,未得到回複,所以這種方法,目前來說不可用。

  然後就有網友糾正我的概念,/u4e2d/u56fd之類的內容不是亂碼而是轉碼,所以用iconv無理由,而我就是這個意思(表達為亂碼是因為之前看過的一篇文章上是這樣說的),按照我的理解iconv函數是實現轉碼的,他說這是漢字的unicode值,然後百度Google了一番,找到很多相關文章,正在看,就得到回帖,之後的回帖給出了一些寫好的代碼,

  script type="text/javascript" src="jquery-1.4.2.min.js"></script> <mce:script type="text/javascript"><!-- $(function(){ $.get("http://int.dpool.sina.com.cn/iplookup/iplookup.php","format:js",function(e){$("#data").html(e);}); }); // --></mce:script> <div id="data"></div>

  給出了一個新思路:使用jquery這種純前端方式實現,我對jquery沒有瞭解,所以沒能深究,不過這代碼可以在ie8下正常得到想要的結果,顯示如下:

  1 60.7.0.0 60.7.255.255 中國 河北 秦皇島 聯通

  還得到下面的代碼:

    僅僅顯示的話:

    <?php @header("Content-type: text/html; charset:GB2312"); function getIpPlace(){ $ip = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"); $ip = str_replace('var remote_ip_info','var arr',$ip); // 僅僅顯示的話,這個就足夠了,那個一大坨是處理的相關邏輯 return $ip; } ?> <mce:script type="text/javascript"><!-- <?php echo getIpPlace(); ?>; document.write(arr['country']); // --></mce:script>

  這段代碼執行顯示結果為:中國,正常顯示

    還要二次處理的話:

    <?php @header("Content-type: text/html; charset:GB2312"); function getIpPlace(){ $ip = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"); // 如果還要二次處理的話那麼 $ip = preg_replace('/[^/{]+(/{[^;]+);/i', '//1', $ip); $data = array(); foreach(json_decode($ip, true) as $k => $v) { if($k == 'country') { $v = iconv('gb2312', 'utf-8', '你在').$v; } $data[$k] = $v; } $ip = 'var arr = ' . json_encode($data); return $ip; } ?> <mce:script type="text/javascript"><!-- <?php echo getIpPlace(); ?>; document.write(arr['country']); // --></mce:script>

  執行結果為:你在中國,顯示正常。

  還有兩段代碼:

  <mce:script src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js" mce_src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"></mce:script> <mce:script type="text/javascript"><!-- alert(remote_ip_info.country); // --></mce:script>

  彈出對話方塊,內容為“中國”,顯示正常

  還有一種方式,如下代碼:

<?php $s = file_get_contents("http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"); preg_match('/{.+}/',$s,$r); $p = json_decode($r[0]); print_r($p); ?>

  顯示如下代碼:stdClass Object ( [ret] => 1 [start] => 60.7.0.0 [end] => 60.7.255.255 [country] => 中國 [province] => 河北 [city] => 秦皇島 [district] => [isp] => 聯通 [type] => [desc] => )

 

  以下是我的分析:

  其實一開始我的設計思想就是錯誤的,var remote_ip_info = {"ret":1,"start":"60.7.0.0","end":"60.7.255.255","country":"/u4e2d/u56fd","province":"/u6cb3/u5317","city":"/u79e6/u7687/u5c9b","district":"","isp":"/u8054/u901a","type":"","desc":""};本身內容就是js形式(這一點從url裡面format=js就可以看到),據此第三段代碼和第五段代碼很容易得出

  接下來我得再看下Regex部分

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.