处理 Gitlab Issue 的事件,使用微信公众号的模板消息,提醒项目成员。
使用 Laravel 框架来接收 Gitlab 的事件,通过 gitlab 用户 email 和该用户的公众号 openid 的map,用公众号 push 模板消息 推送给对应的 openid
用这个包接收 webhook :
https://github.com/TJVB/gitlab-webhooks-receiver-for-laravel
扩展介绍:这个包处理 webhook 数据的接收、验证和存储。收到后,它将发送一个事件,该事件可用于处理适合您的应用程序的数据。
在项目-设置-Webhooks可以设置链接和token以及通知类型。
按照 gitlab-webhooks-receiver-for-laravel 的文档,Listener事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php
namespace App\Listeners;
use TJVB\GitLabWebhooks\Events\HookStored; use App\Lib\WxNotice;
class GitlabWebhooksListener { public function __construct() { }
public function handle(HookStored $event) { $body = $event->getHook()->body; .. // 获取要发信的成员 $exclude_user_id = $user_id; // 排除发消息的人 if (!key_exists($project_id, config('wxmap'))) { return; } $users = config('wxmap')[$project_id]; if (key_exists($exclude_user_id, $users)) { unset($users[$exclude_user_id]); } $users = array_filter(array_values($users));
foreach ($users as $key => $value) { if ($body['event_type'] == 'note') { $res = WxNotice::note($value, $title, $user, $created_at, $note, $url); } } } }
|
在 App\Providers\EventServiceProvider.php 设置 listen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class EventServiceProvider extends ServiceProvider { /** * The event listener mappings for the application. * * @var array */ protected $listen = [ ... \TJVB\GitLabWebhooks\Events\HookStored::class => [ \App\Listeners\GitlabWebhooksListener::class, ], ... ]; ..
|
WxNotice:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| <?php namespace App\Lib;
use EasyWeChat\Factory;
class WxNotice { public static function note($open_id, $title, $user, $date, $content, $url) {
$config = [ 'app_id' => 'xx', 'secret' => 'xx',
// 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名 'response_type' => 'array',
//... ];
$app = Factory::officialAccount($config);
$res = $app->template_message->send([ 'touser' => $open_id, 'template_id' => 'xx', 'url' => $url, 'data' => [ 'first' => $title, 'keyword1' => $user, 'keyword2' => $date, 'keyword3' => $content, 'remark' => '' ] ]); return $res; } }
|
wxmap.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?php
return [ // 上海朗沐/询价 '4' => [ // project id '1' => 'xx', // 我的openid '5' => '', // '6' => '' // aa // .. 把这个项目里的用户都加进来,这样才能通知到 ], // xx '6' => [ // project id '11' => '', // '15' => '', // '16' => '', // '7' => '' // ],
];
|