分类 代码人生 下的文章

输出缓冲是个让人头大的问题,因为它不仅牵扯到web语言本身,浏览器自身的原因也会导致无内容输出。

所以,在输出前保险的做法是先输出4096个空白字符,然后再使用缓冲输出内容,这样就可以实现程序随时输出内容啦!

以下代码chrome,FF,IE,Safari,手机chrome,UCWEB 都测试通过,需要注意的是:

在网页最开始一定要输出足够多的字符来骗过浏览器 ob_flush,flush需要一起使用

";
    //ob_end_clean();  //如果再此打开,flush将会报错,因为清空了缓冲区
    //echo '   length: '.ob_get_length();
    ob_flush();
    flush();
    sleep(1);
}
 
echo "Done.";
 
/*
ob_end_flush();    //送出输出缓冲区内容并关闭缓冲
ob_get_clean();    //得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents(); //只是得到输出缓冲区的内容,但不清除它。
ob_implicit_flush(1); //将打开或关闭绝对(隐式)刷送。绝对(隐式)刷送将导致在每次输出调用后有一次刷送操作,以便不再需要对 flush() 的显式调用。
*/
 
 
/*
刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到  标记之前,不会显示出整个表格。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。
*/

以下转自http://www.cnblogs.com/zemliu/archive/2012/05/11/2495293.html

首先明确一下PHP的输出顺序:

1.打开了php输出缓存:

echo,print -> php output_buffring -> server buffering -> browser buffering -> browser display

2.未打开php输出缓存:

echo,print -> server buffering -> browser buffering -> browser display

另外明确一下浏览器的输出缓存:

IE为256Bytes, Chrome与FireFox为1000Bytes,只有输出数据达到了这个长度或者脚本结束浏览器才会将数据输出在页面上

再来说说用到的几个PHP设置和API:

1.php.ini中的output_buffering配置

Off: 表示关闭PHP输出缓存 On: 打开无限大的输出缓存 4096: 打开大小为4096Byte的输出缓存

2.php.ini中的implicit_flush配置

On: 表示每次输出(如echo,print)后自动调用flush()函数后,直接输出 Off: 与On相反,每次输出后不会调用flush(),需要等到server buffering满了才会输出,但是我们可以用flush()函数代替它,不开启也没关系,反而更加灵活

3.ob_flush()函数: 取出PHP buffering中的数据,放入server buffering

4.flush()函数: 取出Server buffering的数据,放入browser buffering

5.ob_start()函数:对于这个函数我现在了解的不是很清楚,因为开启后输出就会不受ob_flush()控制,即使使用ob_flush()和flush(),数据也不能立即输出在浏览器上.现在知道的是,如果output_buffering=Off,即使使用了ob_start(),也是无法将输出数据缓存的,而如果output_buffering=On的话,即使不用ob_start(),输出数据也可以被PHP缓存,所以觉得ob_start比较废,暂时不管他

最后引用一段Laruence的一段blog,希望对大家的理解有帮助

ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑…

其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情..

ob_*系列函数, 是操作PHP本身的输出缓冲区.

所以, ob_flush是刷新PHP自身的缓冲区.

而flush, 严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.

在apache module的sapi下, flush会通过调用sapi_module的flush成员函数指针, 间接的调用apache的api: ap_rflush刷新apache的输出缓冲区, 当然手册中也说了, 有一些apache的其他模块, 可能会改变这个动作的结果..

有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。

甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape浏览器会在接受到换行或 html标记的开头之前缓存内容,并且在接受到

标记之前,不会显示出整个表格。

一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。

所以, 正确使用俩者的顺序是. 先ob_flush, 然后flush,

当然, 在其他sapi下, 不调用flush也可以, 只不过为了保证你代码的可移植性, 建议配套使用.

这个函数很不错,curl函数中的header还可以加入随机UA等功能防屏蔽,以后改改做自己的采集类!

