火车采集器发布出现"您当前的访问请求当中含有非法字符,已经被系统拒绝"

部分用户向我反映我的dx接口系列,在dx3.1发布的时候出现这样的错误提示,无法发布,通过接口发布却是正常的。

查了一下原因,发现这跟火车采集器在发布时使用urlencode模式有关。

解决方法如下:
1,使用火车采集器2008及之前版本,额,当我没说过
2,如果你使用的是我发布的接口,可以修改接口配置文件locoy.config.php,在配置文件末尾添加一行代码

define("DISABLEXSSCHECK", 1);

即只在火车采集器发布内容时,禁用安全检查,此方法只在接口模式下生效,正常用户访问论坛依然受安全检查

3,如果你没有使用我的接口,则可以修改dx的配置文件 config/config_global.php,禁用dx的安全检查

// 站点安全设置
$_config['security']['authkey']			= 'asdfasfas';	// 站点加密密钥
$_config['security']['urlxssdefend']		= true;		// 自身 URL XSS 防御
$_config['security']['attackevasive']		= 0;		// CC 攻击防御 1|2|4|8

即将$_config['security']['urlxssdefend']改成0;
但这样会禁用全局的安全检查,可能会引发一些不安全的恶意攻击,此方法不推荐。

准确模拟Google机器人

Google 抓取工具

“抓取工具”是一个通用名称,泛指通过跟踪从一个网页指向另一个网页的链接,从而自动发现并扫描网站的程序(如漫游器或“蜘蛛”程序)。Google 的主要抓取工具称为 Googlebot。此表格列出了在引用页日志中常能见到的 Google 抓取工具的相关信息,以及在 robots.txt、漫游器元标记和 X-Robots-Tag HTTP 指令中指定这些抓取工具应采用的方法。

https://support.google.com/webmasters/answer/1061943?hl=zh-Hans

tmall天猫获取所有商品信息的采集规则(php json)

发现tmall页面的静态内容采用了cdn分片,页面中变化的内容,都放到了cdn里,所有商品的信息都可以在JSON中获取,也许是方便在更新商品的时候,不用更新商品详情页的静态文件吧。
下面的代码可以读取商品的详细信息,并对信息做了简单处理,方便火车采集器采集调用
继续阅读tmall天猫获取所有商品信息的采集规则(php json)

尘缘版接口 提示This file has expired的解决办法

各位新老用户注意咯:
自2011-10-07日起,本帖所发布免费接口也发布到尘缘的授权中心了,各位可以免费下载,无需注册。
下载免费接口、购买收费接口、更新收费接口的用户请直接前往http://my.4wei.cn
主是要考虑到由于平时时间紧,更新接口以后需要修改多个帖子的版本号,比较麻烦。
现在把接口放到一起,接口的更新就统一在授权中心进行通知了。
以后接口的更新日志不在本帖发布,有BUG或者接口提示This file has expired.需要更新接口的用户请前往授权下载页面

今天很多使用以前手工授权的收费和免费用户,都出现了This file has expired的提示,原因是前两年前手工使用的zend guard进行授权,里面有一个过期时间,可以设置接口在一定时间可以停止使用。
当时想的是未来两年接口可能已经更新过很多版本,用户下载使用的肯定是0最新的接口。
现在来看,很多用户不太愿意升级他们使用的接口,刚刚还有6.x和7.x的用户来找我索要最新版。

还有几个两三年前的老用户也来联系尘缘了,久违呀!这些用户有的还保持着每天采集4万帖的频率,吼吼。看到自己的产品有这么多忠实的用户,心里还是挺高兴的。

谢谢各位支持呐。

各位使用很古老版本的用户,请到授权中心更新一下你的接口版本。
更新方法:

  1. 主程序,locoy.php是必须的覆盖的
  2. 配置文件,locoy.config.php一般不需要更新,部分接口有新的功能加入,需要更新配置信息,可以对比一下两个配置文件
  3. 其它的发布模块、规则不需要更新

授权地址:http://my.4wei.cn
免费接口也需要走购买流程,只是不需要付款,收费接口直接输入域名即可下载授权,如果是前几年手工添加的授权,请联系尘缘更新授权记录,再更新授权。
以下是几张图片演示过程:




DX全能接口实现随机回复的发布

