Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[教程] 利用第三方模块同步其它网站数据

[复制链接]
rohv 发表于 2012-6-27 20:33:05 | 显示全部楼层 |阅读模式
本帖最后由 rohv 于 2012-6-27 20:37 编辑

参考官方文档:http://dev.discuz.org/wiki/index.php?title=%E7%AC%AC%E4%B8%89%E6%96%B9DIY%E6%A8%A1%E5%9D%97%E6%8B%93%E5%B1%95%E7%B1%BB%E7%9A%84%E5%BC%80%E5%8F%91

由于近来忙,怠慢之处见谅

第一步:在网站根文件夹建立“1.php”文件,写入以下数据:
  1. <?php

  2. define('CHARSET', 'GBK'); //服务器端数据编码
  3. require './source/class/class_xml.php'; //XML格式的文档和array的相互转换的类
  4. error_reporting(7);

  5. $charset = $_GET['charset'] ? $_GET['charset'] : $_POST['charset']; //客户端数据编码
  6. //数据转码
  7. if(strtoupper($charset) != CHARSET) {
  8. foreach($POST as $key => $value) {
  9. $POST[$key] = iconv($charset, CHARSET, $value);
  10. }
  11. foreach($GET as $key => $value) {
  12. $GET[$key] = iconv($charset, CHARSET, $value);
  13. }
  14. }

  15. $data = array('html'=>'', 'data'=>''); //初始化要返回数据
  16. $sign = $_GET['sign'] ? $_GET['sign'] : $_POST['sign']; //获取客户端请求数据的签名
  17. $clientid = $_GET['clientid'] ? $_GET['clientid'] : $_POST['clientid']; //客户端ID

  18. $client = get_client_by_clientid($clientid); //得到客户端的相关信息
  19. if(empty($client)) { //客户端不存在
  20. exit('CLIENT_NOT_EXISTS'); //直接返回失败
  21. }

  22. $datasign = ''; //数据签名
  23. if(!empty($_POST)) {
  24. unset($_POST['sign']); //删除签名参数,此参数不参加签名计算
  25. $datasign = get_sign($_POST, $client['key']); //计算数据的签名
  26. } else {
  27. unset($_GET['sign']); //删除签名参数,此参数不参加签名计算
  28. $datasign = get_sign($_GET, $client['key']); //计算数据的签名
  29. }

  30. if($datasign != $sign) { //签名不正确
  31. exit('SIGN_ERROR'); //输入签名错误
  32. }

  33. if($_POST['op'] == 'getdata') { //判断是否为请求数据列表
  34. $datalist = $data = array();//数据列表
  35. $wherearr = array(); //SQL 条件数组

  36. //获取客户端POST参数
  37. $start = intval($_POST['start']); //起始数据行数
  38. $limit = intval($_POST['items']); //要显示多少条数
  39. $bannedids = addslashes($_POST['bannedids']); //客户端屏蔽的IDS
  40. $param1 = addslashes($_POST['param1']); //数据调用参数1,假设此值要求为string型
  41. $param2 = intval($_POST['param2']); //数据调用参数2,假设此值要求为int型

  42. //处理参数1
  43. if(!empty($param1)){
  44. $wherearr[] = "fieldsparam1='$param1'";
  45. }
  46. //处理参数2
  47. if(!empty($param2)) {
  48. $wherearr[] = "fieldsparam2='$param2'";
  49. }
  50. //处理客户端屏蔽的IDS
  51. if(!empty($bannedids)) {
  52. $banids = explode(',', $bannedids);
  53. $wherearr[] = "csid NOT IN (".implode("','", $banids)."')";
  54. }
  55. $where = !empty($wherearr) ? 'WHERE '.implode(' AND ', $wherearr) : ''; //构造条件
  56. /*数据库相关处理
  57. $query = DB::query('SELECT * FROM '.DB::table('tablename')." $where LIMIT $start, $limit"); //SQL查询
  58. while($value = DB::fetch($query)) {
  59. //此处为数据处理逻辑代码
  60. $data[] = $value;
  61. }
  62. */

  63. //以下为临时测试数据,正式环境请根据自己的业务做相关调整
  64. $url = 'http://www.xxx.com/';
  65. $data = range($start, $start + $limit);//构造临时的假数据
  66. foreach($data as $value) {
  67. //需要注意: 除 id, title, url, pic, picflag, summary 几个字段外,其它字段需要放到 fields 数组里。
  68. $datalist[] = array(
  69. 'id' => $value,
  70. 'title' => 'xml_block_title'.$value, //标题
  71. 'url' => $url.'xml_server.php?csid='.$value, //链接地址
  72. 'pic' => $url.'/data/attachment/photo.gif', //图片地址
  73. 'picflag' => '0', //0为url 1为本地 2 为ftp远程;如果图片是DX系统中的图片可以情况设置为1或2,其它情况为0
  74. 'summary' => '', //简介
  75. 'fields' => array( //配置规范中fields中指定的字段
  76. 'author' => 'xml_user'.$value,
  77. 'authorid' => $value,
  78. 'field1' => 'field1value'.$value,
  79. 'field2' => 'field2value'.$value
  80. )
  81. );
  82. }
  83. $data['data'] = $datalist;

  84. //如果要返回HTML代码,可直接使用以下代码
  85. //$data['html'] = 'HTML CODE';
  86. $xml = array2xml($data); //转换为XML文档
  87. } else if($_GET['op'] == 'getconfig') {
  88. $xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的内容为 配置规范XML文档示例 的内容
  89. } else {
  90. $xml = 'NO_OPERATION';
  91. }
  92. ob_end_clean();
  93. @header("Expires: -1");
  94. @header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
  95. @header("Pragma: no-cache");
  96. header("Content-type: text/xml");
  97. echo $xml;
  98. exit();

  99. /**
  100. * 获得客户端信息
  101. * @param $clientid
  102. * @return array 客户端信息数组
  103. */
  104. function get_client_by_clientid($clientid){
  105. $client = array();
  106. $clientid = intval($clientid);
  107. if($clientid) {

  108. /*数据库相关处理
  109. $client = DB::fetch_first('SELECT * FROM '.DB::table('clienttable')." clientid='$clientid'"); //SQL查询
  110. */

  111. //以下为临时测试数据,正式环境请根据自己的业务做相关调整
  112. //模拟数据库
  113. $CLIENTSDB = array(
  114. '100000' => array(
  115. 'clientid' => '100000',
  116. 'key' => '*654%#(asd94',
  117. ),
  118. '200000' => array(
  119. 'clientid' => '200000',
  120. 'key' => '1#9!(@@34#94',
  121. ),
  122. '300000' => array(
  123. 'clientid' => '300000',
  124. 'key' => '7$@^8^$7as89',
  125. ),
  126. '400000' => array(
  127. 'clientid' => '400000',
  128. 'key' => '23@#86^%4&32',
  129. ),
  130. );
  131. $client = isset($CLIENTSDB[$clientid]) ? $CLIENTSDB[$clientid] : array();
  132. }
  133. return $client;
  134. }


  135. /**
  136. * 生成签名
  137. * @param array $para 参数数组
  138. * @param string $key 加密密钥
  139. * @return string 签名
  140. */
  141. function get_sign($para, $key = ''){
  142. ksort($para);
  143. $signarr = array();
  144. foreach($para as $k => $v) {
  145. $signarr[] = $k.'='.$v;
  146. }
  147. $sign = implode('&', $signarr);
  148. $sign = md5($sign.$key);
  149. return $sign;
  150. }
  151. ?>