/**
    QQ群:223494678
    函数:模拟post得到所有分页的页面信息
    参数:
        string $EVENTARGUMENT
        string $VIEWSTATE
        string $EVENTVALIDATION
        string $EVENTTARGET
    返回:
        string
/**/
function getn($EVENTARGUMENT = "", $VIEWSTATE = "", $EVENTVALIDATION = "", $EVENTTARGET = "pager"){
    $args = array();
    if($EVENTARGUMENT){
        $args = array(
            '__EVENTTARGET'=>$EVENTTARGET,
            '__EVENTARGUMENT'=>$EVENTARGUMENT,
            '__VIEWSTATE'=>$VIEWSTATE,
            '__EVENTVALIDATION'=>$EVENTVALIDATION,
            '__VIEWSTATEENCRYPTED'=>'',
            'search$txtFundName='=>'',
            'search$txtFundManger'=>'',
            'search$ddlFoundationDateOperater'=>'1',
            'search$txtFoundationDate'=>'',
            'search$dltFundType$ctl01$chkFundType'=>'on',
            'search$dltFundType$ctl01$chklFundChildType$0'=>'on',
            'search$dltFundType$ctl01$chklFundChildType$1'=>'on',
            'search$dltFundType$ctl01$chklFundChildType$2'=>'on',
            'search$dltFundType$ctl01$chklFundChildType$3'=>'on',
            'search$dltFundType$ctl01$chklFundChildType$4'=>'on',
            'search$chklFundStatus$0'=>'on',
            'search$ddlFundOrg'=>'0',
            'search$txtFundOrgName'=>'',
            'search$ddlStatisticDateOperater'=>'1',
            'search$txtStatisticDate'=>'',
            'search$radlStatisticMode'=>'1'
        );
    }
 
    $user_agent = "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.79 Safari/535.11";
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://???/default.aspx');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);// 设为TRUE让结果不要直接输出
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_FAILONERROR, TRUE);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);
 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language:zh-CN,zh;q=0.8',
    'Connection: Keep-Alive',
    'Cache-Control:max-age=0',
    'Referer:http://???/default.aspx',
    'Expect:'
    ));
 
    curl_setopt($ch, CURLOPT_POST, true); //启用POST提交
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args); //设置POST提交的字符串
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//HTTP请求User-Agent:头
 
    $document = curl_exec($ch); //执行预定义的CURL
    return $document;
}
 