尘缘的接口采用主程序加密,配置文件加密的方式,有编程经验的同学可以直接修改配置文件来实现自定义发布效果的功能。

如一些同学需要使用随机用户名发帖的功能,简单来说,只需要在config.php加上一段代码即可实现。

$randReplay = array('|||随机回复1|||牛逼|||', '|||随机回复2|||不错');
$_G['gp_message'] = $_G['gp_message'] . $randReplay[array_rand($randReplay)];

作用是随机生成一组(多条回复内容)随机回复的内容。

完整的配置文件如下:

<?php
/**
 * Discuz!X_Ultimate	By 尘缘
 * 如果修改本配置文件出现程序错误,请将本配置文件还原
 *
 * 作者:尘缘
 * Q Q:130775
 * 邮箱:admin@4wei.cn
 * 博客:http://www.4wei.cn
 * 更新:2011-07-05
 * 
 * 接口升级:http://my.4wei.cn/index.php
 * 
 * 基本安装:http://www.4wei.cn/files/X2/1.wmv
 * 高级配置:http://www.4wei.cn/files/X2/2.wmv
 * 分类信息:http://www.4wei.cn/files/X2/3.wmv
 **/

if(!defined('IN_DISCUZ')) {
	exit('Access Denied');
}

//安全设置,允许访问本接口的用户ID,多个UID用逗号分开,开启本功能后则需要先登陆再发布数据,不启用则留空
$allowUID = 0;

//发布主题贴使用的用户名,多个用户名用|||分开,建议放50-100个用户名
$postusers		=	"发贴1号|||发贴2号|||发贴3号|||发贴4号|||发贴5号|||发贴6号|||发贴7号|||发贴8号|||发贴9号|||发贴10号|||发贴11号|||发贴12号|||发贴13号|||发贴14号|||发贴15号|||发贴16号|||发贴17号|||发贴18号|||发贴19号|||发贴20号|||发贴21号|||发贴22号|||发贴23号|||发贴24号|||发贴25号|||发贴26号|||发贴27号|||发贴28号|||发贴29号|||发贴30号";

//发布回复贴使用的用户名,多个用户名用|||分开,建议放50-100个用户名
$replyusers		=	"回贴1号|||回贴2号|||回贴3号|||回贴4号|||回贴5号|||回贴6号|||回贴7号|||回贴8号|||回贴9号|||回贴10号|||回贴11号|||回贴12号|||回贴13号|||回贴14号|||回贴15号|||回贴16号|||回贴17号|||回贴18号|||回贴19号|||回贴20号|||回贴21号|||回贴22号|||回贴23号|||回贴24号|||回贴25号|||回贴26号|||回贴27号|||回贴28号|||回贴29号|||回贴30号";

//用户注册失败时,使用的随机用户UID,只在注册用户失败时生效
$randUserID = '1,2,3,4,5';						//随机从论坛抽取用户发帖的取值范围,多个用户ID用,分开

//以下的用户注册信息,留空则全部自动生成
$password = "123456";							//注册用户使用的默认密码
$email = "";									//注册用户使用的默认邮箱,请一定要修改成自己的邮箱
$questionid = "尘缘的QQ号码";					//注册用户名的问题
$answer = "130775";								//注册用户名的答案

//帖子参数
$time = 2345 * rand(1,7);                       //发布回复默认间隔时间
$oneuser = 0;									//是否启用一人发贴模式,适用于回帖也是一楼作者发贴的帖子,1为启用,0为不启用
$chktitle = 0;									//是否检测重复标题,重复的帖子将跳过

//高级效果
$addfeed = 1;									//发贴是否添加动态 ,1为启用,0为不启用
$retitle = '';     								//回复标题,留空则不启用,如"RE:{subject}"
$htmlon = 0;									//是否启用HTML发贴,1为启用,0为不启用
$randview = rand(1, 33);        				//每增加一条回复增加的随机浏览数量
$showGroup = 1;                 				//论坛接口中是否列出所有群组,1为启用,0为不启用
$price = 0;										//主题金币