复制代码
注意:不是网站记录的URL来调试的时候,会出现“Access Denied”,那是网站防止文件外部打开的标志,进入“./source/class/class_xml.php”暂时关闭开头的二行:
if(!defined('IN_DISCUZ') || !defined('IN_ADMINCP')) {
exit('Access Denied');}
特别注意:99行时候的“$xml = file_get_contents('block_xml_sample.xml');//block_xml_sample.xml文件中的内容为 配置规范XML文档示例 的内容”;就是这个文件造成很多人安装第三方插件不成功的。这个文件改名称的同时记得要修改1.php的99行;
   特别注意文件block_xml_sample.xml中的“<item id="name"><![CDATA[C/S 数据类]]></item>”中间的“C/S 数据类”就是模块名称;有的时候如“<item id="version"><![CDATA[X1.5]]></item>”版本号不对也会报错;修改为网站的版本即可。
第二步:建立“block_xml_sample.xml”文件,写入如下数据:
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <root>
  3. <item id="Title"><![CDATA[Discuz! Block]]></item>
  4. <item id="Data">
  5. <item id="version"><![CDATA[X1.5]]></item>
  6. <item id="name"><![CDATA[C/S 数据类]]></item>
  7. <item id="fields">
  8. <item id="url">
  9. <item id="name"><![CDATA[链接地址]]></item>
  10. <item id="formtype"><![CDATA[text]]></item>
  11. <item id="datatype"><![CDATA[string]]></item>
  12. </item>
  13. <item id="title">
  14. <item id="name"><![CDATA[标题]]></item>
  15. <item id="formtype"><![CDATA[title]]></item>
  16. <item id="datatype"><![CDATA[title]]></item>
  17. </item>
  18. <item id="pic">
  19. <item id="name"><![CDATA[图片]]></item>
  20. <item id="formtype"><![CDATA[pic]]></item>
  21. <item id="datatype"><![CDATA[pic]]></item>
  22. </item>
  23. <item id="summary">
  24. <item id="name"><![CDATA[简介]]></item>
  25. <item id="formtype"><![CDATA[summary]]></item>
  26. <item id="datatype"><![CDATA[summary]]></item>
  27. </item>
  28. <item id="author">
  29. <item id="name"><![CDATA[作者]]></item>
  30. <item id="formtype"><![CDATA[text]]></item>
  31. <item id="datatype"><![CDATA[text]]></item>
  32. </item>
  33. <item id="authorid">
  34. <item id="name"><![CDATA[作者ID]]></item>
  35. <item id="formtype"><![CDATA[text]]></item>
  36. <item id="datatype"><![CDATA[int]]></item>
  37. </item>
  38. <item id="field1">
  39. <item id="name"><![CDATA[字段1]]></item>
  40. <item id="formtype"><![CDATA[text]]></item>
  41. <item id="datatype"><![CDATA[string]]></item>
  42. </item>
  43. <item id="field2">
  44. <item id="name"><![CDATA[字段2]]></item>
  45. <item id="formtype"><![CDATA[text]]></item>
  46. <item id="datatype"><![CDATA[string]]></item>
  47. </item>
  48. </item>
  49. <item id="getsetting">
  50. <item id="param1">
  51. <item id="title"><![CDATA[数据调用参数1]]></item>
  52. <item id="type"><![CDATA[text]]></item>
  53. <item id="default"><![CDATA[]]></item>
  54. </item>
  55. <item id="param2">
  56. <item id="title"><![CDATA[数据调用参数2]]></item>
  57. <item id="type"><![CDATA[mcheckbox]]></item>
  58. <item id="value">
  59. <item id="0">
  60. <item id="0"><![CDATA[1]]></item>
  61. <item id="1"><![CDATA[选项1]]></item>
  62. </item>
  63. <item id="1">
  64. <item id="0"><![CDATA[2]]></item>
  65. <item id="1"><![CDATA[选项2]]></item>
  66. </item>
  67. </item>
  68. <item id="default"><![CDATA[1]]></item>
  69. </item>
  70. <item id="titlelength">
  71. <item id="title"><![CDATA[标题长度]]></item>
  72. <item id="type"><![CDATA[text]]></item>
  73. <item id="default"><![CDATA[40]]></item>
  74. </item>
  75. <item id="summarylength">
  76. <item id="title"><![CDATA[简介长度]]></item>
  77. <item id="type"><![CDATA[text]]></item>
  78. <item id="default"><![CDATA[80]]></item>
  79. </item>
  80. <item id="start">
  81. <item id="title"><![CDATA[起始数据行数]]></item>
  82. <item id="type"><![CDATA[text]]></item>
  83. <item id="default"><![CDATA[0]]></item>
  84. </item>
  85. </item>
  86. <item id="style">
  87. <item id="0">
  88. <item id="name"><![CDATA[模板名称]]></item>
  89. <item id="template"><![CDATA[<div class="module cl xl xl1"><ul>[loop]<li><em><a href="home.php?uid={authorid}"><FONT COLOR="RED">{author}</FONT></a></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>
  90. </item>
  91. <item id="1">
  92. <item id="name"><![CDATA[模板名称红色]]></item>
  93. <item id="template"><![CDATA[<div class="module cl xl xl1"><ul>[loop]<li><em><font color="red"><a href="home.php?uid={authorid}">{author}</a></font></em><a href="{url}">{title}</a></li>[/loop]</ul></div>]]></item>
  94. </item>
  95. </item>
  96. </item>
  97. </root>
复制代码
第三步:建立第三方模块
  管理平台 》 门户 》 第三方模块 》 添加:
  第三方地址:url/1.php
  客户短ID:200000  见1.php的133行
  签名加密方式:MD5签名
  通信密匙:1#9!(@@34#94
点击提交,完成模块建立工作。
第四步:前台页面调用:
  DIY网页 》 DIY 》 高级模式 》 模块 》 第三方类
  是不是看到刚刚建立的模块了。
  选择调用即可。
第五步:扩展读取任一(包括外部)网页HTML代码数据,新建一个网页“ee.htm”,数据规范如下:
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <root>
  3. <item id="html"><![CDATA[]]></item>
  4. <item id="data">
  5. <item id="0">
  6. <item id="id"><![CDATA[14]]></item>
  7. <item id="title"><![CDATA[xml_block_title14]]></item>
  8. <item id="url"><![CDATA[xml_server.php]]></item>
  9. <item id="pic"><![CDATA[nophoto.gif]]></item>
  10. <item id="picflag"><![CDATA[1]]></item>
  11. <item id="summary"><![CDATA[]]></item>
  12. <item id="fields">
  13. <item id="author"><![CDATA[xml_user14]]></item>
  14. <item id="authorid"><![CDATA[14]]></item>
  15. <item id="field1"><![CDATA[field1value14]]></item>
  16. <item id="field2"><![CDATA[field2value14]]></item>
  17. </item>
  18. </item>
  19. <item id="1">
  20. <item id="id"><![CDATA[15]]></item>
  21. <item id="title"><![CDATA[xml_block_title15]]></item>
  22. <item id="url"><![CDATA[xml_server.php]]></item>
  23. <item id="pic"><![CDATA[nophoto.gif]]></item>
  24. <item id="picflag"><![CDATA[1]]></item>
  25. <item id="summary"><![CDATA[]]></item>
  26. <item id="fields">
  27. <item id="author"><![CDATA[xml_user15]]></item>
  28. <item id="authorid"><![CDATA[15]]></item>
  29. <item id="field1"><![CDATA[field1value15]]></item>
  30. <item id="field2"><![CDATA[field2value15]]></item>
  31. </item>
  32. </item>
  33. </item>
  34. </root>
复制代码
第六步:读取外部网页(ee.htm)时1.PHP的代码:
  适合格式固化的网页使用,安全则自己去加上。
  1. <?php
  2. define('CHARSET', 'GBK'); //服务器端数据编码
  3. if($_POST['op'] == 'getdata') { //判断是否为请求数据列表
  4. $xml = file_get_contents('ee.htm');//读取网页数据 如下传递参数另..
  5. } else if($_GET['op'] == 'getconfig') {
  6. $xml = file_get_contents('block_xml_sample.xml'); //安装时候需要调用的网页;为配置规范XML文档示例
  7. } else {
  8. $xml = 'NO_OPERATION';
  9. }
  10. ob_end_clean();
  11. @header("Expires: -1");
  12. @header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
  13. @header("Pragma: no-cache");
  14. header("Content-type: text/xml");
  15. echo $xml;
  16. exit();
  17. ?>
复制代码
以上的步骤就解决了DZ可以与任一网站数据共享的问题。
 
 
 
 
 
pcyi 发表于 2012-7-1 10:01:48 | 显示全部楼层
这个条用方式很灵活
回复

使用道具 举报

ohalu 发表于 2012-7-20 10:17:03 | 显示全部楼层
試試看~ 會不會成功~
回复

使用道具 举报

shavie 发表于 2012-7-31 22:11:08 | 显示全部楼层
这是好东西啊,不知道有没有人测试成功过?




http://news.fotobase.cn
回复

使用道具 举报

 楼主| rohv 发表于 2012-8-3 12:50:36 | 显示全部楼层
我现在的网站 涉及分类信息的调用 几乎全部是这个方法

见 www.chaichejian.com
回复

使用道具 举报

 楼主| rohv 发表于 2012-9-24 15:32:58 | 显示全部楼层

第三方模块推送有哪个知道?

本帖最后由 rohv 于 2012-11-30 17:18 编辑


第三方模块推送有哪个知道?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-24 00:31 , Processed in 0.038605 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表