多说评论实时同步回数据库

来源:互联网 发布:上杉升 知乎 编辑:程序博客网 时间:2024/06/06 20:28
说评论实时同步回数据库,依赖Http库,随便找一个就行

  1. <?php
  2. /**
  3.  * 多说 实时同步评论回本地数据库 API
  4.  */
  5. namespace Home\Controller;
  6. use Think\Controller;
  7. class DuoshuoController extends Controller {
  8.     public function duoshuo(){
  9.         if (check_signature($_POST)) {
  10.             $Comment = M('comment');
  11.             $where['name'] = array('in','last_log_id');
  12.             $last_log_id = M('setting')->where($where)->getField('value');
  13.             Vendor('CurlHTTP.Http');
  14.             
  15.             $limit = 20;
  16.             $params = array(
  17.                 'limit' => $limit,
  18.                 'order' => 'asc',
  19.             );
  20.             $posts = array();
  21.             if (!$last_log_id)
  22.                 $last_log_id = 0;
  23.             $params['since_id'] = $last_log_id;
  24.             $params['short_name'] = C(DUOSHUO_SHORT_NAME);
  25.             $params['secret'] = C(DUOSHUO_SECRET);
  26.             $http_client = new \Http();
  27.             $response = $http_client->request('http://api.duoshuo.com/log/list.json', $params ,'GET');
  28.             $response = json_decode($response,true);
  29.             if (!isset($response['response'])) {
  30.                 //处理错误,错误消息$response['message'], $response['code']
  31.                 file_log("签名错误");
  32.             } else {
  33.                 //遍历返回的response,你可以根据action决定对这条评论的处理方式。
  34.                 foreach($response['response'] as $k => $log){
  35.                     switch($log['action']){
  36.                         case 'create':
  37.                             foreach ($log['meta'] as $key => $value) {
  38.                                 $create[$key]['post_id'] = $log['meta']['post_id'];
  39.                                 $create[$key]['thread_id'] = $log['meta']['thread_id'];
  40.                                 $create[$key]['author_id'] = $log['meta']['author_id'];
  41.                                 $create[$key]['author_name'] = $log['meta']['author_name'];
  42.                                 $create[$key]['author_email'] = $log['meta']['author_email'];
  43.                                 $create[$key]['author_url'] = $log['meta']['author_url'];
  44.                                 $create[$key]['author_key'] = $log['meta']['author_key'];
  45.                                 $create[$key]['ip'] = $log['meta']['ip'];
  46.                                 $create[$key]['created_at'] = $log['meta']['created_at'];
  47.                                 $create[$key]['message'] = $log['meta']['message'];
  48.                                 $create[$key]['status'] = $log['meta']['status'];
  49.                                 $create[$key]['type'] = $log['meta']['type'];
  50.                                 if($log['meta']['parent_id'] != ""){
  51.                                     $create[$key]['parent_id'] = $log['meta']['parent_id'];
  52.                                 }
  53.                                 $create[$key]['thread_key'] = $log['meta']['thread_key'];
  54.                                 $create[$key]['user_id'] = $log['user_id'];
  55.                                 $create[$key]['date'] = $log['date'];
  56.                             }
  57.                             break;
  58.                         case 'approve':
  59.                             //这条评论是通过的评论
  60.                             foreach ($log['meta'] as $key => $value) {
  61.                                 $approve[$key]['post_id'] .= $value.",";
  62.                             }
  63.                             break;
  64.                         case 'spam':
  65.                             //这条评论是标记垃圾的评论
  66.                             foreach ($log['meta'] as $key => $value) {
  67.                                 $spam[$key]['post_id'] .= $value.",";
  68.                             }
  69.                             break;
  70.                         case 'delete':
  71.                             //这条评论是删除的评论
  72.                             foreach ($log['meta'] as $key => $value) {
  73.                                 $delete[$key]['post_id'] .= $value.",";
  74.                             }
  75.                             break;
  76.                         case 'delete-forever':
  77.                             //彻底删除的评论
  78.                             foreach ($log['meta'] as $key => $value) {
  79.                                 $delete_forever[$key]['post_id'] .= $value.",";
  80.                             }
  81.                             break;
  82.                         default:
  83.                             break;
  84.                     }
  85.                     // 更新处理数据
  86.                     switch($log['action']){
  87.                         case 'create':
  88.                             foreach ($create as $key => $value) {
  89.                                 if($value != ""){
  90.                                     $Comment->add($value);
  91.                                 }
  92.                             break;
  93.                             }
  94.                         case 'approve':
  95.                             //这条评论是通过的评论
  96.                             foreach ($approve as $key => $value) {
  97.                                 if($value != ""){
  98.                                     $Comment->where(array('post_id'=>array('in',''. substr($value['post_id'], 0,-1) .'')))->setField('status','approved');
  99.                                 }
  100.                             }
  101.                             break;
  102.                         case 'spam':
  103.                             //这条评论是标记垃圾的评论
  104.                             foreach ($spam as $key => $value) {
  105.                                 if($value != ""){
  106.                                     $Comment->where(array('post_id'=>array('in',''. substr($value['post_id'], 0,-1) .'')))->setField('status','spam');
  107.                                 }
  108.                             }
  109.                             break;
  110.                         case 'delete':
  111.                             //这条评论是删除的评论
  112.                             foreach ($delete as $key => $value) {
  113.                                 if($value != ""){
  114.                                     $Comment->where(array('post_id'=>array('in',''. substr($value['post_id'], 0,-1) .'')))->setField('status','delete');
  115.                                 }
  116.                             }
  117.                             break;
  118.                         case 'delete-forever':
  119.                             //彻底删除的评论
  120.                             foreach ($delete_forever as $key => $value) {
  121.                                 if($value != ""){
  122.                                     $Comment->where(array('post_id'=>array('in',''. substr($value['post_id'], 0,-1) .'')))->delete();
  123.                                 }
  124.                             }
  125.                             break;
  126.                         default:
  127.                             break;
  128.                     }
  129.                     //更新last_log_id,记得维护last_log_id。(如update你的数据库)
  130.                     if (strlen($log['log_id']) > strlen($last_log_id) || strcmp($log['log_id'], $last_log_id) > 0) {
  131.                         M('setting')->where(array('name'=>"last_log_id"))->setField('value',$log['log_id']);
  132.                     }
  133.                 }
  134.             }
  135.         }
  136.     }
  137. }
