项目中用户中心用的是ucenter,需要直接把开放平台的用户图像保存到本系统,uc自带的uc_avatar方法无法满足需求,通过用 SocketSniff对该flash上传图片抓包分析,该flash先把用户选择的图片上传到ucenter根目录的data/tmp目录下,然后返回 地址,用户选择区域后,生成三张图片的16进制代码,post给ucenter,就完成了用户的图像保存。知道了原理,程序就好写了。
在项目目录中的uc_client文件夹中的client.php增加一个uc_avatar_code函数,作用是返回input
1 | function uc_avatar_code( $uid , $type = 'virtual' , $returnhtml = 1){ |
2 | $uid = intval ( $uid ); |
3 | $uc_input = uc_api_input( "uid=$uid" ); |
4 | $input = str_replace ( '25' , '' , $uc_input ); |
5 | return $input ; |
6 | } |
项目是用thinkPHP开发,下面是主要代码,其中checkTitle为中 的方法,由于整个过程可能会比较耗时,修改用户图像放到后端消息队列处理,先把用户的在开放平台的用户图像,保存在Public/tmp/文件夹下,名 为$uid的文件,没有扩展名,直接下载的,不处理是不知道扩展名的。保存图像只需要请求saveOpenFace方法,加上用户id,即可保存用户图 像。
01 | /* |
02 | * 保存开放平台用户图像到uc |
03 | * |
04 | * @uid : 用户id |
05 | * */ |
06 | public function saveOpenFace(){ |
07 | $uid = intval ( $_GET [ 'id' ]); |
08 | $path = 'Public/tmp/' ; |
09 | $local = $path . $uid ; |
10 | $suffix = checkTitle( $local ); |
11 | $file = $local . '.' . $suffix ; |
12 | rename( $local , $file ); |
13 | import( "ORG.Util.Image" ); |
14 | import( "ORG.Net.Snoopy" ); |
15 | $Image = new Image(); |
16 | $Snoopy = new Snoopy(); |
17 | $imgB = $path . 'b_' . $uid . '.' . $suffix ; |
18 | $imgM = $path . 'm_' . $uid . '.' . $suffix ; |
19 | $imgS = $path . 's_' . $uid . '.' . $suffix ; |
20 | $Image ->img2thumb( $file , $imgB ,200,200,1); |
21 | $Image ->img2thumb( $file , $imgM ,120,120,1); |
22 | $Image ->img2thumb( $file , $imgS ,48,48,1); |
23 | $input = uc_avatar_code( $uid ); |
24 | $formvars [ "avatar1" ] = $this ->imgTo16Code( $imgB ); |
25 | $formvars [ "avatar2" ] = $this ->imgTo16Code( $imgM ); |
26 | $formvars [ "avatar3" ] = $this ->imgTo16Code( $imgS ); |
27 | $action = C( 'UC_HOST' ). '/index.php?m=user&inajax=1&a=rectavatar&appid=1&input=' . $input . '&avatartype=virtual' ; |
28 | $Snoopy ->submit( $action , $formvars ); |
29 | unlink( $file ); |
30 | unlink( $imgB ); |
31 | unlink( $imgM ); |
32 | unlink( $imgS ); |
33 | echo true; |
34 | } |
35 | /* |
36 | * 把图片转换成16进制 |
37 | * @file : 文件路径 |
38 | * */ |
39 | public function imgTo16Code( $filename ){ |
40 | $file = file_get_contents ( $filename ); |
41 | $code = strtoupper (bin2hex( $file )); |
42 | return $code ; |
43 | } |
PS:由于用的消息队列,后端是程序提交,POST提交用的Snoopy,伪造HTTP_USER_AGENT老是不成功,而无法提交,暂时把验 证注释了,有时间在看看,注释的文件为ucenter/model/base.php84行即//exit('Access denied for agent changed');