PHP实现百度、网易、新浪短网址服务的API接口调用

 更新时间:2016年11月25日 15:42  点击:1702
闲来蛋疼,看了几个短网址API服务,于是把它们整理出来,方便以后使用。目前,提供靠谱的短网址API接口的公司不多(谷歌、百度、新浪微博、网易等),而像腾讯微博、淘宝这几个巨头的短网址服务都是仅供内部使用。

1 谷歌、百度、网易、新浪短网址服务的API比较

百度短网址API接口完全对外开放,用户不需申请其开放平台的APPKEY,也不用采用OAuth的协议,因此相对简单方便;谷歌的短网址API接口有两种形式,一种类似于百度无需进行繁复的OAuth认证,不过限制比多;另一种是采用GAE平台OAuth2.0的认证方式,限制较少。新浪微博的短网址API接口服务也类似于谷歌,第一种只需要取得新浪微博开放平台的APPKEY即可使用,第二种是采用OAuth2.0认证的方式。网易只提供类似于新浪微博提供的第二种API接口调用方式,即需要申请APPKEY,不过申请非常容易通过,这点不同于新浪微博。值得一提的是,经博主测试,网易的短网址API接口貌似有bug。最终三个接口的测试效果如下图所示:

百度网易新浪微博短网址API接口
2 PHP实现百度短网址API接口调用

百度短网址的API接口封装不是很好,需要针对长网址转短网址和短网址转长网址请求不同的页面(create.php和query.php),另外官方的示例程序也有错误。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用百度短网址API接口
    *     * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function bdUrlAPI($type, $url){
    if($type)
    $baseurl = 'http://dwz.cn/create.php';
    else
    $baseurl = 'http://dwz.cn/query.php';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('url'=>$url);
    else
    $data=array('tinyurl'=>$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status']!=0)
    {
    echo 'ErrorCode: ['.$arrResponse['status'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['err_msg'])."]<br/>";
    return 0;
    }
    if($type)
    return $arrResponse['tinyurl'];
    else
    return $arrResponse['longurl'];
    }
    echo '<br/><br/>----------百度短网址API----------<br/><br/>';
    echo 'Long to Short: '.bdUrlAPI(1, 'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.bdUrlAPI(0, 'http://dwz.cn/evlhW').'<br/><br/>';
    ?>

3 PHP实现网易短网址API接口调用

网易短网址API接口

用户首先需要申请一个appkey,申请地址是http://126.am/,登录进去即可申请,并且很快得到审核。不过,经过测试发现一个bug:用接口生成的短网址无法通过API接口还原为之前的长网址,提示“NOT_MATCH”(对应的官方说明是:Key和短地址不匹配,无法还原)。但是如上图所示,如果在http://126.am/user.action的页面生成的短网址却能够通过API还原为原来的长网址。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用网易短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function wyUrlAPI($type,$url){
    if($type)
    $baseurl = 'http://126.am/api!shorten.action';
    else
    $baseurl = 'http://126.am/api!expand.action';
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '4f0c04771d4e40b4945afcfdc0337e3d';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('longUrl'=>$url,'key'=>$key);
    else
    $data=array('shortUrl'=>$url,'key'=>$key);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status_code']!=200)
    {
    echo 'ErrorCode: ['.$arrResponse['status_code'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['status_txt'])."]<br/>";
    return 0;
    }
    return $arrResponse['url'];
    }
    echo '<br/><br/>----------网易短网址API----------<br/><br/>';
    echo 'Long to Short: '.wyUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.wyUrlAPI(0,'http://126.am/huangky').'
    ';
    echo 'Short to Long: '.wyUrlAPI(0,'126.am/XRYsJ2').'<br/><br/>';
    ?>

4 PHP实现新浪微博短网址API接口调用

同样,用户首先需要申请一个新浪微博开放平台的appkey,申请地址是http://open.t.sina.com.cn/,不过审核相对严格而且比较慢。新浪微博短网址API接口有两种实现方式,第一种是原始的OAuth1.0的验证方式,比较简单,无需申请token,第二种是OAuth2.0的验证方式,这个需要access_token(虽然官方文档http://t.cn/8FgFoL8说可以像第一种那样直接通过appkey验证,但是测试不成功)。因此下面的示例采用的是第一种方式,即直接通过appkey验证。

 代码如下 复制代码

 

    <?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用新浪短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function xlUrlAPI($type,$url){
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '1562966081';
    if($type)
    $baseurl = 'http://api.t.sina.com.cn/short_url/shorten.json?source='.$key.'&url_long='.$url;
    else
    $baseurl = 'http://api.t.sina.com.cn/short_url/expand.json?source='.$key.'&url_short='.$url;
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL,$baseurl);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if (isset($arrResponse->error) || !isset($arrResponse[0]['url_long']) || $arrResponse[0]['url_long'] == '')
    return 0;
    if($type)
    return $arrResponse[0]['url_short'];
    else
    return $arrResponse[0]['url_long'];
    }
    echo '<br/><br/>----------新浪短网址API----------<br/><br/>';
    echo 'Long to Short: '.xlUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.xlUrlAPI(0,'http://t.cn/8FdW1rm').'<br/><br/>';
    ?>

