首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

discuz x3 uc_client/client.php接口文件分析

ARCHY 2015-6-13 [Discuz开发] 来自PC 复制链接
19948
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz x3 uc_client/client.php接口文件分析,做UC一些接口开发的可以参考,具体看如下代码吧

  1. <?php

  2. /*
  3.         [UCenter] (C)2001-2099 Comsenz Inc.
  4.         This is NOT a freeware, use is subject to license terms

  5.         $Id: client.php 1079 2011-04-02 07:29:36Z zhengqingpeng $
  6. */

  7. if(!defined('UC_API')) {
  8.         exit('Access denied');
  9. }

  10. error_reporting(0);//不显示所有错误提示

  11. define('IN_UC', TRUE);
  12. define('UC_CLIENT_VERSION', '1.6.0');
  13. define('UC_CLIENT_RELEASE', '20110501');
  14. define('UC_ROOT', substr(__FILE__, 0, -10));//http://localhost/discuz3/uc_client/
  15. define('UC_DATADIR', UC_ROOT.'./data/');
  16. define('UC_DATAURL', UC_API.'/data');
  17. define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post');
  18. $GLOBALS['uc_controls'] = array();

  19. function uc_addslashes($string, $force = 0, $strip = FALSE) {
  20.         !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  21.         if(!MAGIC_QUOTES_GPC || $force) {
  22.                 if(is_array($string)) {
  23.                         foreach($string as $key => $val) {
  24.                                 $string[$key] = uc_addslashes($val, $force, $strip);
  25.                         }
  26.                 } else {
  27.                         $string = addslashes($strip ? stripslashes($string) : $string);
  28.                 }
  29.         }
  30.         return $string;
  31. }

  32. if(!function_exists('daddslashes')) {
  33.         function daddslashes($string, $force = 0) {
  34.                 return uc_addslashes($string, $force);
  35.         }
  36. }

  37. function uc_stripslashes($string) {
  38.         !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  39.         if(MAGIC_QUOTES_GPC) {
  40.                 return stripslashes($string);
  41.         } else {
  42.                 return $string;
  43.         }
  44. }

  45. //将数据通过socket发送到ucenter
  46. //模拟浏览器访问
  47. function uc_api_post($module, $action, $arg = array()) {
  48.         $s = $sep = '';
  49.         foreach($arg as $k => $v) {
  50.                 $k = urlencode($k);
  51.                 if(is_array($v)) {
  52.                         $s2 = $sep2 = '';
  53.                         foreach($v as $k2 => $v2) {
  54.                                 $k2 = urlencode($k2);
  55.                                 $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
  56.                                 $sep2 = '&';
  57.                         }
  58.                         $s .= $sep.$s2;
  59.                 } else {
  60.                         $s .= "$sep$k=".urlencode(uc_stripslashes($v));
  61.                 }
  62.                 $sep = '&';
  63.         }
  64.         //返回传递给index.php文件的参数字符串,做为http协议头信息的一部分
  65.         $postdata = uc_api_requestdata($module, $action, $s);
  66.         //向http://localhost/discuz3/uc_server/index.php文件传递post数据
  67.         return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
  68. }
  69. /*
  70. * $module:其实就是uc_server/control/下的控制器
  71. * $action:其实就是uc_server/control/下控制器中的方法
  72. */
  73. function uc_api_requestdata($module, $action, $arg='', $extra='') {
  74.         $input = uc_api_input($arg);
  75.         //拼接http协议头
  76.         $post = "m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra;
  77.         return $post;
  78. }

  79. function uc_api_url($module, $action, $arg='', $extra='') {
  80.         $url = UC_API.'/index.php?'.uc_api_requestdata($module, $action, $arg, $extra);
  81.         return $url;
  82. }

  83. function uc_api_input($data) {
  84.         //define('UC_KEY', '10Eewf2cB5i9j5f833se1aL2k7w6T9L540seh2I9R4neQcqf4667q1E273Odkf2a');
  85.         $s = urlencode(uc_authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', UC_KEY));
  86.         return $s;
  87. }

  88. function uc_api_mysql($model, $action, $args=array()) {
  89.         global $uc_controls;
  90.         if(empty($uc_controls[$model])) {
  91.                 include_once UC_ROOT.'./lib/db.class.php';//数据库操作类
  92.                 include_once UC_ROOT.'./model/base.php';//基础类
  93.                 include_once UC_ROOT."./control/$model.php";//控制器类:1、继承base基础类 2、类名为{$model}control,如:usercontrol
  94.                 //创建一个控制器类,如:new usercontrol();
  95.                 eval("\$uc_controls['$model'] = new {$model}control();");
  96.         }
  97.         if($action{0} != '_') {
  98.                 $args = uc_addslashes($args, 1, TRUE);
  99.                 $action = 'on'.$action;//控制器中的方法:以on开头
  100.                 $uc_controls[$model]->input = $args;//将传递过来的参数以键值对形式赋值给控制器的input属性(数组形式)
  101.                 return $uc_controls[$model]->$action($args);//调用控制器中的方法,并返回结果
  102.         } else {
  103.                 return '';
  104.         }
  105. }

  106. //序列化数据
  107. function uc_serialize($arr, $htmlon = 0) {
  108.         include_once UC_ROOT.'./lib/xml.class.php';
  109.         return xml_serialize($arr, $htmlon);
  110. }

  111. //反序列化数据
  112. function uc_unserialize($s) {
  113.         include_once UC_ROOT.'./lib/xml.class.php';
  114.         return xml_unserialize($s);
  115. }

  116. /*
  117. * string:用来接收需要加密或解密的字符串
  118. * operation:用来设置我要进行加密(ENCODE)或者解密(DECODE),默认是解密
  119. * key:这是一个加密密钥,让使用者能根据自己的想法进行加密,如果不设置默认使用ucenter的通讯key的md5(key),这样做是问了尽可能的安全
  120. * expiry:明文key有效期
  121. */
  122. function uc_authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {

  123.         $ckey_length = 4;//动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙

  124.         $key = md5($key ? $key : UC_KEY);//默认key为32位md5加密
  125.         $keya = md5(substr($key, 0, 16));//将key的前后16位分开,密匙a会参与加解密
  126.         $keyb = md5(substr($key, 16, 16));//密匙b会用来做数据完整性验证
  127.         $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';//密匙c用于变化生成的密文

  128.         $cryptkey = $keya.md5($keya.$keyc);//PHP加密解密函数authcode参与运算的密匙
  129.         $key_length = strlen($cryptkey);
  130.         
  131.         //明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
  132.         //如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  133.         $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  134.         $string_length = strlen($string);

  135.         $result = '';
  136.         $box = range(0, 255);

  137.         $rndkey = array();
  138.         //PHP加密解密函数authcode产生密匙簿
  139.         for($i = 0; $i <= 255; $i++) {
  140.                 $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  141.         }
  142.         //用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  143.         for($j = $i = 0; $i < 256; $i++) {
  144.                 $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  145.                 $tmp = $box[$i];
  146.                 $box[$i] = $box[$j];
  147.                 $box[$j] = $tmp;
  148.         }
  149.         //PHP加密解密函数authcode核心加解密部分
  150.         for($a = $j = $i = 0; $i < $string_length; $i++) {
  151.                 $a = ($a + 1) % 256;
  152.                 $j = ($j + $box[$a]) % 256;
  153.                 $tmp = $box[$a];
  154.                 $box[$a] = $box[$j];
  155.                 $box[$j] = $tmp;
  156.                 //PHP加密解密函数authcode从密匙簿得出密匙进行异或,再转成字符
  157.                 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  158.         }

  159.         if($operation == 'DECODE') {
  160.                 /*
  161.                  * substr($result, 0, 10) == 0 验证数据有效性
  162.                  * substr($result, 0, 10) - time() > 0 验证数据有效性
  163.                  * substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
  164.                  */
  165.                 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  166.                         return substr($result, 26);
  167.                 } else {
  168.                         return '';
  169.                 }
  170.         } else {
  171.                 //PHP加密解密函数authcode把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  172.                 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  173.                 return $keyc.str_replace('=', '', base64_encode($result));
  174.         }
  175. }

  176. //uc_fopen2调用uc_fopen模拟浏览器进行访问
  177. /**
  178. *  远程打开URL
  179. *  @param string $url                打开的url, 如 http://www.baidu.com/123.htm
  180. *  @param int $limit                取返回的数据的长度
  181. *  @param string $post                要发送的 POST 数据,如uid=1&password=1234
  182. *  @param string $cookie        要模拟的 COOKIE 数据,如uid=123&auth=a2323sd2323
  183. *  @param bool $bysocket        TRUE/FALSE 是否通过SOCKET打开
  184. *  @param string $ip                IP地址
  185. *  @param int $timeout                连接超时时间
  186. *  @param bool $block                是否为阻塞模式
  187. *  @return                        取到的字符串
  188. */
  189. function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
  190.         $__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;
  191.         if($__times__ > 2) {
  192.                 return '';
  193.         }
  194.         $url .= (strpos($url, '?') === FALSE ? '?' : '&')."__times__=$__times__";
  195.         //uc_fopen使用fsockopen模拟浏览器访问
  196.         return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block);
  197. }

  198. //uc_fopen使用fsockopen模拟浏览器进行访问
  199. function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {//block为是否阻塞:1-为阻塞同步模式,0-为非阻塞异步模式
  200.         $return = '';
  201.         $matches = parse_url($url);
  202.         !isset($matches['host']) && $matches['host'] = '';
  203.         !isset($matches['path']) && $matches['path'] = '';
  204.         !isset($matches['query']) && $matches['query'] = '';
  205.         !isset($matches['port']) && $matches['port'] = '';
  206.         $host = $matches['host'];//主机名
  207.         //path:?之前的脚本名称,如:"/index.php";query:?之后的键值对参数列表,如:"参数1=值1&参数2=值2"
  208.         $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
  209.         $port = !empty($matches['port']) ? $matches['port'] : 80;//端口
  210.         if($post) {//有post数据的情况
  211.                 $out = "POST $path HTTP/1.0\r\n";
  212.                 $out .= "Accept: */*\r\n";
  213.                 //$out .= "Referer: $boardurl\r\n";
  214.                 $out .= "Accept-Language: zh-cn\r\n";
  215.                 $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
  216.                 $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  217.                 $out .= "Host: $host\r\n";
  218.                 $out .= 'Content-Length: '.strlen($post)."\r\n";
  219.                 $out .= "Connection: Close\r\n";
  220.                 $out .= "Cache-Control: no-cache\r\n";
  221.                 $out .= "Cookie: $cookie\r\n\r\n";
  222.                 $out .= $post;
  223.         } else {//无post数据的情况
  224.                 $out = "GET $path HTTP/1.0\r\n";
  225.                 $out .= "Accept: */*\r\n";
  226.                 //$out .= "Referer: $boardurl\r\n";
  227.                 $out .= "Accept-Language: zh-cn\r\n";
  228.                 $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  229.                 $out .= "Host: $host\r\n";
  230.                 $out .= "Connection: Close\r\n";
  231.                 $out .= "Cookie: $cookie\r\n\r\n";
  232.         }

  233.         if(function_exists('fsockopen')) {//fsockopen()函数以socket模拟HTTP协议(POST)
  234.                 $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
  235.         } elseif (function_exists('pfsockopen')) {//打开网络的socket持续链接
  236.                 $fp = @pfsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
  237.         } else {
  238.                 $fp = false;
  239.         }

  240.         if(!$fp) {
  241.                 return '';
  242.         } else {
  243.                 stream_set_blocking($fp, $block);//默认$block为TRUE 为阻塞状态,需要等待执行
  244.                 stream_set_timeout($fp, $timeout);//设置超时时间
  245.                 @fwrite($fp, $out);//模拟浏览器发送数据
  246.                 //获取句柄状态
  247.                 $status = stream_get_meta_data($fp);//跟stream_set_timeout配合使用,如果没有stream_set_timeout,那么stream_get_meta_data返回数组中time_out为空,反之为1
  248.                 if(!$status['timed_out']) {
  249.                         while (!feof($fp)) {//fgets()函数:逐行读取
  250.                                 if(($header = @fgets($fp)) && ($header == "\r\n" ||  $header == "\n")) {
  251.                                         break;
  252.                                 }
  253.                         }

  254.                         $stop = false;
  255.                         while(!feof($fp) && !$stop) {
  256.                                 //读取服务端返回的8192字长
  257.                                 $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
  258.                                 $return .= $data;//返回请求的数据
  259.                                 if($limit) {
  260.                                         $limit -= strlen($data);//自减已经读取的
  261.                                         $stop = $limit <= 0;//limit是否小于等于零
  262.                                 }
  263.                         }
  264.                 }
  265.                 @fclose($fp);//关闭socket流连接
  266.                 return $return;//返回请求的数据
  267.         }
  268. }

  269. function uc_app_ls() {
  270.         //调用uc_client/control/app.php控制器文件中的onls函数
  271.         $return = call_user_func(UC_API_FUNC, 'app', 'ls', array());
  272.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  273. }

  274. function uc_feed_add($icon, $uid, $username, $title_template='', $title_data='', $body_template='', $body_data='', $body_general='', $target_ids='', $images = array()) {
  275.         //调用uc_client/control/feed.php控制器文件中的onadd函数
  276.         return call_user_func(UC_API_FUNC, 'feed', 'add',
  277.                 array(  'icon'=>$icon,
  278.                         'appid'=>UC_APPID,
  279.                         'uid'=>$uid,
  280.                         'username'=>$username,
  281.                         'title_template'=>$title_template,
  282.                         'title_data'=>$title_data,
  283.                         'body_template'=>$body_template,
  284.                         'body_data'=>$body_data,
  285.                         'body_general'=>$body_general,
  286.                         'target_ids'=>$target_ids,
  287.                         'image_1'=>$images[0]['url'],
  288.                         'image_1_link'=>$images[0]['link'],
  289.                         'image_2'=>$images[1]['url'],
  290.                         'image_2_link'=>$images[1]['link'],
  291.                         'image_3'=>$images[2]['url'],
  292.                         'image_3_link'=>$images[2]['link'],
  293.                         'image_4'=>$images[3]['url'],
  294.                         'image_4_link'=>$images[3]['link']
  295.                 )
  296.         );
  297. }

  298. function uc_feed_get($limit = 100, $delete = TRUE) {
  299.         //调用uc_client/control/feed.php控制器文件中的onget函数
  300.         $return = call_user_func(UC_API_FUNC, 'feed', 'get', array('limit'=>$limit, 'delete'=>$delete));
  301.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  302. }

  303. function uc_friend_add($uid, $friendid, $comment='') {
  304.         //调用uc_client/control/friend.php控制器文件中的onadd函数
  305.         return call_user_func(UC_API_FUNC, 'friend', 'add', array('uid'=>$uid, 'friendid'=>$friendid, 'comment'=>$comment));
  306. }

  307. function uc_friend_delete($uid, $friendids) {
  308.         //调用uc_client/control/friend.php控制器文件中的ondelete函数
  309.         return call_user_func(UC_API_FUNC, 'friend', 'delete', array('uid'=>$uid, 'friendids'=>$friendids));
  310. }

  311. function uc_friend_totalnum($uid, $direction = 0) {
  312.         //调用uc_client/control/friend.php控制器文件中的totalnum函数
  313.         return call_user_func(UC_API_FUNC, 'friend', 'totalnum', array('uid'=>$uid, 'direction'=>$direction));
  314. }

  315. function uc_friend_ls($uid, $page = 1, $pagesize = 10, $totalnum = 10, $direction = 0) {
  316.         //调用uc_client/control/friend.php控制器文件中的onls函数
  317.         $return = call_user_func(UC_API_FUNC, 'friend', 'ls', array('uid'=>$uid, 'page'=>$page, 'pagesize'=>$pagesize, 'totalnum'=>$totalnum, 'direction'=>$direction));
  318.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  319. }

  320. /*
  321. * 作用:本接口函数用于新用户的注册
  322. * username:用户名
  323. * password:密码
  324. * email:邮箱
  325. * questionid:安全提问索引
  326. * answer:安全提问答案
  327. * return:
  328. *      大于 0:返回用户 ID,表示用户注册成功
  329.         -1:用户名不合法
  330.         -2:包含不允许注册的词语
  331.         -3:用户名已经存在
  332.         -4:Email 格式有误
  333.         -5:Email 不允许注册
  334.         -6:该 Email 已经被注册
  335. */
  336. function uc_user_register($username, $password, $email, $questionid = '', $answer = '', $regip = '') {
  337.         //调用uc_client/control/user.php控制器文件中的onregister函数
  338.         return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer, 'regip' => $regip));
  339. }

  340. function uc_user_login($username, $password, $isuid = 0, $checkques = 0, $questionid = '', $answer = '') {
  341.         $isuid = intval($isuid);//0-用户名登录  1-uid登录
  342.         /*
  343.          * 回调函数:调用client.php文件中的uc_api_mysql函数
  344.          * UC_API_FUNC:要调用的函数名,uc_api_mysql
  345.          * user:控制器,传递给uc_api_mysql函数的参数1
  346.          * login:控制器中要调用的方法,传递给uc_api_mysql函数的参数2
  347.          * array():给控制器中要调用的方法传递参数,传递给uc_api_mysql函数的参数3
  348.          */
  349.         //调用uc_client/control/user.php控制器文件中的onlogin函数
  350.         $return = call_user_func(UC_API_FUNC, 'user', 'login', array('username'=>$username, 'password'=>$password, 'isuid'=>$isuid, 'checkques'=>$checkques, 'questionid'=>$questionid, 'answer'=>$answer));
  351.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  352. }

  353. function uc_user_synlogin($uid) {
  354.         $uid = intval($uid);
  355.         //载入应用缓存文件
  356.         if(@include UC_ROOT.'./data/cache/apps.php') {
  357.                 if(count($_CACHE['apps']) > 1) {
  358.                         //将数据通过socket发送到ucenter,即:http://localhost/discuz3/uc_server
  359.                         //调用uc_server/control/user.php文件中的onsynlogin函数
  360.                         $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
  361.                 } else {
  362.                         $return = '';
  363.                 }
  364.         }
  365.         return $return;
  366. }

  367. function uc_user_synlogout() {
  368.         if(@include UC_ROOT.'./data/cache/apps.php') {
  369.                 if(count($_CACHE['apps']) > 1) {
  370.                         //调用uc_server/control/user.php文件中的onsynlogout函数
  371.                         $return = uc_api_post('user', 'synlogout', array());
  372.                 } else {
  373.                         $return = '';
  374.                 }
  375.         }
  376.         return $return;
  377. }

  378. function uc_user_edit($username, $oldpw, $newpw, $email, $ignoreoldpw = 0, $questionid = '', $answer = '') {
  379.         //调用uc_client/control/user.php控制器文件中的onedit函数
  380.         return call_user_func(UC_API_FUNC, 'user', 'edit', array('username'=>$username, 'oldpw'=>$oldpw, 'newpw'=>$newpw, 'email'=>$email, 'ignoreoldpw'=>$ignoreoldpw, 'questionid'=>$questionid, 'answer'=>$answer));
  381. }

  382. function uc_user_delete($uid) {
  383.         //调用uc_client/control/user.php控制器文件中的ondelete函数
  384.         return call_user_func(UC_API_FUNC, 'user', 'delete', array('uid'=>$uid));
  385. }

  386. function uc_user_deleteavatar($uid) {
  387.         //调用uc_server/control/user.php控制器文件中的ondeleteavatar函数
  388.         uc_api_post('user', 'deleteavatar', array('uid'=>$uid));
  389. }

  390. function uc_user_checkname($username) {
  391.         //调用uc_client/control/user.php控制器文件中的oncheck_username函数
  392.         return call_user_func(UC_API_FUNC, 'user', 'check_username', array('username'=>$username));
  393. }

  394. function uc_user_checkemail($email) {
  395.         //调用uc_client/control/user.php控制器文件中的oncheck_email函数
  396.         return call_user_func(UC_API_FUNC, 'user', 'check_email', array('email'=>$email));
  397. }

  398. function uc_user_addprotected($username, $admin='') {
  399.         //调用uc_client/control/user.php控制器文件中的onaddprotected函数
  400.         return call_user_func(UC_API_FUNC, 'user', 'addprotected', array('username'=>$username, 'admin'=>$admin));
  401. }

  402. function uc_user_deleteprotected($username) {
  403.         //调用uc_client/control/user.php控制器文件中的ondeleteprotected函数
  404.         return call_user_func(UC_API_FUNC, 'user', 'deleteprotected', array('username'=>$username));
  405. }

  406. function uc_user_getprotected() {
  407.         //调用uc_client/control/user.php控制器文件中的ongetprotected函数
  408.         $return = call_user_func(UC_API_FUNC, 'user', 'getprotected', array('1'=>1));
  409.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  410. }

  411. function uc_get_user($username, $isuid=0) {
  412.         //调用uc_client/control/user.php控制器文件中的onget_user函数
  413.         $return = call_user_func(UC_API_FUNC, 'user', 'get_user', array('username'=>$username, 'isuid'=>$isuid));
  414.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  415. }

  416. function uc_user_merge($oldusername, $newusername, $uid, $password, $email) {
  417.         //调用uc_client/control/user.php控制器文件中的onmerge函数
  418.         return call_user_func(UC_API_FUNC, 'user', 'merge', array('oldusername'=>$oldusername, 'newusername'=>$newusername, 'uid'=>$uid, 'password'=>$password, 'email'=>$email));
  419. }

  420. function uc_user_merge_remove($username) {
  421.         //调用uc_client/control/user.php控制器文件中的onmerge_remove函数
  422.         return call_user_func(UC_API_FUNC, 'user', 'merge_remove', array('username'=>$username));
  423. }

  424. function uc_user_getcredit($appid, $uid, $credit) {
  425.         //调用uc_server/control/user.php控制器文件中的ongetcredit函数
  426.         return uc_api_post('user', 'getcredit', array('appid'=>$appid, 'uid'=>$uid, 'credit'=>$credit));
  427. }

  428. function uc_pm_location($uid, $newpm = 0) {
  429.         //调用uc_server/control/pm_client.php控制器文件中的onls函数
  430.         $apiurl = uc_api_url('pm_client', 'ls', "uid=$uid", ($newpm ? '&folder=newbox' : ''));
  431.         @header("Expires: 0");
  432.         @header("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
  433.         @header("Pragma: no-cache");
  434.         @header("location: $apiurl");
  435. }

  436. function uc_pm_checknew($uid, $more = 0) {
  437.         //调用uc_client/control/pm.php控制器文件中的oncheck_newpm函数
  438.         $return = call_user_func(UC_API_FUNC, 'pm', 'check_newpm', array('uid'=>$uid, 'more'=>$more));
  439.         return (!$more || UC_CONNECT == 'mysql') ? $return : uc_unserialize($return);
  440. }

  441. function uc_pm_send($fromuid, $msgto, $subject, $message, $instantly = 1, $replypmid = 0, $isusername = 0, $type = 0) {
  442.         if($instantly) {//直接发送短消息
  443.                 $replypmid = @is_numeric($replypmid) ? $replypmid : 0;
  444.                 //调用uc_client/control/pm.php控制器文件中的onsendpm函数
  445.                 return call_user_func(UC_API_FUNC, 'pm', 'sendpm', array('fromuid'=>$fromuid, 'msgto'=>$msgto, 'subject'=>$subject, 'message'=>$message, 'replypmid'=>$replypmid, 'isusername'=>$isusername, 'type' => $type));
  446.         } else {
  447.                 $fromuid = intval($fromuid);
  448.                 $subject = rawurlencode($subject);
  449.                 $msgto = rawurlencode($msgto);
  450.                 $message = rawurlencode($message);
  451.                 $replypmid = @is_numeric($replypmid) ? $replypmid : 0;
  452.                 $replyadd = $replypmid ? "&pmid=$replypmid&do=reply" : '';
  453.                 //调用uc_server/control/pm_client.php控制器文件中的onsend函数
  454.                 $apiurl = uc_api_url('pm_client', 'send', "uid=$fromuid", "&msgto=$msgto&subject=$subject&message=$message$replyadd");
  455.                 @header("Expires: 0");
  456.                 @header("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
  457.                 @header("Pragma: no-cache");
  458.                 @header("location: ".$apiurl);
  459.         }
  460. }

  461. function uc_pm_delete($uid, $folder, $pmids) {
  462.         //调用uc_client/control/pm.php控制器文件中的ondelete函数
  463.         return call_user_func(UC_API_FUNC, 'pm', 'delete', array('uid'=>$uid, 'pmids'=>$pmids));
  464. }

  465. function uc_pm_deleteuser($uid, $touids) {
  466.         //调用uc_client/control/pm.php文件中的ondeleteuser函数
  467.         return call_user_func(UC_API_FUNC, 'pm', 'deleteuser', array('uid'=>$uid, 'touids'=>$touids));
  468. }

  469. function uc_pm_deletechat($uid, $plids, $type = 0) {
  470.         //调用uc_client/control/pm.php文件中的ondeletechat函数
  471.         return call_user_func(UC_API_FUNC, 'pm', 'deletechat', array('uid'=>$uid, 'plids'=>$plids, 'type'=>$type));
  472. }

  473. function uc_pm_readstatus($uid, $uids, $plids = array(), $status = 0) {
  474.         //调用uc_client/control/pm.php文件中的onreadstatus函数
  475.         return call_user_func(UC_API_FUNC, 'pm', 'readstatus', array('uid'=>$uid, 'uids'=>$uids, 'plids'=>$plids, 'status'=>$status));
  476. }

  477. function uc_pm_list($uid, $page = 1, $pagesize = 10, $folder = 'inbox', $filter = 'newpm', $msglen = 0) {
  478.         $uid = intval($uid);
  479.         $page = intval($page);
  480.         $pagesize = intval($pagesize);
  481.         //调用uc_client/control/pm.php文件中的onls函数
  482.         $return = call_user_func(UC_API_FUNC, 'pm', 'ls', array('uid'=>$uid, 'page'=>$page, 'pagesize'=>$pagesize, 'filter'=>$filter, 'msglen'=>$msglen));
  483.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  484. }

  485. function uc_pm_ignore($uid) {
  486.         $uid = intval($uid);
  487.         //调用uc_client/control/pm.php文件中的onignore函数
  488.         return call_user_func(UC_API_FUNC, 'pm', 'ignore', array('uid'=>$uid));
  489. }

  490. function uc_pm_view($uid, $pmid = 0, $touid = 0, $daterange = 1, $page = 0, $pagesize = 10, $type = 0, $isplid = 0) {
  491.         $uid = intval($uid);
  492.         $touid = intval($touid);
  493.         $page = intval($page);
  494.         $pagesize = intval($pagesize);
  495.         $pmid = @is_numeric($pmid) ? $pmid : 0;
  496.         //调用uc_client/control/pm.php文件中的onview函数
  497.         $return = call_user_func(UC_API_FUNC, 'pm', 'view', array('uid'=>$uid, 'pmid'=>$pmid, 'touid'=>$touid, 'daterange'=>$daterange, 'page' => $page, 'pagesize' => $pagesize, 'type'=>$type, 'isplid'=>$isplid));
  498.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  499. }

  500. function uc_pm_view_num($uid, $touid, $isplid) {
  501.         $uid = intval($uid);
  502.         $touid = intval($touid);
  503.         $isplid = intval($isplid);
  504.         //调用uc_client/control/pm.php文件中的onviewnum函数
  505.         return call_user_func(UC_API_FUNC, 'pm', 'viewnum', array('uid' => $uid, 'touid' => $touid, 'isplid' => $isplid));
  506. }

  507. function uc_pm_viewnode($uid, $type, $pmid) {
  508.         $uid = intval($uid);
  509.         $type = intval($type);
  510.         $pmid = @is_numeric($pmid) ? $pmid : 0;
  511.         //调用uc_client/control/pm.php文件中的onviewnode函数
  512.         $return = call_user_func(UC_API_FUNC, 'pm', 'viewnode', array('uid'=>$uid, 'type'=>$type, 'pmid'=>$pmid));
  513.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  514. }

  515. function uc_pm_chatpmmemberlist($uid, $plid = 0) {
  516.         $uid = intval($uid);
  517.         $plid = intval($plid);
  518.         //调用uc_client/control/pm.php文件中的onchatpmmemberlist函数
  519.         $return = call_user_func(UC_API_FUNC, 'pm', 'chatpmmemberlist', array('uid'=>$uid, 'plid'=>$plid));
  520.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  521. }

  522. function uc_pm_kickchatpm($plid, $uid, $touid) {
  523.         $uid = intval($uid);
  524.         $plid = intval($plid);
  525.         $touid = intval($touid);
  526.         //调用uc_client/control/pm.php文件中的onkickchatpm函数
  527.         return call_user_func(UC_API_FUNC, 'pm', 'kickchatpm', array('uid'=>$uid, 'plid'=>$plid, 'touid'=>$touid));
  528. }

  529. function uc_pm_appendchatpm($plid, $uid, $touid) {
  530.         $uid = intval($uid);
  531.         $plid = intval($plid);
  532.         $touid = intval($touid);
  533.         //调用uc_client/control/pm.php文件中的onappendchatpm函数
  534.         return call_user_func(UC_API_FUNC, 'pm', 'appendchatpm', array('uid'=>$uid, 'plid'=>$plid, 'touid'=>$touid));
  535. }

  536. function uc_pm_blackls_get($uid) {
  537.         $uid = intval($uid);
  538.         //调用uc_client/control/pm.php文件中的onblackls_get函数
  539.         return call_user_func(UC_API_FUNC, 'pm', 'blackls_get', array('uid'=>$uid));
  540. }

  541. function uc_pm_blackls_set($uid, $blackls) {
  542.         $uid = intval($uid);
  543.         //调用uc_client/control/pm.php文件中的onblackls_set函数
  544.         return call_user_func(UC_API_FUNC, 'pm', 'blackls_set', array('uid'=>$uid, 'blackls'=>$blackls));
  545. }

  546. function uc_pm_blackls_add($uid, $username) {
  547.         $uid = intval($uid);
  548.         //调用uc_client/control/pm.php文件中的onblackls_add函数
  549.         return call_user_func(UC_API_FUNC, 'pm', 'blackls_add', array('uid'=>$uid, 'username'=>$username));
  550. }

  551. function uc_pm_blackls_delete($uid, $username) {
  552.         $uid = intval($uid);
  553.         //调用uc_client/control/pm.php文件中的onblackls_delete函数
  554.         return call_user_func(UC_API_FUNC, 'pm', 'blackls_delete', array('uid'=>$uid, 'username'=>$username));
  555. }

  556. function uc_domain_ls() {
  557.         //调用uc_client/control/domain.php文件中的onls函数
  558.         $return = call_user_func(UC_API_FUNC, 'domain', 'ls', array('1'=>1));
  559.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  560. }

  561. function uc_credit_exchange_request($uid, $from, $to, $toappid, $amount) {
  562.         $uid = intval($uid);
  563.         $from = intval($from);
  564.         $toappid = intval($toappid);
  565.         $to = intval($to);
  566.         $amount = intval($amount);
  567.         //调用uc_server/control/credit.php文件中的onrequest函数
  568.         return uc_api_post('credit', 'request', array('uid'=>$uid, 'from'=>$from, 'to'=>$to, 'toappid'=>$toappid, 'amount'=>$amount));
  569. }

  570. function uc_tag_get($tagname, $nums = 0) {
  571.         //调用uc_client/control/tag.php文件中的ongettag函数
  572.         $return = call_user_func(UC_API_FUNC, 'tag', 'gettag', array('tagname'=>$tagname, 'nums'=>$nums));
  573.         return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
  574. }

  575. //生成装载camera.swf的html代码
  576. //本接口函数用于返回设置用户头像的html代码,html代码会输出一个flash
  577. function uc_avatar($uid, $type = 'virtual', $returnhtml = 1) {//参数2,real-真实头像,virtual-虚拟头像
  578.         $uid = intval($uid);
  579.         //加密值
  580.         $uc_input = uc_api_input("uid=$uid");
  581.         //UC_API:'http://localhost/discuz3/uc_server'
  582.         //UC_APPID:1
  583.         $uc_avatarflash = UC_API.'/images/camera.swf?inajax=1&appid='.UC_APPID.'&input='.$uc_input.'&agent='.md5($_SERVER['HTTP_USER_AGENT']).'&ucapi='.urlencode(str_replace('http://', '', UC_API)).'&avatartype='.$type.'&uploadSize=2048';
  584.         if($returnhtml) {//返回设置头像的html代码
  585.                 return '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="450" height="253" id="mycamera" align="middle">
  586.                         <param name="allowScriptAccess" value="always" />
  587.                         <param name="scale" value="exactfit" />
  588.                         <param name="wmode" value="transparent" />
  589.                         <param name="quality" value="high" />
  590.                         <param name="bgcolor" value="#ffffff" />
  591.                         <param name="movie" value="'.$uc_avatarflash.'" />
  592.                         <param name="menu" value="false" />
  593.                         <embed src="'.$uc_avatarflash.'" quality="high" bgcolor="#ffffff" width="450" height="253" name="mycamera" align="middle" allowScriptAccess="always" allowFullScreen="false" scale="exactfit"  wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
  594.                 </object>';
  595.         } else {//返回设置头像的flash调用数组
  596.                 return array(
  597.                         'width', '450',
  598.                         'height', '253',
  599.                         'scale', 'exactfit',
  600.                         'src', $uc_avatarflash,
  601.                         'id', 'mycamera',
  602.                         'name', 'mycamera',
  603.                         'quality','high',
  604.                         'bgcolor','#ffffff',
  605.                         'menu', 'false',
  606.                         'swLiveConnect', 'true',
  607.                         'allowScriptAccess', 'always'
  608.                 );
  609.         }
  610. }

  611. function uc_mail_queue($uids, $emails, $subject, $message, $frommail = '', $charset = 'gbk', $htmlon = FALSE, $level = 1) {
  612.         //调用uc_client/control/mail.php文件中的onadd函数
  613.         return call_user_func(UC_API_FUNC, 'mail', 'add', array('uids' => $uids, 'emails' => $emails, 'subject' => $subject, 'message' => $message, 'frommail' => $frommail, 'charset' => $charset, 'htmlon' => $htmlon, 'level' => $level));
  614. }

  615. //检测头像是否存在
  616. function uc_check_avatar($uid, $size = 'middle', $type = 'virtual') {
  617.         //UC_API:http://localhost/discuz3/uc_server/
  618.         $url = UC_API."/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1";
  619.         $res = uc_fopen2($url, 500000, '', '', TRUE, UC_IP, 20);
  620.         if($res == 1) {
  621.                 return 1;//头像存在
  622.         } else {
  623.                 return 0;//头像不存在
  624.         }
  625. }

  626. function uc_check_version() {
  627.         //调用uc_server/control/version.php文件中的oncheck函数
  628.         $return = uc_api_post('version', 'check', array());
  629.         $data = uc_unserialize($return);
  630.         return is_array($data) ? $data : $return;
  631. }

  632. ?>
复制代码



更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html



上一篇:discuz x3 space_notice.php分析注释
下一篇:discuz x3 家园页面产生的动态分析
clswang 发表于 2015-6-13 21:19:15 来自PC
这些是不是太高端了,老A哥
麻将屋 www.52jkd.com shuyangzu.com www.shuyangweb.com www.majiang5.com
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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