标签: WebHook

  • WebHook 简介

    WebHook 简介

    什么是webhook?

      webhooks是一个api概念,是微服务api的使用范式之一,也被成为反向api,即:前端不主动发送请求,完全由后端推送。 举个常用例子,比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhooks 的典型场景。

      简单来说,WebHook就是一个接收HTTP POST(或GET,PUT,DELETE)的URL。一个实现了WebHook的API提供商就是在当事件发生的时候会向这个配置好的URL发送一条信息。与请求-响应式不同,使用WebHooks,你可以实时接受到变化。

      这又是一种对客户机-服务器模式的逆转,在传统方法中,客户端从服务器请求数据,然后服务器提供给客户端数据(客户端是在拉数据)。在Webhook范式下,服务器更新所需提供的资源,然后自动将其作为更新发送到客户端(服务器是在推数据),客户端不是请求者,而是被动接收方。这种控制关系的反转可以用来促进许多原本需要在远程服务器上进行更复杂的请求和不断的轮询的通信请求。通过简单地接收资源而不是直接发送请求,我们可以更新远程代码库,轻松地分配资源,甚至将其集成到现有系统中来根据API的需要来更新端点和相关数据,唯一的缺点是初始建立困难。

    主要用途 

      更新客户端,在资源新建或者更新时提供更新的、指定的数据。

    常见webhooks使用场景 

      对于第三方平台验权、登陆等 没有前端界面做中转的场景,或者强安全要求的支付场景等,适合用 Webhooks 做数据主动推送。说白了就是在前端无从参与,或者因为前端安全问题不适合参与时,就是 Webhooks 的场景。很显然 Webhooks 也不是 Http 的替代品,不过的确是一种新的前后端交互方式。 

      如果客户端要长期监听某个任务的状态,按照正常的api调用的方式去做,那么必须不停得轮训服务器来获取当前状态;使用webhook则无需轮训,通过API 可以确定是否发生了更改,如果更改了只需要等待服务器推送信息过来,然后客户端更新就可以。git webhook其实也是这方面的应用。

    Webhook各类网站的自动化部署校验脚本-PHP版本

    使用说明  

      1、webhook通过请求发送数据到你的应用后,就不再关注这些数据。也就是说如果你的应用存在问题,数据会丢失。许多webhook会处理回应,如果程序出现错误会重传数据。如果你的应用处理这个请求并且依然返回一个错误,你的应用就会收到重复数据。 

      2、webhook会发出大量的请求,这样会造成你的应用阻塞。确保你的应用能处理这些请求。

  • Webhook各类网站的自动化部署校验脚本-PHP版本

    Webhook各类网站的自动化部署校验脚本-PHP版本

    我们记录一下 github、gitlab、gitee、coding 平台的php版接收webhook脚本

    github

    <?php
    //网站目录
    $www_file  = '/www/wwwroot/laoji.org/api';
    //日志文件路径
    $log_file = '/www/wwwroot/www.test.com/auto_hook.log';
    // GitHub项目 Settings/Webhooks 中的 Secret
    $client_secret = "laoji.org";
    //接收数据
    $vaild_data = json_decode(file_get_contents('php://input'), true);
    //传递的签名
    $vaild_signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
    
    $hash = "sha1=".hash_hmac('sha1', $vaild_data, $client_secret );
    if (strcmp($vaild_signature , $hash) == 0) {
        // sign sucess
        //执行shell命令并把返回信息写进日志
        shell_exec("cd {$www_file}  &&  git pull  origin dev  >  {$log_file}  2>&1 ");  
    }
    

    gitlab

    <?php
    //网站目录
    $www_file  = '/www/wwwroot/laoji.org/api';
    //日志文件路径
    $log_file = '/www/wwwroot/www.test.com/auto_hook.log';
        
    //作为接口传输的时候认证的密钥  
    $client_token = 'laoji.org';  
    
    //传递的token
    $vaild_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];  
    //传递数据
    $vaild_data = json_decode(file_get_contents("php://input"), true);
    
    /* test token */
    if ($vaild_token !== $client_token )
    {
        echo "error 403";
        exit();
    }
    //若是dev分支且提交数大于0
    if ($vaild_data['ref']=='refs/heads/dev' && $vaild_data['total_commits_count']>0) {
       //执行shell命令并把返回信息写进日志
       shell_exec("cd ".$www_file."  &&  git pull  origin dev  >  ".$log_file."  2>&1 ");  
    }    
        

    gitee

    <?php
    //网站目录
    $www_file  = '/www/wwwroot/laoji.org/api';
    //日志文件路径
    $log_file = '/www/wwwroot/www.test.com/auto_hook.log';
    // 码云WebHooks中配置的密码
    $client_password = "laoji.org";
    $vaild_data = json_decode(file_get_contents('php://input'), true);
    // 判断密码
    if ($vaild_data ['password'] === $client_password ) {        
        //执行shell命令并把返回信息写进日志
        shell_exec("cd ".$www_file."  &&  git pull  origin dev  >  ".$log_file."  2>&1 ");
    }
     
    

    coding

    <?php
    //网站目录
    $www_file  = '/www/wwwroot/laoji.org/api';
    //日志文件路径
    $log_file = '/www/wwwroot/www.test.com/auto_hook.log';
    // 码云WebHooks中配置的密码
    $client_token = "laoji.org";
    // 接收Coding post传递的参数
    $vaild_data = file_get_contents('php://input');
    // 从请求头中获取签名
    $vaild_signature = $_SERVER['HTTP_X_CODING_SIGNATURE'];
    // 进行签名解析
    $sha1 = hash_hmac("sha1",$vaild_data,$client_token);
    $result_signature = 'sha1='. $sha1;
    // 进行身份验证
    if ($result_signature === $vaild_signature ) {
        //执行shell命令并把返回信息写进日志
        shell_exec("cd ".$www_file."  &&  git pull  origin dev  >  ".$log_file."  2>&1 ");
    }
    
WeChat