5 后记

综上,百度的短网址API相对方便,而且限制较少;新浪和网易的API接口相对麻烦;网易的短网址API是唯一具备API请求统计功能的,但很容易受到“请求过于频繁而遭到REQUEST_LIMIT”。另外,对于任何API接口的调试工作,一定要使用其接口提供的错误信息,例如上面百度接口的$arrResponse['status']字段、网易的$arrResponse['status_code']字段。

原文转自:http://www.huangkeye.cn/web/php/839.html

 

现在有很多朋友在做网站安全验证时会把session存放在cookie中,这样我们就对一些数据进行加密处理,那么他们这样做的优缺点是什么及有那些安全问题呢?下面我们一起来对比一下。

这篇文章不是讨论session,也不是cookie,现在很多网站都是讲session放cookie中,叫做cookie based session,下面就来讨论下cookie based session的优缺点:

优点:

1.减轻服务器压力,如PHP session默认是文件存储格式的,这样就会较少磁盘压力,不会给磁盘造成较多的碎片。
2.你在做集群的时候,是不是要做session同步的问题,cookie based session后就免去了。

缺点:

1.同一个用户,可能在多个地方登录,你也无从判断谁是真实有效用户。
2.session记录在cookie放本地,可能被hacer获取,通过anehta可以将cookie持久化,使登录状态永久有效,当然你可以再记录cookie的时候记录时间戳,在服务器端验证有效期。
个人建议:
从安全性上来说只要处理得当,session和cookie相差无几,另外还要考虑cookie的存储量,一些重要信息如用户信息或权限信息最好不要放cookie

session和cookie谁更安全

就个人而言,我觉得session更安全一点,我以下几点看法。

1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。何乐而不为呢。

2,session的sessionID是放在cookie里,要想功破session的话,第一要功破cookie。功破cookie后,你要得到 sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。第二,sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了,而真正的cookie存在于客户端硬盘上的一个文本文件,谁安全很显然了。

PHP多线程编程中可以通过Thread,Worker的构造方法传递变量到线程,也可以通过线程的public属性或public方法实现,经研究发现都是通过serialize()和unserialize()实现传递,这样就会造成几个问题:

测试环境

OS: win7 64
PHP: 5.4.25 ts
pthreads: 0.1.0


1.性能问题

2.PDO等某些类型不能serialize所以就不能传递到线程。
这两个问题是能通过其他凡是解决的,解决方法仁者见仁智者见智。

另外,可以通过传递匿名函数到线程中,但是有个bug,匿名函数不能赋值给线程中的属性,导致传递的匿名函数只能在线程的构造方法中才能使用(call_user_fun*系列函数调用)。

Thread属性定义一定要注意必须在构造方法中初始化,否则必定为null。__construct()和run()里面的代码不在一个次元,如果属性不是PHP标量在run()中不能修改,例如构造方法中初始化一个对象,然后run()中修改对象属性不会生效。

正确写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished;
 public $terminated;
 protected $id;
 public $terminate;
 public function __construct($id) {
  $this->id = $id;
  $this->terminated = true;
  $this->finished = false;
  $this->terminate = false;
 }
}

错误写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished=false;
 public $terminated=false;
 protected $id;// www.111cn.net
 public $terminate=false;
 public function __construct($id) {
  $this->id = $id;
 }
}


这样也是错的,无论stdClass还是数组

 代码如下 复制代码
