请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

一起开发

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

UCenter二次开发精简版本的uc_client直接走http协议

发表于 2012-11-25 03:02 作者:phper
php结合memcache实现访问统计文章点击的计数
随着访问量的增大,点击数直接更新数据库已经不太可能了,数据库中点击的更新 ...
Web开发利器,简版开发手册助您快速开发(图
web开发,帮助手册是我们经常查询的,查函数、查属性等等,下面图片里综合了各开发手册 ...
在康盛系列产品里应用整合用到ucenter时候需要用到uc_client目录,而往往我们并不需要那么多功能,那么有没有简单的方法呢?下面一个文件搞定ucenter 主要接口,包含,注册,登录,退出,同步登录相关接口。
  1. /* 功能:精简版本的 ucenter_client,全部走 http 协议,仅支持用户登录注册修改密码等相关基本的接口,一个文件,方便使用。*/
  2. 示例: <?php
  3.             $_SERVER['HTTP_USER_AGENT'] = 'I am eval Internet Explorer!';
  4.             $ucconf = array (
  5.                 'uc_appid' => 2,
  6.                 'uc_appkey' => '026fsDv7Oil9sdawt3b',
  7.                 'uc_url' => 'http://domain.com/uc_server/',
  8.                 'uc_charset' => 'UTF-8',
  9.             );
  10.             $s = uc_user_register('xxxa', 'xxxa', 'xxxa@gmail.com');
  11.             $arr = uc_user_login('xxxa', 'xxxa');
  12.             $arr = uc_get_user('xxxa');
  13.             $arr = uc_user_synlogin(1);
  14.             print_r($arr);
  15.         ?>
  16. */
  17. function uc_user_login($username, $password) {
  18.     $username = urlencode(uc_charset($username));
  19.     $password = urlencode($password);
  20.     if(strpos($username, '@') === FALSE) {
  21.         $s = uc_http_request('user', 'login', "username=$username&password=$password&isuid=3");// username
  22.     } else {
  23.         $s = uc_http_request('user', 'login', "username=$username&password=$password&isuid=2");// email
  24.     }
  25.     if(strpos($s, 'Access denied for agent changed') !== FALSE) {
  26.         return '可能 APPKEY 没有设置正确。';
  27.     }
  28.     $arr = uc_xml_to_array($s);
  29.     if(is_array($arr)) {
  30.         return array (
  31.             'status'=>$arr[0],
  32.             'username'=>uc_charset($arr[1], 0),
  33.             'password'=>$arr[2],
  34.             'email'=>$arr[3],
  35.             'merge'=>$arr[4]
  36.         );
  37.     } else {
  38.         return $arr;
  39.     }
  40. }
  41. /*
  42.     ucenter 返回:
  43.         <?xml version="1.0" encoding="ISO-8859-1"?>
  44.         <root>
  45.             <item id="0"><![CDATA[4]]></item>
  46.             <item id="1"><![CDATA[abcde]]></item>
  47.             <item id="2"><![CDATA[abcde@gmail.com]]></item>
  48.         </root>
  49.     正则替换后返回:
  50.         Array
  51.         (
  52.             [0] => 4
  53.             [1] => abcde
  54.             [2] => abcde@gmail.com
  55.         )
  56. */
  57. function uc_xml_to_array($s) {
  58.     if(strpos($s, '<root>') !== FALSE) {
  59.         preg_match_all('#<item id="(\w+)"><!\[CDATA\[([^]]*?)\]\]></item>#is', $s, $m);
  60.         if(!empty($m[1])) {
  61.             foreach($m[1] as $k=>$v) {
  62.                 $arr[$v] = $m[2][$k];
  63.             }
  64.             return $arr;
  65.         }
  66.     }
  67.     return $s;
  68. }
  69. /*
  70.     同步登录:
  71.     返回一个数组,包含其他应用的 js 路径,格式大致如:
  72.     array (
  73.         0 => 'http://www.domain1.com/api/uc.php?auth=xxxxxx&action=rsynlogin',
  74.         1 => 'http://www.domain2.com/api/uc.php?auth=xxxxxx&action=rsynlogin',
  75.         2 => 'http://www.domain3.com/api/uc.php?auth=xxxxxx&action=rsynlogin',
  76.     )
  77.     接收到后 <script src="http://xxx"></script> 放入HTML页面,使其发送HTTP请求,完成其他应用的 cookie 设置,实现同步登录。同步退出同理。
  78. */
  79. function uc_user_synlogin($uid) {
  80.     $s = uc_http_request('user', 'synlogin', "uid=$uid");
  81.     preg_match_all('#<script type="text/javascript" src="([^"]+")#is', $s, $m);
  82.     return isset($m[1]) ? $m[1] : $s;
  83. }
  84. /* 同步退出:同上*/
  85. function uc_user_synlogout() {
  86.     $s = uc_http_request('user', 'synlogout', '');
  87.     preg_match_all('#<script type="text/javascript" src="([^"]+)"#is', $s, $m);
  88.     return isset($m[1]) ? $m[1] : $s;
  89. }
  90. // 修改密码
  91. function uc_user_updatepw($username, $newpw) {
  92.     $username = urlencode(uc_charset($username));
  93.     $newpw = urlencode($newpw);
  94.     return uc_http_request('user', 'edit', "username=$username&newpw=$newpw&ignoreoldpw=1");
  95. }
  96. // 删除用户
  97. function uc_user_delete($uid) {
  98.     return uc_http_request('user', 'delete', "uid=$uid");
  99. }
  100. // 注册
  101. function uc_user_register($username, $password, $email) {
  102.     $username = urlencode(uc_charset($username));
  103.     $password = urlencode($password);
  104.     $email = urlencode($email);
  105.     $regip = $_SERVER['REMOTE_ADDR'];
  106.     return uc_http_request('user', 'register', "username=$username&password=$password&email=$email?ip=$regip");
  107. }
  108. // 获取一个用户,根据用户名。
  109. /*
  110. Array
  111. (
  112.     [0] => 5
  113.     [1] => xxxa
  114.     [2] => xxxa@gmail.com
  115. )
  116. */
  117. function uc_get_user($username) {
  118.     $username = urlencode(uc_charset($username));
  119.     $s = uc_http_request('user', 'get_user', "username=$username&isuid=0");
  120.     $arr = uc_xml_to_array($s);
  121.     if(is_array($arr)) {
  122.         return array (
  123.             'uid'=>$arr[0],
  124.             'username'=>uc_charset($arr[1], 0),
  125.             'email'=>$arr[2],
  126.         );
  127.     } else {
  128.         return $s;
  129.     }
  130. }
  131. // UTF-8 与 uc 编码互转函数, $to 控制转换方向。
  132. function uc_charset($s, $to = 1) {
  133.     global $ucconf;
  134.     return $ucconf['uc_charset'] == 'UTF-8' ? $s : iconv($to ? 'UTF-8' : $ucconf['uc_charset'], $to ? $ucconf['uc_charset'] : 'UTF-8', $s);
  135. }
  136. // 修改密码
  137. function uc_http_request($module, $action, $arg='') {
  138.     global $ucconf;
  139.     $input = urlencode(uc_authcode($arg.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', $ucconf['uc_appkey']));
  140.     substr($ucconf['uc_url'], -1) != '/' && $ucconf['uc_url'] .= '/';
  141.     $url = $ucconf['uc_url'].'index.php?'."m=$module&a=$action&inajax=2&release=20091001&input=$input&appid=".$ucconf['uc_appid'];
  142.     return xn_get_url($url, 5);
  143. }
  144. // 可逆加密,RC4算法
  145. function uc_authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  146.     $ckey_length = 4;
  147.     $key = md5($key);
  148.     $keya = md5(substr($key, 0, 16));
  149.     $keyb = md5(substr($key, 16, 16));
  150.     $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
  151.     $cryptkey = $keya.md5($keya.$keyc);
  152.     $key_length = strlen($cryptkey);
  153.     $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  154.     $string_length = strlen($string);
  155.     $result = '';
  156.     $box = range(0, 255);
  157.     $rndkey = array();
  158.     for($i = 0; $i <= 255; $i++) {
  159.         $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  160.     }
  161.     for($j = $i = 0; $i < 256; $i++) {
  162.         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  163.         $tmp = $box[$i];
  164.         $box[$i] = $box[$j];
  165.         $box[$j] = $tmp;
  166.     }
  167.     for($a = $j = $i = 0; $i < $string_length; $i++) {
  168.         $a = ($a + 1) % 256;
  169.         $j = ($j + $box[$a]) % 256;
  170.         $tmp = $box[$a];
  171.         $box[$a] = $box[$j];
  172.         $box[$j] = $tmp;
  173.         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  174.     }
  175.     if($operation == 'DECODE') {
  176.         if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  177.             return substr($result, 26);
  178.         } else {
  179.             return '';
  180.         }
  181.     } else {
  182.         return $keyc.str_replace('=', '', base64_encode($result));
  183.     }
  184. }
  185. // HTTP REQUEST,不能使用 php 内置的 file_get_contents(), 需要定制 HTTP_USER_AGENT
  186. function xn_get_url($url, $timeout = 5, $post = '', $cookie = '') {
  187.     if(function_exists('fsockopen')) {
  188.         $limit = 500000;
  189.         $ip = '';
  190.         $return = '';
  191.         $matches = parse_url($url);
  192.         if(empty($matches['host'])) {
  193.             throw new Exception("$url 格式有误。");
  194.         }
  195.         $host = $matches['host'];
  196.         $path = $matches['path'] ? $matches['path'].(!empty($matches['query']) ? '?'.$matches['query'] : '') : '/';
  197.         $port = !empty($matches['port']) ? $matches['port'] : 80;
  198.    
  199.         if(empty($post)) {
  200.             $out = "GET $path HTTP/1.0\r\n";
  201.             $out .= "Accept: */*\r\n";
  202.             $out .= "Accept-Language: zh-cn\r\n";
  203.             $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  204.             $out .= "Host: $host\r\n";
  205.             $out .= "Connection: Close\r\n";
  206.             $out .= "Cookie:$cookie\r\n\r\n";
  207.         } else {
  208.             $out = "POST $path HTTP/1.0\r\n";
  209.             $out .= "Accept: */*\r\n";
  210.             $out .= "Accept-Language: zh-cn\r\n";
  211.             $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  212.             $out .= "Host: $host\r\n";
  213.             $out .= 'Content-Length: '.strlen($post)."\r\n";
  214.             $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
  215.             $out .= "Connection: Close\r\n";
  216.             $out .= "Cache-Control: no-cache\r\n";
  217.             $out .= "Cookie:$cookie\r\n\r\n";
  218.             $out .= $post;
  219.         }
  220.         $host == 'localhost' && $ip = '127.0.0.1';
  221.         $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
  222.         if(!$fp) {
  223.             return '';
  224.         }else {
  225.             stream_set_blocking($fp, TRUE);
  226.             stream_set_timeout($fp, $timeout);
  227.             @fwrite($fp, $out);
  228.             $status = stream_get_meta_data($fp);
  229.             if(!$status['timed_out']) {
  230.                 $starttime = time();
  231.                 while (!feof($fp)) {
  232.                     if(($header = @fgets($fp)) && ($header == "\r\n" ||  $header == "\n")) {
  233.                         break;
  234.                     }
  235.                 }
  236.                 $stop = false;
  237.                 while(!feof($fp) && !$stop) {
  238.                     $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
  239.                     $return .= $data;
  240.                     if($limit) {
  241.                         $limit -= strlen($data);
  242.                         $stop = $limit <= 0;
  243.                     }
  244.                     if(time() - $starttime > $timeout) break;
  245.                 }
  246.             }
  247.             @fclose($fp);
  248.             //error_log($url."\r\n", 3, "d:/uc_http.txt");
  249.             return $return;
  250.         }
  251.     } else {
  252.         return '';
  253.     }
  254. }
  255. ?>
复制代码
经过上面的精简修改,uc_clicent就可以直接走http协议了,一个文件就可以搞定了。

回复

使用道具 举报

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

Archiver|手机版|一起开发   

GMT+8, 2017-9-23 20:50 , Processed in 0.121005 second(s), 28 queries .

Powered by Discuz! X2.5 Licensed

© 2001-2012 Comsenz Inc.

回顶部