复制代码
  1. /**
  2.  *
  3.  * 多说检查签名
  4.  *
  5.  */
  6. function check_signature($input){
  7.     $signature = $input['signature'];
  8.     unset($input['signature']);
  9.     ksort($input);
  10.     $baseString = http_build_query($input, null, '&');
  11.     $expectSignature = base64_encode(hmacsha1($baseString, C(DUOSHUO_SECRET)));
  12.     if ($signature !== $expectSignature) {
  13.         return false;
  14.     }
  15.     return true;
  16. }
  17. // from: http://www.php.net/manual/en/function.sha1.php#39492
  18. // Calculate HMAC-SHA1 according to RFC2104
  19. // http://www.ietf.org/rfc/rfc2104.txt
  20. // 多说
  21. function hmacsha1($data, $key) {
  22.     if (function_exists('hash_hmac'))
  23.         return hash_hmac('sha1', $data, $key, true);
  24.     $blocksize=64;
  25.     if (strlen($key)>$blocksize)
  26.         $key=pack('H*', sha1($key));
  27.     $key=str_pad($key,$blocksize,chr(0x00));
  28.     $ipad=str_repeat(chr(0x36),$blocksize);
  29.     $opad=str_repeat(chr(0x5c),$blocksize);
  30.     $hmac = pack(
  31.             'H*',sha1(
  32.                     ($key^$opad).pack(
  33.                             'H*',sha1(
  34.                                     ($key^$ipad).$data
  35.                             )
  36.                     )
  37.             )
  38.     );
  39.     return $hmac;
  40. }
复制代码
配置

//多说
'DUOSHUO_SECRET'=>'78bd15a3d4fb3000657741a1319bbbbe',
'DUOSHUO_SHORT_NAME'=>'muxu',

参考 http://dev.duoshuo.com/threads/50037b11b66af78d0c000009
原创粉丝点击