abstract class Task extends Thread {
 private $info;
 public function __construct($task) {
  $this->info = array();
  $this->info ['task'] = $task;
  $this->info ['finished'] = false;
  $this->info ['terminate'] = false;
  $this->info ['terminated'] = false;
  $this->info ['error'] = false;
  $this->info ['info'] = array ();
 }
}


后来研究又发现,复合类型的数据整体赋值貌似能起作用。

如果程序有很多回调函数在线程内部用的话就是找死啊。

 

初学php时就知道利用替换函数来替换指定的数字,但要替换指定位置我们需要简单处理一下才行,下面我介绍几个例子把指定位星号显示出来。

例子,用户名

 代码如下 复制代码

function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
    if($code == 'UTF-8')
    {
        $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
        preg_match_all($pa, $string, $t_string);

        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen));
        return join('', array_slice($t_string[0], $start, $sublen));
    }
    else
    {
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = '';www.111cn.Net

        for($i=0; $i< $strlen; $i++)
        {
            if($i>=$start && $i< ($start+$sublen))
            {
                if(ord(substr($string, $i, 1))>129)
                {
                    $tmpstr.= substr($string, $i, 2);
                }
                else
                {
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        //if(strlen($tmpstr)< $strlen ) $tmpstr.= "...";
        return $tmpstr;
    }
}

示例

 代码如下 复制代码

$str = "如来神掌";
echo cut_str($str, 1, 0).'**'.cut_str($str, 1, -1);
//输出:如**掌

下面附两个IP地址与手机号星号显示

初学PHP,看到别人是通过合并和拆分数组进行这个操作!所以转过来!!

 代码如下 复制代码

<?php 

$ip =$_SERVER['REMOTE_ADDR'];

  $ip_arr= explode('.', $ip);

  $ip_arr[3]='*';

  $ip= implode('.', $ip_arr);

echo $ip;

?>

手机号的

 代码如下 复制代码

<?php
$haoma="15012345678";
echo preg_replace("/(d{3})d{5}/","$1*****",$haoma);
//150*****678
?>

表单可以把自己定义成数组形式,这样我们就能利用post接收用户多选过来的值了,下面一聚教程小编给各位整理了几个例子。

今天写php的时候发现$_POST["arr"]无法获取参数arr的数组,记录一下。

例如有以下表单需要提交:

 代码如下 复制代码

  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />

使用$_POST["arr"]只能获得最后选择的复选框的值,要获得全部选中的复选框的值需要把表单修改成下面:

 代码如下 复制代码

  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />

这样就可以使用$_POST["arr"]获得全部选中的checkbox的值,那这样获取值了我们要怎么解析出来呢。

第一中方法

 代码如下 复制代码

<form action="test1.php" method="post">
<?
for($i=0;$i<10;$i++){
?>
<input type="checkbox" name="interests[](不能去掉[])" value="<?=$i?>">test<?=$i?><br>
<?
}
?>
<input type="submit">
</form>

test1.php

<?php
foreach($_POST as $key => $val){
if(is_array($val)){
   foreach($val as $v2){
    echo "$v2<br>";
   }
}
}

?>

第二种用法

test3.php

 代码如下 复制代码

<?php

if(isset($_POST['submit'])){
$users = $_POST['user'];
foreach($users as $key=>$val){
   echo 'user ',$key,' = ',$val,'<br />';
}
}
?>
<form method="post">
zhangsan <input type="text" name="user[zhangsan]" value="0" /><br />
lisi <input type="text" name="user[lisi]" value="1" /><br />
wangwu <input type="text" name="user[wangwu]" value="2" /><br />
zhaoliu <input type="text" name="user[zhaoliu]" value="3" /><br />
<input type="submit" name="submit" value="提交" />
</form>

[!--infotagslink--]

相关文章

  • 百度网盟和google网盟推广那种效果好

    专做了百度和google的网盟推广以作推广效果的评估比较。百度的周期为6天,google为4天。   从百度的统计数据可以看出这六天的点击次数总共为464,平均点击花费了0.30元...2017-07-06
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示:<script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script><script language="javascript" type="text/javascript" src="js/...2015-10-30
  • 百度联盟封号了解封申请攻略

    百度联盟封号对于许多的站长来说肯定是会影响到心情的,那么既然是百度联盟封号了我们就肯定有一些原因的,虽然不是你自己搞的或一些其它因素都有可能,我们下面整理一下百...2016-10-10
  • PHP自动生成后台导航网址的最佳方法

    经常制作开发不同的网站的后台,写过很多种不同的后台导航写法。 最终积累了这种最写法,算是最好的吧...2013-09-29
  • 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标

    本文给大家介绍javascript实现高德地图和百度地图提取行政区边界经纬度坐标的相关知识,本文实用性非常高,代码简单易懂,需要的朋友参考下吧...2016-01-24
  • 网站被百度拔毛 一月重新回归经验分离

    网站被K后,笔者做的第一件事便是在网站上增加更新模块。百度算法更新,对于网站内容给予了相当大的权重,这是笔者网站最欠缺的部分,保证了及时的更新便有了吸引蜘蛛爬取的...2016-10-10
  • 如何用PS将百度熊抱枕做成大头枕?

    我们知道百度熊抱枕很大,只想要百度熊的大头,该怎么办呢?下面我们就来看看详细的教程。 1、首先打开photoshopCS6软件,新建一个“1600*1600”的白色背景图,并从右上角...2016-12-31
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示:<script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script><script language="javascript" type="text/javascript" src="js/...2015-10-30
  • 怎么对百度网页搜索的检索指标进行评估

    用户为满足自己某种需求而来到搜索引擎的,判断用户的需求是做好网站的开始。只有准确地判断出用户需求,了解用户搜索的目的,才能合理地衡量出一个网站结果的质量好,做好搜...2016-10-10
  • 如何应对百度更新改动关键词

    网页头部head 部分:TITLE 、<mtea>部分 网站描述Description、keyword 内容中的关键词,大家优化时也都比较重视这部分的关键词优化,因为在查询搜索结果时此处出现的关键词...2017-07-06
  • JS实现获取来自百度,Google,soso,sogou关键词的方法

    这篇文章主要介绍了JS实现获取来自百度,Google,soso,sogou关键词的方法,结合实例形式分析了js获取来路页面的方法与相关搜索引擎关键词的处理技巧,需要的朋友可以参考下...2017-01-09
  • WinForm调用百度地图接口用法示例

    这篇文章主要介绍了WinForm调用百度地图接口用法,结合具体实例形式简单分析了WinForm WebBrower控件与前端百度接口交互的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • Illustrator绘制百度云标志LOGO教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说绘制百度云标志LOGO的教程,各位想知道具体绘制方法的使用者,那么下面就快来跟着小编一起看一看教程。...2016-09-14
  • PHPCMS实现自动推送URL到百度站长平台

    我们一起来看一篇关于PHPCMS实现自动推送URL到百度站长平台,希望此教程能够帮助到各位朋友。 百度站长平台开放url推送接口,可以使用调用接口的形式主动及时推送u...2016-11-25
  • 百度不更新网站原因分析

    百度不更新网站原因分析 今天我们来看一篇关于 哦,你是不是其它的之一呢,好了下面来看看各位站长总结了来百度不更新网页的原因吧。 一、首页的大flash图片。   ...2016-10-10
  • 如何判断用户是否访问过某个网址

    一位站长译的一个国外的如何判断用户是否访问过某个网址文章,个人感觉写得非常不错,下面分享一下。 我们经常有这样的需求:想知道用户之前有没有访问过某个网址。有...2016-09-20
  • 百度指数工具分析关键词的价值

    仅仅凭自己的感觉是根本无法判断这个关键词的价值的,那么这时候我们就可以适当的应用一下百度指数工具,利用这个工具我们可以挖掘出一些有价值的关键词。 一、从百...2016-10-10
  • C# 10分钟完成百度人脸识别(入门篇)

    这篇文章主要介绍了C# 10分钟完成百度人脸识别(入门篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 网站的聚合页或站内搜索页怎么会沦为百度搜索打击对象

    网站运营是很多人向往的赚钱方法,一些网站会发现,自己做的聚合页面和站内搜索页面被百度搜索无情打击,这是为什么,不知道原因的伙伴下面跟小编一起来看看。 今天杨子...2017-07-06
  • php中curl模拟登陆用户百度知道的例子

    以前讲过很多关于curl模拟登陆用户的一些例子了,今天我来介绍一个登录百度产品的一个php程序代码,希望文章给你带来帮助,此文章只供学习使用。 最近弄了一个工具,希望...2016-11-25