php生成艺术签名 上

php生成艺术签名

上一周,boss要求做一个输入名字生成艺术签名的网站来吸引微信用户关注。于是到网上搜索了一下。看到别人的网站上面有这功能。于是就开启chrom的调试功能点击network分析网站的请求以及返回的内容。经过一番分析过后,使用curl来模拟浏览器访问网站的后台程序并获取返回的资源。

这里用到同事给我的一个封装好的curl接口,省去了不少麻烦。

/**
     * curl模拟http请求
     * @param array $params   参数配置
     * @return mixed   返回结果
     */
    function curlHttp($params = array()){
        error_reporting(0);
        set_time_limit(0);
        if (!$params || !$params['url']) {
            return false;
        }
        $ch = curl_init();
        $options = array(
            CURLOPT_URL => $params['url'],
            CURLOPT_RETURNTRANSFER => $params['return_transer'] ? $params['return_transer'] : 1,
            CURLOPT_TIMEOUT => $params['timeout'] ? $params['timeout'] : 100,
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_HEADER => $params['show_header'] ? true : false,
            CURLOPT_HTTPHEADER => array('Expect: ')
        );
        if ($params['agent']) {
            $options[CURLOPT_USERAGENT ] = $params['agent'];
        }
        if ($params['referer']) {
            $options[CURLOPT_REFERER] = $params['referer'];
        }
        if ($params['cookie']) {
            $options[CURLOPT_COOKIE ] = $params['cookie'];
        }
        if ($params['header']) {
            $options[CURLOPT_HTTPHEADER] = $params['header'];
        }
        if ($params['cookiefile']) {
            if (!file_exists($params['cookiefile'])) {
                file_put_contents($params['cookiefile'], '');
            }
            $cookieFile = realpath($params['cookiefile']);
            $options[CURLOPT_COOKIEFILE] = $cookieFile;
            $options[CURLOPT_COOKIEJAR] = $cookieFile;
        }
        if ($params['post']) {
            $options[CURLOPT_POST] = 1;
        }
        if ($params['postdata']) {
            $options[CURLOPT_POST] = 1;
            if ($params['http_build_query']) {
                $params['postdata'] = http_build_query($params['postdata']);
            }
            $options[CURLOPT_POSTFIELDS] = $params['postdata'];
        }
        if ($params['ssl']) {
            $options[CURLOPT_SSL_VERIFYPEER] = 0;
            $options[CURLOPT_SSLVERSION] = 1;
            $options[CURLOPT_SSL_VERIFYHOST] = 1;
        }
        if ($params['ipv4']) {
            $options[CURLOPT_HTTPHEADER] = array('Expect: ');
            $options[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4;
        }
        curl_setopt_array($ch, $options);
        $response = curl_exec($ch);
        $errno = curl_errno($ch);
        if ($errno != 0) {
            if ($params['sync']) {
                $res[] = false;
                $res[] = $response;
                $errInfo = curl_getinfo($ch);
                $errInfo['errorno'] = $errno;
                $res[] = $errInfo;
            } else {
                $res = false;
            }
        } else {
            if ($params['sync']) {
                $res[] = true;
                $res[] = $response;
            } else {
                $res = $response;
            }
        }
        curl_close($ch);
        return $res;
    }

传进去的参数是一个数组,数组里面需要定义的元素有

 $params = array(
            'url' => 'http://www.example.com',
            'ipv4' => true,
            'post' => true,
            'referer' => 'http://www.example.com',
            //'cookie' => 'Hm_lvt_1a6016c8e736ecef523fbe2539419b5a=1468570717;Hm_lpvt_1a6016c8e736ecef523fbe2539419b5a=1468570772',
            'postdata' => array(
                'id'=>$content,
                'id1607'=>'pihun',
                'id1606'=>'jiqie',
                'id1608'=>'jiqie_com',
                'id1'=>'901',
                'id2'=>'15',
                'id3'=>'#000000',
                'id4'=>'',
                'id5'=>'',
                'id6'=>'',
            ),
            'agent' => 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36'
        );

其中最重要的是url referer 以及postdata。postdata就是模拟post传输的数据。

通过curl获取返回的资源是整个网站的信息,而我只需要用到那张图片就行了。所以就要从整个网站的字符串中截取出图片的url了。这时候该用到php字符串函数了,这里有两个关于php字符串函数的网页,分别是w3school,php官网

要用到的函数有:
strstr(string,search,is_befoerSearch)
这个函数是用来查找search在string中出现的位置并返回该位置后面的字符串。当is_befoerSearch为true时则返回该位置前的字符串。

strpos(string,find,start)
该函数用来返回find在string第一次出现的位置。start为要开始的位置。默认为0。

strsub_replace(string,replace,start,length)
该函数用来将string从start开始到length位置替换为replace字符串。

//$res返回的是网页的源码,其中要获取的签名图片地址是<img src="../image/4232.jpg" />是使用相对路径来指定url的。

 $res = $this->curlHttp($params);//这里是返回的网页源码字符串

 $domain = strstr($res, '..');//获取$res中..后面的字符串
 $domain = strstr($domain, '"',true);//获取$domain中"后面的字符串
 $start = strpos($domain,'..');//获取..开始的位置
 $domain = substr_replace($domain,"http://www.example.com",$start,2);//将..替换为域名

现在已经获取了图片的域名了。那么接下来要做的事情就是把二维码已经需要添加的文字加到图片上去。初步想法是将图片设为div的背景,然后把二维码以及文字加上去。然后使用canvas截图生成一张图片。这样子用户就可以把图片保存下来了。

截图功能需要用到第三方的一个js库。详细请参看这里
使用这个js库就可以轻松的把div截下来生成图片了。由于生成的图片是以base64格式保存的。而微信安卓客户端保存图片的时候提示保存失败!于是我又试了试安卓端的浏览器,结果可以。。。做的生成签名的这个活动主要是在推给微信用户使用的。这时候只能在后台合成图片后再输出到网页了。

在后台合成图片用到的是GD库。既然都直接后台合成了为什么不自己直接在后台合成字体呢。于是就在网上找了些比较艺术的字体。

累了。。。后台合成部分明天再写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值