/**
    QQ群:223494678
    函数:根据模拟post所得的页面信息,提取所需post的数据和分页,最后分解需要的html
    返回:
        string
/**/
function getHtml(){
    global $html;
    $first = getn();
    preg_match('/(\d+?)<\/b><\/font> 页<\/span>/is', $first, $matches);
    $total = $matches[1];
    preg_match('/

说明:

getHtml是採集入口文件,裏面先取每一頁的數據,並提取頁碼等數據,然後循環採集後面的數據,getn是採集函數,主要是CURL模擬POST了。

转自:

http://www.cnblogs.com/see7di/p/3428354.html

做采集的都知道,一般采集过来的内容难免会带有html标签,如果有太多的标签会影响之后的数据分析或提取,所以需要过滤掉!PHP已经为我们提供了很多清除html格式的方法了,下面就让老高介绍一下。

strip_tags

strip_tags($str) 去掉 HTML 及 PHP 的标记 语法: string strip_tags(string str); 传回值: 字串 函式种类: 资料处理 内容说明 : 解析:本函式可去掉字串中包含的任何 HTML 及 PHP 的标记字串。若是字串的 HTML 及 PHP 标签原来就有错,例如少了大于的符号,则也会传回错误。这个函数和 fgetss() 有着相同的功能

例子

echo strip_tags("Hello world!");
# Hello world!

htmlspecialchars

这个函数把html中的标签转换为html实体,博客的代码展示就必须使用这个函数,要不贴出来的代码就会被执行了。 预定义的字符是: & (和号) 成为 & ” (双引号) 成为 ” ‘ (单引号) 成为 ‘ < (小于) 成为 < > (大于) 成为 >

例子

$new = htmlspecialchars("Test", ENT_QUOTES);
echo $new; 
# <a href='test'>Test</a>
# 如果需要展现
,那么浏览器解析HTML的时候会自动将他变为换行 # 但是通过htmlspecialchars就可以让< 变为 '

与htmlspecialchars功能相反的函数是htmlspecialchars_decode,他会把HTML实体转化为字符!

后补函数

PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。

$descclear = str_replace("\r","",$descclear);//过滤换行
$descclear = str_replace("\n","",$descclear);//过滤换行
$descclear = str_replace("\t","",$descclear);//过滤换行
$descclear = str_replace("\r\n","",$descclear);//过滤换行
$descclear = preg_replace("/\s+/", " ", $descclear);//过滤多余回车
$descclear = preg_replace("/<[ ]+/si","<",$descclear); //过滤<__("<"号后面带空格)
$descclear = preg_replace("/<\!--.*?-->/si","",$descclear); //过滤html注释
$descclear = preg_replace("/<(\!.*?)>/si","",$descclear); //过滤DOCTYPE
$descclear = preg_replace("/<(\/?html.*?)>/si","",$descclear); //过滤html标签
$descclear = preg_replace("/<(\/?head.*?)>/si","",$descclear); //过滤head标签
$descclear = preg_replace("/<(\/?meta.*?)>/si","",$descclear); //过滤meta标签
$descclear = preg_replace("/<(\/?body.*?)>/si","",$descclear); //过滤body标签
$descclear = preg_replace("/<(\/?link.*?)>/si","",$descclear); //过滤link标签
$descclear = preg_replace("/<(\/?form.*?)>/si","",$descclear); //过滤form标签
$descclear = preg_replace("/cookie/si","COOKIE",$descclear); //过滤COOKIE标签
$descclear = preg_replace("/<(applet.*?)>(.*?)<(\/applet.*?)>/si","",$descclear); //过滤applet标签
$descclear = preg_replace("/<(\/?applet.*?)>/si","",$descclear); //过滤applet标签
$descclear = preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$descclear); //过滤style标签
$descclear = preg_replace("/<(\/?style.*?)>/si","",$descclear); //过滤style标签
$descclear = preg_replace("/<(title.*?)>(.*?)<(\/title.*?)>/si","",$descclear); //过滤title标签
$descclear = preg_replace("/<(\/?title.*?)>/si","",$descclear); //过滤title标签
$descclear = preg_replace("/<(object.*?)>(.*?)<(\/object.*?)>/si","",$descclear); //过滤object标签
$descclear = preg_replace("/<(\/?objec.*?)>/si","",$descclear); //过滤object标签
$descclear = preg_replace("/<(noframes.*?)>(.*?)<(\/noframes.*?)>/si","",$descclear); //过滤noframes标签
$descclear = preg_replace("/<(\/?noframes.*?)>/si","",$descclear); //过滤noframes标签
$descclear = preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si","",$descclear); //过滤frame标签
$descclear = preg_replace("/<(\/?i?frame.*?)>/si","",$descclear); //过滤frame标签
$descclear = preg_replace("/<(script.*?)>(.*?)<(\/script.*?)>/si","",$descclear); //过滤script标签
$descclear = preg_replace("/<(\/?script.*?)>/si","",$descclear); //过滤script标签
$descclear = preg_replace("/javascript/si","Javascript",$descclear); //过滤script标签
$descclear = preg_replace("/vbscript/si","Vbscript",$descclear); //过滤script标签
$descclear = preg_replace("/on([a-z]+)\s*=/si","On\\1=",$descclear); //过滤script标签
$descclear = preg_replace("/&#/si","&#",$descclear); //过滤script标签,如javAsCript:alert();
//使用正则替换
$pat = "/<(\/?)(script|i?frame|style|html|body|li|i|map|title|img|link|span|u|font|table|tr|b|marquee|td|strong|div|a|meta|\?|\%)([^>]*?)>/isU";
$descclear = preg_replace($pat,"",$descclear);

总结

采集这个东西说简单很简单,但说难真的很难。一旦遇到错误,就会让人很抓狂!

想要成为采集高手,你不仅需要了解从一个计算机发出的基于TCP的HTTP请求到最终得到请求的文件的整个过程,而且能够使用一系列的工具来协助你跟踪数据的去处,同时需要考虑你写出的采集任务的效率!

如果你需要采集twitter或者Facebook的数据,可以参考使用shadowsocks轻松搭建FQ环境

代码网上参考的,一共有两种,自己优化了一下:

1.离线方法

参考:http://www.iganlei.cn/demo/186.html

 -7; $i -= 7) //从最后往前以7字节为一组读取mid
        {
        $offset1 = $i < 0 ? 0 : $i;
        $offset2 = $i + 7;
        $num     = substr($mid, $offset1, $offset2 - $offset1);
        $num     = int10to62($num);
        $url     = $num . $url;
    }
    return $url;
}

function getNewUrl($uid,$mid)
{
    $newUrl = 'http://weibo.com/' . $uid . '/' . getCodeByMid($mid);
    return $newUrl;
}


