最近开发社区 需要采集一些数据,使得模板输出有图文效果。就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 处理起来比较麻烦)。
有了数据就要插入到dz的数据库 ,随便命名一个 test.php 放在discuz 的web根目录下。
操作一下花了点功夫,中间有不少头疼的时候。特记录。
两个注意点,
一 ,Discuz的帖子 存储在帖子表 pre_forum_post ,message字段,这里的图片 和换行 之类都是 bbcode, 插入之前需要先转换
二,Discuz 本身处理发帖的代码位于sourceclassmodelmodel_forum_thread.php,要使用里面的 方法 先要在test.php引入discuz的核心类
require_once'./source/class/class_core.php';
C::app()->init(); // 一定要初始化一下,否则model_forum_thread.php 里的方法 无法使用
Discuz 作为一个老牌社区有近300个表,实现帖子数据插入比较复杂。
刚开始,百度了一下,找到一篇文章记录,感觉比较靠谱。
引用一下:
discuz发表主题涉及的几个表:(这里列出了主要的几个相关的表)
1、主题表pre_forum_thread:这个表一个主要数据就是 tid 主题ID
2、post 分表协调表pre_forum_post_tableid:这里需要获取一个自增的 pid
3、帖子表 pre_forum_post:记录主题pid、fid、tid、title、content等主要信息
4、版块表pre_forum_forum:这里主要更新版块的主题、帖子数量
5、帖子主题审核数据表pre_forum_thread_moderate:这个可以根据自己状况决定,并不是必须的
6、用户统计表pre_common_member_count:主要是更新用户的主题数量
感谢不知名的作者菌,刚搞的时候可以参考,毕竟300 个表里找几个具体的也费功夫呢。
另有 http://discuzt.cr180.com/discuzcode-db.html cr180 discuz 二开大牛提供的 数据库字典 对数据表 有详细索引。
直接上代码段 ,这个在我的本地环境是可以成功插入帖子数据的。
require_once'./source/class/class_core.php';
C::app()->init();
$param=array(
'fid'=>2,//分类id
'uid'=>1, // 发布者的 id
'subject' =>'文章标题333',
'author' =>'大哥哥',
'message'=>'内容位置,实现插入',
'publishdate' =>TIMESTAMP,
'views'=>168,
'tstatus' =>32,
'tags'=>array('good','cool'),
'useip'=> getglobal('clientip'),
'port' =>getglobal('remoteport')
);
//print_r($newImgSrc);
functiondzThread($param){
$newthread = array(
'fid' => $param['fid'],//文章分类板块
'author' => $param['author'],
'authorid'=>$param['uid'],
'subject' => $param['subject'],
'dateline' =>$param['publishdate'],
'lastpost' =>$param['publishdate'],
'lastposter' => $param['author'],
'attachment'=> 0,
'views' =>$param['views'],
'status' =>$param['tstatus'],
'closed' => $param['closed'] ? 1 : 0
);
$tid= C::t('forum_thread')->insert($newthread,true);
C::t('forum_newthread')->insert(array(
'tid' =>$tid,
'fid' => $param['fid'],
'dateline' =>$param['publishdate'],
));
//处理 tags
$param['tagstr'] =addTag($param['tags'], $tid, 'tid');
$pid =insertpost(array(
'fid' => $param['fid'],
'tid' => $tid,
'first'=> '1',
'author' => $param['author'],
'authorid' =>$param['uid'],
'subject' => $param['subject'],
'dateline' =>$param['publishdate'],
'message' => $param['message'],
'useip' =>$param['clientip'],
'port' => $param['remoteport'],
'usesig' =>1,
'attachment' => '0',
'tags' => $param['tagstr'],
'replycredit'=> 0,
'status' => 0
));
}
functioninsertpost($data) {
if(isset($data['tid'])) {
$thread =C::t('forum_thread')->fetch($data['tid']);
$tableid =$thread['posttableid'];
} else {
$tableid = $data['tid'] = 0;
}
echo$data['tid'];
$pid = C::t('forum_post_tableid')->insert(array('pid' =>null), true);
echo '116';
$data = array_merge($data, array('pid' =>$pid));
C::t('forum_post')->insert($tableid, $data);
if($pid % 1024== 0){
C::t('forum_post_tableid')->delete_by_lesspid($pid);
}
savecache('max_post_id',$pid);
return $pid;
}
// discuz 的tag 处理比较麻烦
functionaddTag($tagarray, $itemid, $idtype = 'tid'){
$tagcount =0;
$return='';
foreach($tagarray as $tagname) {
$tagname =trim($tagname);
if(preg_match('/^([x7f-xff_-]|w|s){3,20}$/', $tagname)){
$status = $idtype != 'uid' ? 0 : 3;
$result =C::t('common_tag')->get_bytagname($tagname, $idtype);
if($result['tagid']){
if($result['status'] == $status) {
$tagid = $result['tagid'];
}
}else {
$tagid =C::t('common_tag')->insert($tagname,$status);
}
if($tagid){
if($itemid){
C::t('common_tagitem')->replace($tagid,$itemid,$idtype);
}
$tagcount++;
$return.= $tagid.','.$tagname."t";
}
if($tagcount > 4){
unset($tagarray);
break;
}
}
}
return$return;
}
呵呵哒,结合采集代码 给$param数组 传数据 就可以了。