为您推荐:
精华内容
最热下载
问答
  • 5KB weixin_42131798 2021-05-14 18:28:58
  • webhook 高大上的开发环境部署 写完代码自动git push,测试环境服务器检测到有新的push立即pull

    webhook 高大上的开发环境部署

    IP作用
    10.0.113.131程序猿的电脑 始终在这里写代码 然后 push到git上
    • . * . * . *
    线上测试环境 保证webhooks能访问到 它始终从git上pull下来

    部署公钥 –程序员电脑及测试环境都需要部署公钥

    yum -y install  git         #如果没有安装git,执行此步骤
    ssh-keygen -t rsa -b 4096 -C "915790916@qq.com"     #此处邮箱不固定,以下可能需要再改,直到能用就行
    
    cat id_coding_rsa.pub       #复制此文件内容到coding.net 
    项目 ->设置 ->部署公钥
    -------------------------------------------------------------------
    vi /root/.ssh/config        #编辑新文件写入以下内容
    
    Host git.coding.net
    User 915790916@qq.com       #此处邮箱与上面填写的邮箱对应
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa     #公钥文件存放路径
    -------------------------------------------------------------------
    
    ssh -T git@git.coding.net   #检测设置,出现 successfully 即可  

    git相关操作

    cd /data/www
    git clone  地址               #将远程仓库克隆到本地
    
    git status                  #查看在哪个分支下面    
    git branch my               #新建my分支
    git branch develop          #新建develop分支
    git branch online           #新建online分支
    git branch                  #查看所有的分支      
    
    git add .                   #加入到本地仓库  
    git commit -a -m 'init'     #提交到版本库,在没有commit之前,在任何分支下 写的东西 属于所有的分支  也就是所有的分支都能看到        
    git checkout develop        
    git merge my            #切换到develop分支,并与my分支合并
    git push origin develop 

    在程序猿电脑上 写一个脚本 自动切换分支并提交代码

    vim auto_git.sh
    #!/bin/bash  
    cd /data/www/91edu.com/91edu.com    #找到 有.git的目录  
    
    git checkout my
    git add .
    git commit -a -m 'init1'
    git checkout develop
    git merge my 
    git push origin develop 
    git checkout my  
    chmod +x auto_git.sh            #赋予脚本执行权限
    
    sh auto_git.sh  #执行脚本  

    在coding.net 上配置webhooks

    输入地址 http://hook.geniusbarst.cn/sync.php 保证权限正确 浏览器打开正常 才行

    vi /sync.php                #每次有push的时候,就会调用这个文件

    为了查看操作用户是谁,写入下面代码,看到用户之后把第二行放开,第三、四行注释

    file_put_contents('date.log',date('Y-m-d h:i:s'),FILE_APPEND);          #追加方式写日志
    // exec('./sync.sh');               #实际工作时取消此行注释
    exec('whoami',$out);               #查看执行此操作的用户
    var_dump($out);

    在浏览器中访问 http://www.geniusbarst.cn/sync.php显示 执行的用户 可能是 www apache nobody 以www为例子

    vi /etc/passwd   
    将www用户 /sbin/nologin  改为  /bin/bash  
    
    su www      #切换为www用户
    
    重新执行上面部署公钥操作,注意存放目录不再是/root/.ssh,应该是www用户的目录,即/home/www/.ssh  一定要认真比对,确保每个细节都不出错     
    
    ssh -T git@git.coding.net    #出现 successfully 即可 ,如果不行 ,换个邮箱再来一次      
    chmod 600 config            #修改config权限为600
    
    cd /data/www/91edu 
    git clone  地址  
            #fatal: could not create work tree dir 'test'.: Permission denied
            这一步有可能会报上述错误,是因为当前用户在当前文件夹没有写权限,切换回root用户改变一下文件夹权限就好了

    编写脚本,自动执行pull操作

    vi sync.sh     
    #!/bin/bash
    /usr/bin/git pull origin develop 2>>error.log       #自动pull操作并写日志

    过程中最复杂的应该是www用户那一步,找到用户以后还要给予其权限,这一步过了就很简单了。

    成功以后每次提交要手动执行一次auto_git.sh文件,下一篇会介绍一种更快捷的方式,通过sublime的快捷键实现push操作

    展开全文
    Dr_cokiy 2017-08-19 20:22:59
  • 38KB weixin_39840387 2019-08-11 02:40:59
  • Microsoft Teams的应用程序有几种形式: Tabs Bots Connectors Messaging extensions ...这篇我们主要介绍如何使用 ASP.NET Core来开发最简单的Outgoing web hook。 什么是outgoing webhook Outgo...

    Microsoft Teams的应用程序有几种形式:

    1. Tabs
    2. Bots
    3. Connectors
    4. Messaging extensions
    5. Activity feed integrations
    6. Outgoing web hooks

    这篇我们主要介绍如何使用 ASP.NET Core来开发最简单的Outgoing web hook。

    什么是outgoing webhook

    Outgoing webhooks allow you to create a simple bot for basic interaction, like kicking off a workflow or other simple commands you may need. Outgoing webhooks live only in the team in which you create them and are intended for simple processes specific to your company’s workflow. 
    If you’ve worked with outgoing webhooks or slash commands in other chat platforms, you can now bring what you have developed over to Microsoft Teams via outgoing webhooks. Outgoing webhooks are an easy way of extending your team without having to go through the full process of creating a bot via the Microsoft Bot Framework. You can use them for custom workflows and commands such as kicking off a build or checking the latest set of livesite issues.
    You also have an effective way of ensuring that your service is accessible only by authorized users, as the security token used by your outgoing webhook will only be scoped to the team in which it has been added

    上面是微软官方对outgoing webhook的说明,其实简单来说,outgoing webhook就是当我们想要创建一个Bot应用时,可以不必使用微软Bot Framework来创建,这个应用可以执行我们团队的一些自定义工作流和简单命令。

    如何在teams里面创建outgoing webhook

    要创建一个outgoing webhook, 进入到Teams应用, 导航到“团队” Tab页, 选中需要建立的Channel, 选中“应用”这个Tab,点击最下方的“创建传出webhook”(英文版本叫Outgoing Webhook), 如下图所示:

    teams_create_webhook

    在“创建传出webhook”对话框中,可以配置传出webhook在频道中的显示方式

    • 名称 将显示为机器人的标题,也是用户将如何命名机器人
    • 回调URL 是将从团队接收消息的端点
    • 说明 是一个详细的字符串,它将显示在配置文件卡和团队级应用程序仪表板中
    • 配置文件图片是 传出webhook的可选显示图片

    outgoing_webhook_setting

    这里我们创建一个名为“TestBot”的程序,填入ngrok中的https的地址(关于ngrok下文会详细说到),单击“创建”,将在当前团队中提供传出webhook。它不会在任何其他团队中提供。下一个对话框将显示一个安全令牌,您将使用该令牌验证来自Microsoft Teams的请求

    webhook_secret_token

    这里我们把这个Security Token复制,保存起来。一旦关闭这个页面以后我们无法再进入到这个页面复制,如果需要拿到这个Token,必须重新创建新的传出webhook。

    让我们来试一下新鲜出炉的webhook。将传出webhook添加到团队后,它的外观和行为就像机器人一样,我们可以轻松地进行交互。它使用带有webhook名称的@mention监听消息,并可以回复丰富的消息,包括图像和卡片等

    teams_at_testbot

    teams_Testbot

    开发传出webhook的后端服务

    上面我们讲到如何在Teams中创建webhook的应用,那当我们发送@这个机器人,并且发送消息时,这个bot应用是如何接受到消息,并且响应这个消息的呢。这里我们基于dotnet core搭建这个bot的后端响应服务程序。
    如果你开发机器上还没有安装 dontnet,那可以到 http://www.dot.net 下载官方SDK,下载完成后,进入到windows标准的安装, 一路“下一步”直到完成。 进入到cmd,输入 dotnet --version,可以看到我们安装的当前dotnet core的版本:

    c:\Users\demouser> dotnet --version
    2.1.300
    

    这里我们看到显示的版本时2.1.300,这个版本是 .NET Core 2.1, 如果是2.1.301,则是 .NET Core 2.1.1

    dotnet --info,我们可以看到整个开发环境的详细信息:

    c:\Users\demouser> dotnet --info     
    

    安装完dotnet core后,我们就可以开始新建web api项目。

    c:\demo> dotnet new webapi -n WebhookSample
    

    用vs code打开我们新建的项目的文件夹,可以看到 .Net Core通过模板,为我们新建的web api的项目结构:

    webapi_project_vscode

    修改Startup.cs文件,注释其中app.UseHttpsRedirection()

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseHsts();
        }
    
        //app.UseHttpsRedirection();
        app.UseMvc();
    }
    

    这里注意下:去掉app.UseHttpsRedirection()的原因是为了简化一些配置自签名证书,如果大家已经配置过了,这个不注释掉也可以。

    修改ValuesController.cs文件,改为如下所示的代码:

    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpPost]
        [Route("api/message")]
        public Activity Post([FromBody]Activity request)
        {
            return new Activity()
            {
                Text = $"you send message is {request.Text}"
            };
        }
    }
    

    执行dotnet run命令来运行项目,默认本地是以 http://localhost:5000 端口运行

    到这里我们的web api项目就整个跑起来了,那么如何和我们在Teams中配置的webhook机器人产生交互呢?这里需要借助于我们上面说到的ngrok这个工具了。

    ngrok 是一个反向代理,通过在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。
    ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放 
    简单来说就是,我们在webhook中配置了一个https的外网地址,需要将bot的信息转发到我们内网localhost:5000提供的web api服务,以响应Teams中的消息

    ngrok官网下载: https://ngrok.com/ 
    运行ngrok.exe,输入命令 ```ngrok http 5000`` 这个命令是让ngrok的服务器把请求转发到本地的5000端口,协议使用HTTP。 
    从下面的截图,我们可以看到工具为我们提供的http和https的两个外网转发地址,两个地址都是指向我们本地的localhost:5000端口 ngrok_requesttracker_console

    这里的https地址,就是我们上面在Teams中配置webhook时候需要填入的地址,为了让webhook中的消息转发到我们本地,并且识别信息,进行响应。那我们重复上文中的步骤:在Teams的channel中输入@Testbot,然后再输入come on, 此时我们会收到一个响应消息,如下图:

    teams_Testbot

    ngrok还为我们提供了一个非常实用的控制面板,打开你喜欢的浏览器,输入http://localhost:4000,ngrok就会列出所有转发的请求和响应:

    ngrok_requesttracker

    点击任何一个请求,在右边就会显示这个请求的详细信息和它所对应的服务响应内容。

    ngrok_requesttracker2

    ngrok_requesttracker2

    此时,我们把本地的web api服务停止掉(在运行服务的窗口按Ctrl + C),看是否还能响应消息,同样在Teams中发送消息

    teams_Testbot

    这里我们看到Bot响应失败了,查看ngrok的控制面板,看到响应报了 502 Bad Gateway 的错误

    teams_Testbot

    **总结一下,整个的逻辑是: 我们在webhook中填入服务的响应地址(必须是https的),随后通过ngrok转发到我们本地5000端口运行的web api程序,程序处理后返回,然后ngrok再返回给teams,teams server再返回给你。

    teams_Testbot

    总结

    这篇文章主要是讲解什么是outgoing webhook,如何在Teams中创建一个webhook,如何使用ASP.NET Core开发webhook后端服务程序,并且通过ngrok这个桥梁,把Teams和你本地运行的服务串联起来。

    在下一篇文章中,我们将会讲到,如何使用dotnet template快速开发带card功能的outgoing webhook

    官网链接

    展开全文
    xxjjxx 2018-11-19 19:58:04
  • 请求setWebhook接口,url参数必须支持https 4. 通过getWebhookInfo接口查看webhook信息 六、自定义指令开发 1. 修改config/telegram.php添加指令 2. 修改默认start指令 3. 修改默认help指令 4. 添加自定义article...

    一、操作Telegram

    1. 创建Telegram机器人

    1. 与@BotFather交谈,或者点击链接 : https://telegram.me/BotFather
    2. 点击Start
    3. 点击 /newbot
    4. 输入机器人名称 name,设置后可以修改
    5. 输入机器人用户名 username,必须以bot结尾,被@和搜索的名字,设置后无法修改
    6. 得到API Token

    2. 创建command指令

    1. 点击/mybot
    2. 点击Edit Bot
    3. 点击Edit Commands
    4. 输入命令列表:
      command1 - 描述
      command2 - 描述
      例如:article - 查看或搜索文章

    二、安装Telegram-Bot-SDK

    1. 执行composer命令

    composer require irazasyed/telegram-bot-sdk ^2.0
    

    2. 修改config/app.php添加配置

    'providers' => [
    	Telegram\Bot\Laravel\TelegramServiceProvider::class
    ]
    'aliases' => [
    	'Telegram' => Telegram\Bot\Laravel\Facades\Telegram::class
    ]
    

    3. 执行命令发布配置

    php artisan vendor:publish --provider="Telegram\Bot\Laravel\TelegramServiceProvider"
    

    4. 添加.env配置

    TELEGRAM_BOT_TOKEN=API TOKEN
    TELEGRAM_ASYNC_REQUESTS=false
    

    三、使用Telegram-Bot-API

    以Laravel-admin自定义行操作为例

    <?php
    namespace App\Admin\Actions\Article;
    
    use Encore\Admin\Actions\RowAction;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Facades\Storage;
    use Telegram\Bot\Laravel\Facades\Telegram;
    
    class SendToTGChannel extends RowAction
    {
        public $name = '发送文章到TG频道';
    
        public $chat_id = '@xxxxx'; //@channelusername
    
        public function handle(Model $model)
        {
            $title = "<a href={https://domin/article/$model->id}>{$model->title}</a>";
    
            if ($model->cover) { //有封面 发图片
                $response = Telegram::sendPhoto([
                    'chat_id' => $this->chat_id,
                    'photo' => Storage::disk(config('admin.upload.disk'))->path($model->cover),
                    'caption' => $title,
                    'parse_model' => 'html', //支持html和markdown
                ]);
            } else {
                $response = Telegram::sendMessage([
                    'chat_id' => $this->chat_id,
                    'text' => $title,
                    'parse_model' => 'html',
                ]);
            }
    
            $messageId = $response->getMessageId();
            if ($messageId) {
                return $this->response()->success('发送成功')->refresh();
            } else {
                return $this->response()->error('发送失败')->refresh();
            }
        }
    
        public function dialog()
        {
            $this->confirm('确定发送文章到TG频道?');
        }
    }
    

    四、设置Webhook

    1. web应用添加路由

    1. 修改routes/web.php,添加Webhook URI到路由中,不能有需要授权的中间件
    Route::post('/API TOKEN/webhook', function () {
        Telegram\Bot\Laravel\Facades\Telegram::commandsHandler(true);
    });
    
    1. 修改app\Http\Middleware\VerifyCsrfToken.php,将webhook URI添加到$except数组
         protected $except = [
            '/API TOKEN/webhook',
        ];
    

    2. API添加路由

    1. 修改routes/api.php
    //dingo api
    $api->post('v1/API TOKEN/webhook', function () {
    	Telegram\Bot\Laravel\Facades\Telegram::commandsHandler(true);
    });
    

    3. 请求setWebhook接口,url参数必须支持https

    curl https://api.telegram.org/botAPI TOKEN/setWebhook --data url=https://domain/API TOKEN/webhook
    

    4. 通过getWebhookInfo接口查看Webhook信息

    curl https://api.telegram.org/botAPI TOKEN/getWebhookInfo
    

    五、自定义指令开发

    1. 修改config/telegram.php添加指令

    'commands' => [
        //Telegram\Bot\Commands\HelpCommand::class,
        App\Console\Telegram\Start::class,
        App\Console\Telegram\Help::class,
        App\Console\Telegram\Article::class,
    ],
    

    2. 修改默认start指令

    <?php
    
    namespace App\Console\Telegram;
    
    use Telegram\Bot\Actions;
    use Telegram\Bot\Commands\Command;
    
    class Start extends Command
    {
        /**
         * @var string Command Name
         */
        protected $name = 'start';
    
        /**
         * @var string Command Description
         */
        protected $description = '开始';
    
        /**
         * {@inheritdoc}
         */
        public function handle($arguments)
        {
            //回复消息
            $this->replyWithMessage(['text' => '你好!欢迎使用机器人,以下是我们可以用的指令:']);
    
            //切换到输入状态
            $this->replyWithChatAction(['action' => Actions::TYPING]);
    
            //触发帮助指令
            $this->triggerCommand('help');
    
            $this->replyWithMessage(['text' => '以下是热门文章:']);
    
            $this->replyWithChatAction(['action' => Actions::TYPING]);
    
            $this->triggerCommand('article');
        }
    }
    

    3. 修改默认help指令

    <?php
    
    namespace App\Console\Telegram;
    
    use Telegram\Bot\Commands\Command;
    
    class Help extends Command
    {
        /**
         * @var string Command Name
         */
        protected $name = 'help';
    
        /**
         * @var string Command Description
         */
        protected $description = '帮助';
    
        /**
         * {@inheritdoc}
         */
        public function handle($arguments)
        {
            $commands = $this->telegram->getCommands();
    
            $text = '';
            foreach ($commands as $name => $handler) {
                $text .= sprintf('/%s - %s'.PHP_EOL, $name, $handler->getDescription());
            }
    
            $this->replyWithMessage(compact('text'));
        }
    }
    

    4. 添加自定义article指令

    <?php
    
    namespace App\Console\Telegram;
    
    use App\Models\ArticleModel;
    use Telegram\Bot\Commands\Command;
    
    class Article extends Command
    {
        /**
         * @var string Command Name
         */
        protected $name = 'Article';
    
        /**
         * @var string Command Description
         */
        protected $description = '查看或搜索文章';
    
        /**
         * {@inheritdoc}
         */
        public function handle($arguments)
        {
            if ($arguments) {//搜索 /article 新冠肺炎	回复标题包含“新冠肺炎”的10篇文章
                $article = ArticleModel::where('title', 'LIKE', "%{$arguments}%")->take(10)->get();
            } else {
                $article = ArticleModel::orderBy('created_at', 'DESC')->take(10)->get();
            }
    
            $return = [
                'text' => '',
                'parse_mode' => 'html' //支持html和markdown
            ];
    
            foreach ($article as $item) {
                $return['text'] .= "
    <a href={https://domin/article/$item->id}>{$item->title}</a>
                ";
            }
    
            $this->replyWithMessage($return);
        }
    }
    
    展开全文
    Hannnnnnnnnnnnn 2020-11-25 16:49:52
  • 6KB weixin_42139302 2021-02-05 05:32:21
  • 基于GitLab的Webhook对Merge Request和Tag Push事件自动发送企业微信通知。

    本文主要介绍如何使用gitlab的webhook来打通企业微信消息提醒。

    前提准备

    企业微信消息发送接口

    根据企业微信开发者文档得到一个消息发送的接口url,参照:企业微信群机器人配置说明

    gitlab(账号,用户组,项目)

    • 生成gitlab账号token
      在这里插入图片描述
      在这里插入图片描述

    • 获取项目的project_id
      参考gitlab如何查询项目ID

    • 获取用户组的group_id
      方法类似于上面project_id的获取

    gitlab开放API文档

    开放API文档
    在这里插入图片描述

    webhook配置和开发

    配置webhook

    在这里插入图片描述

    Secret TokenEnable SSL verification配置项可以先不配置。

    在这里配置wenhook,我这里先配置两个触发事件,Tag push events(tag新增/删除事件)和Merge request events(MR新增/删除事件)。

    gitlab的webhook原理

    上面的配置中有一个URL配置项还没有配置。
    想知道这里应该配什么,首先应该了解gitlab的webhook工作原理。

    这里还是以发送通知到企业微信为例。

    在这里插入图片描述

    1. 项目代码变动往gitlab上推送相应的事件,例如代码push,新建tag,创建merge request等等;
    2. gitlab收到相应事件,触发对应的webhook,设置HTTP请求的header以及request body,然后发送HTTP请求到配置的webhook的URL;
    3. HTTP请求到达对应的处理服务器以后,对request body和header进行解析,包装通知内容;
    4. 将通知的内容通过企业微信的消息发送接口发送到企业微信;
      具体参考webhook使用指南
      在这里插入图片描述
      接下来所有的重点就是这个URL是什么?他应该是一个接口,用来处理gitlab的事件。

    项目实战

    前提准备做好之后,就可以开发处理事件的服务端了(基于SpringBoot项目)。
    以下是一些核心代码。
    GitLabApiUtils.java

    /**
         * 获取所以项目master成员
         * @param projectId
         * @return
         */
        public static List<String> getAllProjectMembers(Integer projectId) {
            getProjectMembersUrl = getProjectMembersUrl.replace("$",""+projectId);
            getGroupMembersUrl = getGroupMembersUrl.replace("$","800");
            List<String> projectMasterMembers = getGitLabMasterMembers(getProjectMembersUrl);
            List<String> groupMasterMembers = getGitLabMasterMembers(getGroupMembersUrl);
            return Stream.of(projectMasterMembers,groupMasterMembers).flatMap(Collection::stream).distinct().collect(Collectors.toList());
        }
    
    /**
         * 获取master成员
         * @param url
         * @return
         */
        private static List<String> getGitLabMasterMembers(String url) {
            List<String> result = new ArrayList<>();
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder().url(url).header("PRIVATE-TOKEN",token).build();
            Response response = null;
            try {
                response = okHttpClient.newCall(request).execute();
                String body = response.body().string();
                JSONArray jsonArray = JSONArray.parseArray(body);
                for (int i = 0;i < jsonArray.size();i++) {
                    JSONObject jsonObject = jsonArray.getJSONObject(i);
                    if (jsonObject.getInteger("access_level") == 40) {
                        result.add(jsonObject.getString("name"));
                    }
                }
            } catch (IOException e) {
                log.error("调用GitLab API失败!",e);
            } finally {
                if (response != null) {
                    response.close();
                }
            }
            return result;
        }
    

    这个例子中只做了Tag Push Event和Merge Request Event的处理,主要是根据不同的事件构建不同的企业微信消息内容。其他的可以自己扩展。
    MessageStrategy.java

    /**
     * 构建消息内容
     */
    public interface MessageStrategy {
        String produceMsg(JSONObject jsonObject);
    }
    

    TagMessageStrategy.java

    @Override
        public String produceMsg(JSONObject jsonObject) {
            String operateType = OPERATE_TYPE_ADD;
            if ("0000000000000000000000000000000000000000".equals(jsonObject.getString("after"))) {
                operateType = OPERATE_TYPE_DELETE;
            }
            Integer projectId = jsonObject.getInteger("project_id");
            JSONObject prObject = jsonObject.getJSONObject("project");
            String repo = prObject.getString("name");
            String operator = jsonObject.getString("user_name");
            String tag = jsonObject.getString("ref");
            String[] tagArr = tag.split("/");
            tag = tagArr[tagArr.length-1];
            String detailUrl = prObject.getString("web_url")+"/tags/"+tag;
            String commitInfo = "";
            if (OPERATE_TYPE_ADD.equals(operateType)) {
                String newTagMsg = jsonObject.getString("message");
                JSONObject latestCommit = jsonObject.getJSONArray("commits").getJSONObject(0);
                String latestCommitMsg = latestCommit.getString("message").replaceAll("\r\n"," ");
                String latestCommitUser = latestCommit.getJSONObject("author").getString("name");
                commitInfo = "\n>Tag描述:"+newTagMsg
                        +"\n>最近一次提交信息:"+latestCommitMsg
                        +"\n>最近一次提交人:"+latestCommitUser;
            }
            List<String> members = GitLabApiUtils.getAllProjectMembers(projectId);
            String alertUsers = members.stream().map(s -> "@"+s+" ").collect(Collectors.joining());
            String alertContent = alertUsers+"<font color=\\\"info\\\">【"+repo+"】</font>"+operator+"<font color=\\\"info\\\">"+operateType+"</font>了一个Tag!"
                    +"\n>Tag名称:"+tag
                    +commitInfo
                    +"\n>[查看详情]("+detailUrl+")";
            return alertContent;
        }
    

    MRMessageStrategy.java

    @Override
        public String produceMsg(JSONObject jsonObject) {
            String operator = jsonObject.getJSONObject("user").getString("name");
            JSONObject objectAttributes = jsonObject.getJSONObject("object_attributes");
            String operateType = "变更";
            String state = objectAttributes.getString("state");
            if ("closed".equals(state)) {
                operateType = "关闭";
            } else if ("opened".equals(state)) {
                operateType = "新增";
            } else if ("merged".equals(state)) {
                operateType = "审核通过";
            }
            String source = objectAttributes.getString("source_branch");
            String target = objectAttributes.getString("target_branch");
            Integer projectId = objectAttributes.getInteger("target_project_id");
            String title = objectAttributes.getString("title");
            String description = objectAttributes.getString("description");
            JSONObject lastCommit = objectAttributes.getJSONObject("last_commit");
            String lastCommitMsg = lastCommit.getString("message").replaceAll("\n","");
            String lastCommitUser = lastCommit.getJSONObject("author").getString("name");
            String repo = objectAttributes.getJSONObject("target").getString("name");
            String url = objectAttributes.getString("url");
            List<String> members = GitLabApiUtils.getAllProjectMembers(projectId);
            String alertUsers = members.stream().map(s -> "@"+s+" ").collect(Collectors.joining());
            String alertContent = alertUsers+"<font color=\\\"info\\\">【"+repo+"】</font>"+operator+"<font color=\\\"info\\\">"+operateType+"</font>了一个Merge Request!"
                    +"\n>标题:"+title
                    +"\n>描述:"+description
                    +"\n>Source Branch:"+source
                    +"\n>Target Branch:"+target
                    +"\n>最近一次提交信息:"+lastCommitMsg
                    +"\n>最近一次提交人:"+lastCommitUser
                    +"\n>[查看详情]("+url+")";
            return alertContent;
        }
    

    AlertController.java

    @PostMapping("/alert")
        public String alert(@RequestBody JSONObject jsonObject, HttpServletRequest request) {
            String bodyContext = "发送成功";
            String objectKind = jsonObject.getString("object_kind");
            MessageStrategy messageStrategy = null;
            if("tag_push".equals(objectKind)) {
                messageStrategy = new TagMessageStrategy();
            } else if("merge_request".equals(objectKind)) {
                messageStrategy = new MRMessageStrategy();
            }
            MessageStrategyContext messageStrategyContext = new MessageStrategyContext(messageStrategy);
            String alertContent = messageStrategyContext.buildMessage(jsonObject);
            log.info("消息内容:"+alertContent);
            String[] cmds={"curl",weChatSendUrl,"-H"
                    ,"Content-Type: application/json","-d","{\"msgtype\": \"markdown\",\"markdown\": {\"content\": \""+alertContent+"\"}}"};
            ProcessBuilder process = new ProcessBuilder(cmds);
            try {
                process.start();
            } catch (Exception e) {
                bodyContext = "发送失败";
            }
            return bodyContext;
        }
    

    完整代码请查看gitlab-to-企业微信


    经过开发之后webhook配置项里的URL自然也就有了,那就是http://{服务ip}:{服务端口}/alert

    总结

    其实hook这种设计在很多地方都有,且不说一些开源中间件,JDK本身就提供了ShutdownHook,最重要的还是了解hook的工作原理,才能更好的使用hook,感受它带来的扩展和便捷。

    展开全文
    qq_18515155 2020-12-07 15:53:51
  • boling_cavalry 2021-02-21 19:32:04
  • zyxpaomian 2021-06-01 15:14:46
  • weixin_43130350 2021-04-14 21:15:45
  • 65KB weixin_42097208 2021-03-19 06:42:47
  • xiashanrenlaozhang 2019-06-29 12:11:08
  • weixin_42487788 2021-03-22 10:02:33
  • 21KB weixin_42133415 2021-05-27 08:05:18
  • wzj_110 2019-12-07 21:25:53

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,110
精华内容 2,844
关键字:

webhook开发