echo getNewUrl('phpgao', '3524952365496186');

2.api方法

参考:http://blog.csdn.net/k1988/article/details/6684114

mid说明:http://open.weibo.com/wiki/Querymid

$re = json_decode(file_get_contents("http://api.t.sina.com.cn/queryid.json?mid=xhMRc8nNu&isBase62=1&type=1"));
$id = $re->id;
echo $id;
 
$re = json_decode(file_get_contents("http://api.t.sina.com.cn/querymid.json?id=$id"));
echo $re->mid;
exit;

搜PHP长链接把这个搜出来了,2006年的帖子比较久远了,希望对你有帮助!

转自http://bbs.phpchina.com/forum.php?mod=viewthread&tid=4577&page=1 中forest的回帖:

永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

对 web 服务器的工作和分布负载没有完全理解的读者可能会错误地理解永久连接的作用。特别的,永久连接不会在相同的连接上提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,永久连接不会提供任何非永久连接无法提供的特殊功能。

为什么?

这和 web 服务器工作的方式有关。web 服务器可以用三种方法来利用 PHP 生成 web 页面。

第一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用永久连接不会获得任何地改变――因为它们根本不是永久的。

第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。

最后一种方法是将 PHP 用作多线程 web 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这些使得 PHP 可以被用作诸如 Netscape FastTrack (iPlanet)、Microsoft’s Internet Information Server (IIS) 和 O’Reilly’s WebSite Pro 等多线程 web 服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。

如果永久连接并没有任何附加的功能,那么使用它有什么好处?

答案非常简单――效率。当客户端对 SQL 服务器的连接请求非常频繁时,永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如,数据库的种类,数据库服务和 web 服务是否在同一台服务器上,SQL 服务器如何加载负载等。但我们至少知道,当连接请求很频繁时,永久连接将显著的提高效率。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的永久连接。例如,如果有 20 个不同的子进程运行某脚本建立了永久的 SQL 服务器永久连接,那么实际上向该 SQL 服务器建立了 20 个不同的永久连接,每个进程占有一个。

注意,如果永久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些缺陷。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。请查阅使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。 警告

在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时,如果脚本不管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下,都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁,或者回滚事务。或者更好的处理方法,是不在使用数据表锁或者事务处理的脚本中使用永久连接,这可以从根本上解决这个问题(当然还可以在其它地方使用永久连接)。

最近在做采集微博的功能,由于要自动采集,所以必须获得最终的用户的token,获取了这个token以后就可以为所欲为啦!

贴代码

$s = new SaeTOAuthV2 ( WB_AKEY, WB_SKEY);
//准备post数据
$post ['action'] = 'login';
//$post ['display'] = 'default';
//$post ['withOfficalFlag'] = 0;
//$post ['quick_auth'] = null;
//$post ['withOfficalAccount'] = '';
//$post ['scope'] = '';
//$post ['ticket'] = '';
//$post ['isLoginSina'] = '';
//$post ['isLoginSina'] = 'code';
//regCallback|appkey62需要预先请求一次拿到
//$post ['regCallback'] = $match_regCallback[1];
//这里不用urlencode,http_build_query会自动处理
$post ['redirect_uri'] = WB_CALLBACK_URL;
$post ['client_id'] = WB_AKEY;
//$post ['appkey62'] = $match_appkey[1];
//$post ['state'] = '';
//$post ['verifyToken'] = null;
//$post ['from'] = '';
$post ['userId'] = '*******';//测试用户名
$post ['passwd'] = '*******';//测试密码,不要有!@¥%……&*()这些符号,最好全是字符或数字,否则验证会失败
$post = http_build_query($post);
//UA貌似没有也行,保险起见还是加上吧
$UA = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36';
//获取认证URL作为refer
$url = $s->getAuthorizeURL (WB_CALLBACK_URL);
//echo $url."\n";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.weibo.com/oauth2/authorize');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//自动跳转
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $UA);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
//获取最后一个有效的url地址
$token_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo $token_url."\n";
curl_close($ch);
$code = preg_match('#code\=(.*)#',$token_url,$match_url);
//找到code
if($code>=1)
{
	$code = $match_url[1];
	$keys = array();
	$keys['code'] = trim($code);
	$keys['redirect_uri'] = WB_CALLBACK_URL;
	try 
	{
		$token = $s->getAccessToken( 'code', $keys );
	} catch (OAuthException $e) 
	{
		die($e->getMessage());
	}
	return $token;
}else
{
	die("code获取失败");
}

