道济书生

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  之前需要下载SAE上的日志存入数据库,因此研究了下SAE的签名认证和日志下载。这个链接是SAE官方给出的API文档。https://www.sinacloud.com/doc/api.html#qian-ming-fang-fa,虽然讲的方法很清晰,但并不是很具体。然后Python版本的网上比比皆是,我这里不费过多笔墨,看他的官方文档也不困难。

   下面的方法是获得SAE的签名认证:

 1   public function getAuthorization($accesskey,$secretkey,$time,$uri)
 2   {
 3     $header = array(
 4                 'x-sae-timestamp' => $time,
 5                 'x-sae-accesskey' => strtolower($accesskey)
 6             );
 7         ksort($header);
 8         $sae_header = array('GET',$uri);
 9         foreach ($header as $key => $value) {
10             $sae_header[count($sae_header)] = $key.':'.$value;
11         }
12         $ret = implode(PHP_EOL, $sae_header);
13         $auth = 'SAEV1_HMAC_SHA256 '.base64_encode(hash_hmac('sha256',$ret,$secretkey,true));
14         return $auth;
15   }

代码解释:传入参数L:$accesskey,$secretkey,$time,$uri将所有x-sae-开头的http header(小写)按name排序后用冒号链接name和value,放在method、uri(包含query string,不要转义)后以换行符分隔拼接为签名原文字符串,再以Secretkey为密钥用hmac sha256计算哈希值(二进制),再经base64编码,前面加上”SAEV1_HMAC_SHA256 “,得到本次请求的认证签名,即Authorization字段。

  获得签名认证之后还需要获得header,方法如下:

 1   public function getheader($accesskey,$auth,$time)
 2   {
 3     return array(
 4                 'Host: g.sae.sina.com.cn',
 5                 'Accept: text/plain',
 6                 'x-sae-accesskey: '.$accesskey,
 7                 'x-sae-timestamp: '.$time,
 8                 'Authorization: '. $auth
 9             );
10   }

得到header之后就非常简单了:可以直接发送请求来获取SAE的日志:
 1   public function get($uri,$header){
 2     $host = 'http://g.sae.sina.com.cn'.$uri;
 3     $ch = curl_init();
 4     curl_setopt($ch, CURLOPT_URL,$host);
 5     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 6     curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
 7     curl_setopt($ch, CURLOPT_HEADER, 1);
 8     $ret =  curl_exec($ch);
 9     curl_close($ch);
10     return $ret;
11   }

使用上面的方法在配合具体的下载要求就可以随意下载SAE上的日志了。

下面附上完整的代码实例,这只是按照我的要求下载的日志并且存入了数据库,仅供参考:

 1     public function log()
 2     {
 3         //$uri = '/log/http/2016-08-03:2016-08-05/'.$_SERVER['HTTP_APPVERSION'].'3-access.log';
 4         $date = date('Y-m-d',strtotime('-1 day'));
 5         $time = time();
 6         $acc = 'lwjljzn2wz';
 7         $sec = '1hkzhw2y51wl2w1i21hl4miyj2yj44l5x1404l00';
 8         $uri = '/log/http/'.$date.'/3-access.log?grep/3.dxever.applinzi.com.*POST|fields/ /1/2/5';
 9         $uri_1 = '/log/http/'.$date.'/3-access.log?grep/3.dxever.applinzi.com.*POST|fields/"/2';
10         //$uri = '/log/http/2016-08-09/3-access.log?fields/ /1/2/3';
11         $g = D('godview');
12         $auth = $g->getAuthorization($acc,$sec,$time,$uri);
13         $header = $g->getheader($acc,$auth,$time);
14         $ret = $g->get($uri,$header);
15         $time_1 = time();
16         $auth_1 = $g->getAuthorization($acc,$sec,$time_1,$uri_1);
17         $header_1 = $g->getheader($acc,$auth_1,$time_1);
18         $ret_1 = $g->get($uri_1,$header_1);
19         $time_mom = date('Ymd',strtotime('-1 day'));
20         $data = explode("3.dxever.applinzi.com",$ret);
21         $data_1 = explode("POST ",$ret_1);
22 
23         unset($data_1[0]);
24         unset($data[0]);
25         foreach ($data as $k => $v)
26         {
27 
28             preg_match_all('/\/index.php\/Area\/School\/GetSchoolComment\/token(.*) HTTP\/1.0/',$data_1["$k"],$token);
29             if ($token[1][0] != NULL) {
30                 $log['user_id'] = $g->get_id($token[1][0]);
31             }else {
32                 $log['user_id'] = NULL;
33             }
34             preg_match_all('/\/(.*) HTTP\/1.0/',$data_1["$k"],$url);
35 
36             preg_match_all('/((([1-9]?|1\d)\d|2([0-4]\d|5[0-5]))\.){3}(([1-9]?|1\d)\d|2([0-4]\d|5[0-5]))/',$v,$ip);
37             preg_match_all('/\/2016:(.*)/',$v,$ti);
38             // if ($url[1][0]==NULL) {
39             //     // $url = 'a';
40             //     preg_match_all('/GET (.*?) HTTP/',$v,$url);
41             // }
42             // preg_match_all('/Mozilla(.*)/',$v,$head);
43             // $area = explode(" ",$time);
44             $log['ip'] = $ip[0][0];
45             $log['url'] = $url[1][0];
46             $log['head'] = $head[0][0];
47             $log['area'] = $area[1];
48             // $time = $area[0];
49             // $t = explode(":",$time,2);
50             $log['time1'] = $time_mom;
51             $log['time2'] = str_replace(':','',$ti[1][0]);
52             // dump($log);
53             $sta = $g->save_log($log);
54         }
55         if($sta){
56             $this->response(returnSuccess(), 'json');
57         }else {
58             $this->response(returnWrong(), 'json');
59         }
60 
61     }
下面为用到的方法的全部整合:
 1  public function getAuthorization($accesskey,$secretkey,$time,$uri)
 2   {
 3     $header = array(
 4                 'x-sae-timestamp' => $time,
 5                 'x-sae-accesskey' => strtolower($accesskey)
 6             );
 7         ksort($header);
 8         $sae_header = array('GET',$uri);
 9         foreach ($header as $key => $value) {
10             $sae_header[count($sae_header)] = $key.':'.$value;
11         }
12         $ret = implode(PHP_EOL, $sae_header);
13         $auth = 'SAEV1_HMAC_SHA256 '.base64_encode(hash_hmac('sha256',$ret,$secretkey,true));
14         return $auth;
15   }
16 
17   public function getheader($accesskey,$auth,$time)
18   {
19     return array(
20                 'Host: g.sae.sina.com.cn',
21                 'Accept: text/plain',
22                 'x-sae-accesskey: '.$accesskey,
23                 'x-sae-timestamp: '.$time,
24                 'Authorization: '. $auth
25             );
26   }
27 
28   public function get($uri,$header){
29     $host = 'http://g.sae.sina.com.cn'.$uri;
30     $ch = curl_init();
31     curl_setopt($ch, CURLOPT_URL,$host);
32     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
33     curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
34     curl_setopt($ch, CURLOPT_HEADER, 1);
35     $ret =  curl_exec($ch);
36     curl_close($ch);
37     return $ret;
38   }
39 
40   public function save_log($log)
41   {
42     $a = M('log')->add($log);
43     return $a;
44   }

 

 

 

 

 

posted on 2017-02-16 16:49  道济书生  阅读(461)  评论(1编辑  收藏  举报