最近开发社区 需要采集一些数据,使得模板输出有图文效果。就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 处理起来比较麻烦)。 有了数据 就要插入到dz的数据库 ,随便命名一个 test.php 放在discuz 的web根目录下。 操作一下 花了点功夫,中间有不少头疼的时候。特记录。 两个注意点, 一 ,Discuz的帖子 存储在帖子表 pre_forum_post ,message 字段,这里的图片 和换行 之类都是 bbcode, 插入之前需要先转换 二,Discuz 本身处理发帖的代码 位于\source\class\model\model_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); function dzThread($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 ));
}
function insertpost($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 处理比较麻烦 function addTag($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数组 传数据 就可以了。 |