思路很简单,直接给 https://api.weibo.com/oauth2/authorize 发送登录信息,通过认证后,他会返回给你一个跳转URL,并带有一个code变量,这个code还是与开发者绑定的。

然后使用这个code,与服务器的 http://open.weibo.com/wiki/Oauth2/authorize 接口通信,返回的才是最终你需要的token,这个token同时与用户绑定,将他保存在session里随时调用!

思路参考:

http://hi.baidu.com/bing008ok/item/0a2bce068d1f8e0aeafe385d

工作中需要微博的商业API,记录一下 不了解的TX先去看说说明 http://open.weibo.com/wiki/商业数据API

商业数据API:包括数据分析、舆情监测、获取全量粉丝三大特性,同时还有实时数据推送、历史数据检索、监测粉丝变化趋势、活跃&活动粉丝分析等多项功能,协助和指引企业开展社会化营销,让真实的用户数据变为企业的决策。

申请试用 申请试用的邮箱为

[email protected] 给这个地址发邮件说明意图即可 这一步挺麻烦的,需要提供很多企业信息,需要注意的是:商业API只提供商业用途,所以如果你的APP的服务对象不是企业,请绕道。 然后填写两张申请单,分别为 订阅服务申请单、REST接口申请单-测试版。 一个是订阅微博,粉丝登上数据用的,另一个是标准API,可以使用搜索等高级接口!

价格

套餐 搜索、订阅返回条数 使用期限 套餐使用费 套餐外使用费
A 200万条 1月 6,000元 3元/千条
B 2000万条 1年 60,000元 2.5元/千条
C 1亿条 1年 250,000元 1.6元/千条
D 5亿条 1年 800,000元 0.6元/千条

确定试用时间

试用时间一般两周,请充分利用好这宝贵的时间吧!

测试

REST接口很简单,和普通接口一样直接调用。就是订阅接口比较麻烦,当你生成订阅列表后,他会把满足你需要的数据放进一个类似队列的东西,然后你需要不断从这个队列中取出你需要的信息,而且这个获取过程需要HTTP长链接。。。。。。说起来很复杂,其实做起来更复杂 :mad: ! 下面就来讲讲订阅接口,先看看这两个文档:

看完这两个接口就基本知道了订阅到底是干啥用的。

订阅开启

首先,开启了订阅接口服务以后,你会有推送时间,还有推送IP等很多需要设置的东西,当然完成了这些基本设置后,就可以开始配置订阅规则了,订阅规则基于以下两个条件:

  1. 订阅用户

  2. 订阅关键字 从subscribe/update_subscribe这个接口的示例来看,订阅有以下特点:

    • 订阅规则即刻生效
    • 规则可以添加,修改
    • 规则可以随时查询
    • 每次修改量很有限(用户:50个;关键词:20个)

使用订阅

添加与删除一样 需要说明的是:

$params['subid'] = '***';  //你的订阅ID 新浪提供
$params['source'] = '***';  //你的APPid


session_start();

include_once( 'config.php' );
include_once( 'saetv2.ex.class.php' );

$c = new SaeTClientV2( WB_AKEY , WB_SKEY , $_SESSION['token']['access_token'] );
$uid_get = $c->get_uid();
$uid = $uid_get['uid'];

//获取所有关注,默认一次50个,可以自己写循环
$friends = $c->friends_by_id($uid);
$subscribe = '';
foreach( $friends['users'] as $value )
{
	$subscribe .= $value['id'].',';
}
$subscribe =  trim($subscribe,',');

//准备数据
$params = array();
$params['subid'] = '***';
$params['source'] = '***';
$params['add_uids'] = $subscribe;
//$params['del_uids'] = $subscribe;

$rs = $c->oauth->get('http://c.api.weibo.com/subscribe/update_subscribe.json', $params);
print_r($rs);


if($rs['result']){
	echo "订阅用户成功";
}

获取订阅信息

可以访问网址:

http://open.weibo.com/apps/yourappid/payservice/subscribe

也可以使用API读取

oauth->get('http://c.api.weibo.com/subscribe/update_subscribe.json', $params);
print_r($rs);