项目中用户中心用的是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){ |
3 |
$uc_input = uc_api_input("uid=$uid"); |
4 |
$input =str_replace('25', '', $uc_input); |
项目是用thinkPHP开发,下面是主要代码,其中checkTitle为php判断文件类型中 的方法,由于整个过程可能会比较耗时,修改用户图像放到后端消息队列处理,先把用户的在开放平台的用户图像,保存在Public/tmp/文件夹下,名 为$uid的文件,没有扩展名,直接下载的,不处理是不知道扩展名的。保存图像只需要请求saveOpenFace方法,加上用户id,即可保存用户图 像。
06 |
public function saveOpenFace(){ |
07 |
$uid = intval($_GET['id']); |
08 |
$path = 'Public/tmp/'; |
10 |
$suffix = checkTitle($local); |
11 |
$file = $local.'.'.$suffix; |
13 |
import("ORG.Util.Image"); |
14 |
import("ORG.Net.Snoopy"); |
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); |
39 |
public function imgTo16Code($filename){ |
40 |
$file = file_get_contents($filename); |
41 |
$code = strtoupper(bin2hex($file)); |
PS:由于用的消息队列,后端是程序提交,POST提交用的Snoopy,伪造HTTP_USER_AGENT老是不成功,而无法提交,暂时把验 证注释了,有时间在看看,注释的文件为ucenter/model/base.php84行即//exit('Access denied for agent changed');