code.gitea.io/gitea@v1.22.3/docs/content/usage/webhooks.zh-cn.md (about) 1 --- 2 date: "2016-12-01T16:00:00+02:00" 3 title: "Webhooks" 4 slug: "webhooks" 5 sidebar_position: 30 6 toc: false 7 draft: false 8 aliases: 9 - /zh-cn/webhooks 10 menu: 11 sidebar: 12 parent: "usage" 13 name: "Webhooks" 14 sidebar_position: 30 15 identifier: "webhooks" 16 --- 17 18 # Webhooks 19 20 Gitea支持用于仓库事件的Webhooks。这可以在仓库管理员在设置页面 `/:username/:reponame/settings/hooks` 中进行配置。Webhooks还可以基于组织和整个系统进行配置。 21 所有事件推送都是 POST 请求。目前支持: 22 23 - Gitea (也可以是 GET 请求) 24 - Gogs 25 - Slack 26 - Discord 27 - Dingtalk(钉钉) 28 - Telegram 29 - Microsoft Teams 30 - Feishu 31 - Wechatwork(企业微信) 32 - Packagist 33 34 ### 事件信息 35 36 **警告**:自 Gitea 1.13.0 版起,payload 中的 `secret` 字段已被弃用,并将在 1.14.0 版中移除:https://github.com/go-gitea/gitea/issues/11755 37 38 以下是 Gitea 将发送给 payload URL的事件信息示例: 39 40 ``` 41 X-GitHub-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473 42 X-GitHub-Event: push 43 X-Gogs-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473 44 X-Gogs-Event: push 45 X-Gitea-Delivery: f6266f16-1bf3-46a5-9ea4-602e06ead473 46 X-Gitea-Event: push 47 ``` 48 49 ```json 50 { 51 "secret": "3gEsCfjlV2ugRwgpU#w1*WaW*wa4NXgGmpCfkbG3", 52 "ref": "refs/heads/develop", 53 "before": "28e1879d029cb852e4844d9c718537df08844e03", 54 "after": "bffeb74224043ba2feb48d137756c8a9331c449a", 55 "compare_url": "http://localhost:3000/gitea/webhooks/compare/28e1879d029cb852e4844d9c718537df08844e03...bffeb74224043ba2feb48d137756c8a9331c449a", 56 "commits": [ 57 { 58 "id": "bffeb74224043ba2feb48d137756c8a9331c449a", 59 "message": "Webhooks Yay!", 60 "url": "http://localhost:3000/gitea/webhooks/commit/bffeb74224043ba2feb48d137756c8a9331c449a", 61 "author": { 62 "name": "Gitea", 63 "email": "someone@gitea.io", 64 "username": "gitea" 65 }, 66 "committer": { 67 "name": "Gitea", 68 "email": "someone@gitea.io", 69 "username": "gitea" 70 }, 71 "timestamp": "2017-03-13T13:52:11-04:00" 72 } 73 ], 74 "repository": { 75 "id": 140, 76 "owner": { 77 "id": 1, 78 "login": "gitea", 79 "full_name": "Gitea", 80 "email": "someone@gitea.io", 81 "avatar_url": "https://localhost:3000/avatars/1", 82 "username": "gitea" 83 }, 84 "name": "webhooks", 85 "full_name": "gitea/webhooks", 86 "description": "", 87 "private": false, 88 "fork": false, 89 "html_url": "http://localhost:3000/gitea/webhooks", 90 "ssh_url": "ssh://gitea@localhost:2222/gitea/webhooks.git", 91 "clone_url": "http://localhost:3000/gitea/webhooks.git", 92 "website": "", 93 "stars_count": 0, 94 "forks_count": 1, 95 "watchers_count": 1, 96 "open_issues_count": 7, 97 "default_branch": "master", 98 "created_at": "2017-02-26T04:29:06-05:00", 99 "updated_at": "2017-03-13T13:51:58-04:00" 100 }, 101 "pusher": { 102 "id": 1, 103 "login": "gitea", 104 "full_name": "Gitea", 105 "email": "someone@gitea.io", 106 "avatar_url": "https://localhost:3000/avatars/1", 107 "username": "gitea" 108 }, 109 "sender": { 110 "id": 1, 111 "login": "gitea", 112 "full_name": "Gitea", 113 "email": "someone@gitea.io", 114 "avatar_url": "https://localhost:3000/avatars/1", 115 "username": "gitea" 116 } 117 } 118 ``` 119 120 ### 示例 121 122 这是一个示例,演示如何使用 Webhooks 在推送请求到达仓库时运行一个 php 脚本。 123 在你的仓库设置中,在 Webhooks 下,设置一个如下的 Gitea webhook: 124 125 - 目标 URL:http://mydomain.com/webhook.php 126 - HTTP 方法:POST 127 - POST Content Type:application/json 128 - Secret:123 129 - 触发条件:推送事件 130 - 激活:勾选 131 132 现在在你的服务器上创建 php 文件 webhook.php。 133 134 ``` 135 <?php 136 137 $secret_key = '123'; 138 139 // check for POST request 140 if ($_SERVER['REQUEST_METHOD'] != 'POST') { 141 error_log('FAILED - not POST - '. $_SERVER['REQUEST_METHOD']); 142 exit(); 143 } 144 145 // get content type 146 $content_type = isset($_SERVER['CONTENT_TYPE']) ? strtolower(trim($_SERVER['CONTENT_TYPE'])) : ''; 147 148 if ($content_type != 'application/json') { 149 error_log('FAILED - not application/json - '. $content_type); 150 exit(); 151 } 152 153 // get payload 154 $payload = trim(file_get_contents("php://input")); 155 156 if (empty($payload)) { 157 error_log('FAILED - no payload'); 158 exit(); 159 } 160 161 // get header signature 162 $header_signature = isset($_SERVER['HTTP_X_GITEA_SIGNATURE']) ? $_SERVER['HTTP_X_GITEA_SIGNATURE'] : ''; 163 164 if (empty($header_signature)) { 165 error_log('FAILED - header signature missing'); 166 exit(); 167 } 168 169 // calculate payload signature 170 $payload_signature = hash_hmac('sha256', $payload, $secret_key, false); 171 172 // check payload signature against header signature 173 if ($header_signature !== $payload_signature) { 174 error_log('FAILED - payload signature'); 175 exit(); 176 } 177 178 // convert json to array 179 $decoded = json_decode($payload, true); 180 181 // check for json decode errors 182 if (json_last_error() !== JSON_ERROR_NONE) { 183 error_log('FAILED - json decode - '. json_last_error()); 184 exit(); 185 } 186 187 // success, do something 188 ``` 189 190 在 Webhook 设置中有一个“测试推送(Test Delivery)”按钮,可以测试配置,还有一个“最近推送记录(Recent Deliveries)”的列表。 191 192 ### 授权头(Authorization header) 193 194 **从1.19版本开始**,Gitea 的 Webhook 可以配置为向 Webhook 目标发送一个 [授权头(authorization header)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization)。