//附件效果
//使用火车采集器发布前,请先将附件上传到论坛附件目录,否则将无法正确获取附件信息
$down_attachment = 1 ;                          //是否启用附件识别,1为启用,0为不启用
$remote = 0;									//是否启用远程附件,1为启用,0为不启用
$attprice = 0;									//附件金币
$hide_attachment = 0 ;                          //是否启用非图片附件自动隐藏
$setthreadcover = 1;							//自动提取图片附件作为图片列表封面

//以下是一些替换字符,支持正则,如果修改后程序出错,请还原,支持关键字替换和链接。
$str_for_replace = array(
	"<blockquote>([\s\S]*?)</blockquote>"		=>	'[quote]\\1[/quote]',
	"\([\d\.\s]*?[kmb]+\)"						=>	'',
	"下载次数[\d: : ]+"							=>	'',
	"<div id=\"code\d+?\">([\s\S]*?)</div>"		=>	'',
	"<embed[^>]+src=\"([^\"]+\.swf)\"[^>]*?>"	=>	'[flash]\\1[/flash]',
	"<embed[^>]+src=\"([^\"]+\.mp3)\"[^>]*?>"	=>	'',
	"\n[\s\n]+"									=>	"\n",
	"(\r\n){2,}"								=>	"\r\n",
	"<center>([\s\S]*?)</center>"				=>	"[align=center]\\1[/align]\r\n",
);

//以下是支持的文件格式列表,可以自由添加需要提取的附件链接后缀(扩展名)
$attachment_type = "7z|rar|bittorrent|torrent|pdf|jpg|gif|png|bmp|swf|fla|flv|swi|wav|mid|mp3|m3u|wma|asf|asx|vqf|mpg|mpeg|avi|wmv|rar|rmvb|rm|rv|txt|rtf|wri|chm|docx|ppt|doc|xls|zip|arj|arc|cab|lzh|lha|tar|gz|exe|bat|dll|sisx|sis";

$randReplay = array('|||随机回复1|||牛逼|||', '|||随机回复2|||不错');
$_G['gp_message'] = $_G['gp_message'] . $randReplay[array_rand($randReplay)];
?>

[免费]土豆网视频专辑采集接口详解

接上篇:
[免费下载]土豆网专辑采集规则+接口
http://www.4wei.cn/archives/1001491

以下是接口全文。
我给一些重要步骤做了注释。

tudou.php下载

<?php
/*
设置接口为60秒连接,防止采集远程链接超时
*/
set_time_limit(60);

/*
获取火车采集器传过来的ID,组装出土豆的专辑链接
*/
$lid = intval($_GET["lid"]);
if(empty($lid)) exit();

$uri = sprintf("http://www.tudou.com/playlist/p/l%d.html", $lid);

/*
使用CUrl函数进行远程链接的内容获取,就是采集过程
*/
$html= curl($uri);

/*
如果没有采集到内容,则重试3次
*/
if(empty($html)) $html= curl($uri);
if(empty($html)) $html= curl($uri);
if(empty($html)) $html= curl($uri);

/*
如果采集的网页进行了Gzip压缩,则调用gzdecode函数进行解压,以获取明文
*/
$html= strpos($html, "<")==0 ? $html : gzdecode($html);

/*
使用正则获取连续的视频ID及标题
*/
preg_match_all('@iid:(\d+)\s+?,title:"([^"]+)"@is', $html, $match);

/*
遍历所有视频,组装出Discuz的Flash视频播放代码。
*/
foreach ($match[1] as $key=>$iid)
{
$code = sprintf("[flash]http://www.tudou.com/player/outside/player_outside_list.swf?iid=%d&default_skin=http://js.tudouui.com/bin/player2/outside/Skin_outside_list_7.swf&autoPlay=false&listType=1&rurl=&autostart=false&lid=%d[/flash]", $iid, $lid);

/*
最后组装出方便火车采集器循环采集的代码格式
*/
printf("<!--titlestart-->%s<!--titleend--><!--codestart-->$code<!--codeend-->", $match[2][$key]);
}

function curl($url) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 2 );
curl_setopt ( $ch, CURLOPT_ENCODING, "gzip" );

$data = curl_exec ( $ch );

if (curl_errno ( $ch )) {
/*debug info*/
return curl_error ( $ch );
} else {
curl_close ( $ch );
}

return $data;
}

function gzdecode($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
if ($flags & 31 != $flags) {
// Reserved bits are set -- NOT ALLOWED by RFC 1952
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack("V", substr($data,4,4));
$mtime = $mtime[1];
$xfl   = substr($data,8,1);
$os    = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra     = "";
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len - $headerlen - 2 < 8) {
return false;    // Invalid format
}
$extralen = unpack("v",substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
return false;    // Invalid format
}
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
// C-style string file NAME data in header
if ($len - $headerlen - 1 < 8) {
return false;    // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false;    // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len - $headerlen - 1 < 8) {
return false;    // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false;    // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len - $headerlen - 2 < 8) {
return false;    // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false;    // Bad header CRC
}
$headerlen += 2;
}
// GZIP FOOTER - These be negative due to PHP's limitations
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
// Perform the decompression:
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
// This should never happen - IMPLEMENTATION BUG!
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body);
break;
default:
// Unknown compression method
return false;
}
} else {
// I'm not sure if zero-byte body content is allowed.
// Allow it for now... Do nothing...
}
// Verifiy decompressed size and CRC32:
// NOTE: This may fail with large data sizes depending on how
//       PHP's integer limitations affect strlen() since $isize
//       may be negative for large sizes.
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// Bad format! Length or CRC doesn't match!
return false;
}
return $data;
}

?>

[免费下载]土豆网专辑采集规则+接口

接口为外部php文件,需要上传到你的php空间,并将接口访问的地址放到规则中。
本接口加规则可以采集土豆的视频专辑发到论坛,UBB代码已经格式化好了,只需要在论坛后台开启论坛用户组及版块的FLASH媒体限制即可显示Flash。

文件使用说明:
tudou.php为外部接口文件,请上传的PHP空间,如论坛;
tudou.ljob为火车采集器任务规则,请在火车采集器站点上点右键,导入任务;
然后修改接口文件链接地址,修改搜索关键词即可。

有朋友问我tudou.php中都实现了什么功能,于是有一篇后续的文章给予一定的讲解。

如图:

附件下载:[免费下载]土豆网专辑采集规则+接口:http://www.4wei.cn/files/2011/10/tudou.zip

高考试题库采集插件

某君要采集一个网站的收费试题,给写了一个插件,一个比较怪异的网站,下载算法有点意思,花了一点心思。没有使用Snoopy,而是使用了CURL函数。

这段时间在采集国内Android应用,逐渐开始封装一些常用Curl方法,在工作中能实现逐步调试和个性化数据请求。

这个插件是支持火车采集器内置插件的,但我机器上只有php5.2.11的环境,所以随带着把火车采集器的PHP版本库升级了一下。

升级方法很简单,将PHP5.2.11目录下的所有文件拷贝到火车的system目录下,然后把php.exe改成site.exe,site.ini就是php.ini了,可以进行各种配置。

注:以下代码非完整代码,仅供学习 继续阅读高考试题库采集插件

Discuz!X全能发布接口2011版视频教程发布,近乎完美,秒杀一切!

X2轰轰烈烈的发布了,尘缘花了近半个月的时间,对X系列接口进行了优化、重构,同时也针对最新的接口,发布了新的使用教程,欢迎大家下载使用。 

同时,尘缘也将免费版同步做了发布效果优化,大家可以下载试用。
截至2011-05-29,尘缘开发的Discuz!系列接口已经完全适用于Discuz!7.1/7.2,Discuz!X1/X1.5/X1,欢迎新老用户购买升级!

DEDE免登陆接口 For DEDE_v5.X,实现自动登陆,永不过期

这个功能是从以前发布的DEDE预发布http://www.4wei.cn/archives/444)程序中剥离出来的。可以实现用火车采集器发布时,不需要登陆DEDE后台,特别适合无人值守发布更新。

本方法适用于DEDE所有模型和模块,所有发布模块仅需要添加一处配置参数即可。

实现步骤如下:

  1. 取消DEDE未登陆时出现的登陆提示
  2. 自动登陆DEDE

修改一处DEDE的代码,为DEDE程序管理员目录的config.php,默认路径为dede/config.php,代码如下:

//检验用户登录状态
$cuserLogin = new userLogin();
if($cuserLogin->getUserID()==-1)
{
    header("location:login.php?gotopage=".urlencode($dedeNowurl));
    exit();
}

这段代码的作用是如果未检测到用户的登陆信息,就引导用户进入登陆过程,修改如下:

 //检验用户登录状态
$cuserLogin = new userLogin();
if($cuserLogin->getUserID()==-1)
{
    if($my_u != ''){
        $res = $cuserLogin->checkUser($my_u, $my_p);
        if($res==1) $cuserLogin->keepUser();
 }
    if($cuserLogin->getUserID()==-1)
    {
        header("location:login.php?gotopage=".urlencode($dedeNowurl));
        exit();
    }
}

这段代码的作用是在检测到用户未登陆时,尝试使用页面传递过来的参数进行登陆,如果登陆成功,则保存用户的信息并进行其它操作;如果登陆失败,就引导用户进入登陆页面。

这段代码修改完成,接下来要修改火车采集器的发布模块了。

尘缘做过的火车采集器的发布模块可以在这里下载:

  1. V5.7所有发布模块
  2. V5.6/V5.3等所有发布模块

修改发布模块,只需要在发布模块中添加登陆的用户名和密码信息,修改如图:

PS:这段时间刚刚搬了新服务器,欢迎各位同志与交换友情链接哈。http://www.4wei.cn/aboutme/links

火车采集器发布DEDEv5.7图集失败的解决办法

DEDE5.7升级时,对代码进行了重构,以兼容PHP5.3,但部份代码升级时测试不到位,出现了一些问题。

以下为5.6时的代码,覆盖上来即可解决。正确的代码未研究,额。

/**
 *  获得网址的host和query部份
 *
 * @access    public
 * @param     string  $gurl  调整地址
 * @return    string
 */
function GetHostInfo($gurl)
{
	$gurl = eregi_replace("^http://","",trim($gurl));
	$garr['host'] = eregi_replace("/(.*)$","",$gurl);
	$garr['query'] = "/".eregi_replace("^([^/]*)/","",$gurl);
	return $garr;
}

火车采集器自动采集自动换IP

采集ezinearticles.com和搜索引擎的数据的时候,同一个IP采集数据太多,就会引起封IP的问题,下面推荐的软件可以通过路由的拨号功能,更换掉当前电脑的IP。

这厮支持自动定时换IP,配合火车采集器定时采集、定时更新,乃杀人越货之神器!

之前上传的文件报有木马文件,重新找了一个版本。
FuckRouter

火车采集器多语种翻译插件[支持Google/有道翻译API]

很多火车采集器用户,都能在短时间内采集大量数据,但无法解决内容收录问题。虽然内容数量过万千级,但收录可能只有百千级。

有的用户建议火车采集器增加一些伪原创功能,考虑到火车采集器只是一款功能强大的数据采集软件,站群和优化概念不强,估计伪原创功能不会提升太多。

好在火车采集器是唯一一款支持多语言插件的采集器,支持PHP、C内置插件,我们可以根据需要开发自己想要的优化功能。

火车采集器多语种翻译插件,是一款支持Google翻译、有道翻译的插件,目前内置了Google和Youdou翻译API,支持多国语言翻译,包括汉英、英汉等大多数常见语种。目前没有加入Bing翻译是因为Bing的长句翻译速度太慢。

压缩包中的文件直接解压到LocoySpider\Plugins目录下,然后在任务-高级设置-插件设置,保存时使用Translate.php即可。

本插件免费发布,适用于标准版及以上版本!


<?php
/*
**火车采集器通用翻译接口,适用于标准版及以上版本
**作者:尘缘
**博客:http://www.4wei.cn
*/
/* 有内容标签时,将内容标签翻译成英文 */
if(isset($LabelArray['内容']) && $LabelArray['内容'])
{
 require('Translate/GoogleTranslate.class.php');
 $Google = new GoogleTranslate();
 $Google->translate($LabelArray['内容'], 'zh-CN', 'en');

 $LabelArray['内容'] = $Google->result;

 /*Google翻译为空时,使用有道翻译*/
 if(!$LabelArray['内容'])
 {
  require('Translate/YouDaoTranslate.class.php');
  $Youdao = new YouDaoTranslate();
  $Youdao->translate($LabelArray['内容'], 'ZH_CN2EN');
  $LabelArray['内容'] = $Youdao->result;
 }
}

echo serialize($LabelArray);
?>

下载地址:http://www.4wei.cn/archives/1000487