Веб-книги Github получают сведения о ветке

#php #git #github #webhooks

#php #git #github #веб-книги

Вопрос:

Я пытаюсь сделать следующее:

  1. Создайте веб-хук Github (готово)
  2. Создайте приложение PHP / Node, на которое указывает GIHook (готово)
  3. Ответ процесса (вот в чем проблема)
  4. В зависимости от того, на какую ветку передана, отправьте запрос на dev или текущий сервер для выполнения update.sh (сделано)

Проблема в том, что GIHook отправляет мне это:

 {
"REQUEST_METHOD":"GET",
"CONTENT_TYPE":"application/json",
"headers":{
"Content-Type":"application/json",
"X-Hub-Signature-256":"sha256=xxxx",
"X-Hub-Signature":"sha1=xxx",
"X-Github-Hook-Installation-Target-Type":"repository",
"X-Github-Hook-Installation-Target-Id":"xxx",
"X-Github-Hook-Id":"xxx",
"X-Github-Event":"push",
"X-Github-Delivery":"xxx",
"Referer":"webhook url called",
"Accept":"*/*",
"User-Agent":"GitHub-Hookshot/8338482",
"Connection":"close",
"X-Accel-Internal":"/internal-nginx-static-location",
"X-Real-Ip":"xxx",
"Host":"xxxx"
},
"JSON":"",
"POST":[],
"GET":[],
"payload":null
},
 

Который не сообщает мне, к какой ветке была привязана.

Итак, затем я прочитал еще несколько фрагментов и обнаружил, что нужно получить больше информации, но вопрос в том, как. Итак, я бы предположил, что я бы вызвал api и передал идентификатор или что-то в этом роде, и после некоторого поиска в Google это выглядело так. Итак, я протестировал:

 # :HOOK_ID = X-Github-Hook-Id
curl -o -v - https://api.github.com/repos/:GitHubUserNameInUrl/:PrivateRepo/hooks/:HOOK_ID
 

и проделал то же самое с php через curl, а file получает содержимое только для того, чтобы все возвращали один и тот же результат:

 {
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest/reference/repos#get-a-repository-webhook"
}
 

У кого-нибудь есть идея, как получить полезную нагрузку из ответа, который дает мне webhook (PHP или Node)?

Спасибо

D

ОТВЕТ 1 Спасибо за этот ответ, но я не получаю никакой информации, подобной той, которую вы получаете от своего webhook. Вот код, который я использую для проверки данных моего ответа, когда веб-хук вызывает мой URL. JSON всегда «», а POST, GET всегда являются пустыми массивами [].

 $file = 'log.json';

$dte = date("d-m-y H:i:s");
$headers = getallheaders();
$data = [];
$data["date"] = $dte;
$data["REQUEST_METHOD"] = $_SERVER["REQUEST_METHOD"];
$data["CONTENT_TYPE"] = $_SERVER["CONTENT_TYPE"];
$data["headers"] = $headers;
$data["JSON"] = json_decode(file_get_contents('php://input')); // Always null || ""
$data["POST"] = $_POST; // Always []
$data["GET"] = $_GET; // Always []


$hookid = $headers["X-Github-Hook-Id"];
$data["hook_id"] = $hookid;

$APIUrl = "https://api.github.com/repos";
$url = $APIUrl . "/GITHUB_USER/REPO/hooks/".$hookid;
$data["callback"] = $url;

// Using file_get_contents
// $result = file_get_contents($url);
// $payload = json_decode($result, true);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
$result = curl_exec($ch);
curl_close($ch);
$payload = json_decode($result, true);
$data["payload"] = $payload;

$out = json_encode($data) . ",n";
file_put_contents($file, $out, FILE_APPEND | LOCK_EX);
 

Ответ №1:

Проверьте свой код, который декодирует полезную нагрузку.

Для "X-Github-Event":"push", и Content-Type: application/x-www-form-urlencoded полезная нагрузка в процентах кодируется в формате JSON, а не null

 POST /test HTTP/1.1
Host: lcherone.requestcatcher.com
Connection: close
Accept: */*
Connection: close
Content-Length: 11363
Content-Type: application/x-www-form-urlencoded
User-Agent: GitHub-Hookshot/8338482
X-Github-Delivery: e39cc102-318e-11eb-8301-d4f46caa1c8a
X-Github-Event: push
X-Github-Hook-Id: 265270862
X-Github-Hook-Installation-Target-Id: 316492816
X-Github-Hook-Installation-Target-Type: repository
X-Hub-Signature: sha1=0baa6d15c266c08111508642607acc86b15f1f43
X-Hub-Signature-256: sha256=6c58a95d4a5a3cde91bcc2621d6608a5190b1178be197db00ed6dd4364137898

payload={"ref":"refs/heads/main","before":"0000000000000000000000000000000000000000","after":"4872b45f3df6d2b0485a69adb8c7476934be7629","repository":{"id":316492816,"node_id":"MDEwOlJlcG9zaXRvcnkzMTY0OTI4MTY=","name":"wightsystems","full_name":"wightsystems/wightsystems","private":false,"owner":%7...snip
 

Что для декодирования вы бы сделали:

$payload = json_decode(urldecode($_POST['payload'])); (возможно, не требуется urldecode, я не проверял)

В то время как, если вы выберете Content-Type: application/json полезную нагрузку, это необработанный json:

 POST /test HTTP/1.1
Host: lcherone.requestcatcher.com
Connection: close
Accept: */*
Connection: close
Content-Length: 8176
Content-Type: application/json
User-Agent: GitHub-Hookshot/8338482
X-Github-Delivery: 2c350428-3190-11eb-90a9-13e895014cf2
X-Github-Event: push
X-Github-Hook-Id: 265270862
X-Github-Hook-Installation-Target-Id: 316492816
X-Github-Hook-Installation-Target-Type: repository
X-Hub-Signature: sha1=20ea83c65ee1771913829db5553a13c09d5d44c0
X-Hub-Signature-256: sha256=eb89d594cfa830be18d11f00d502bd0fdb118fa9017496a8bf52c6a286b1ced6

{"ref":"refs/heads/main","before":"4872b45f3df6d2b0485a69adb8c7476934be7629","after":"ab03e7b705440088a6e22f06d31a660c8185bcb6","repository":{"id":316492816,"node_id":"MDEwOlJlcG9zaXRvcnkzMTY0OTI4MTY=","name":"wightsystems","full_name":"wightsystems/wightsystems","private":false,"owner":...snip}
 

Что было бы:

$payload = json_decode(file_get_contents('php://input'));

После декодирования у него есть куча данных, включая ветку, которая есть ref , и для доступа к ней будет:

echo str_replace('refs/heads/', '', $payload->ref);

 stdClass Object
(
    [ref] => refs/heads/main
    [before] => 0000000000000000000000000000000000000000
    [after] => 4872b45f3df6d2b0485a69adb8c7476934be7629
    ...snip
 

Комментарии:

1. Я не понимаю этих подробностей, добавил код в ОТВЕТ 1 в основной вопрос, чтобы ответить вам. Мой ввод JSON php:// всегда равен нулю, веб-хук настроен на режим json.

2. проверьте, что отправлено на странице редактирования webhook внизу (последние поставки). Я очень сомневаюсь, что они отправили бы null, если это так, то вы должны сообщить об этом, поэтому я сказал Проверить ваш код, который декодирует полезную нагрузку. поскольку полезная нагрузка не содержит }, "JSON":"", "POST":[], "GET":[], , это должен быть ваш код. Это помогло бы, если бы вы добавили свой код приемника webhook.

3. В веб-книгах Github журнал показывает, что он отправил полезную нагрузку и с необходимой мне информацией, но то, что получает мой скрипт, равно нулю, когда я использую file_get_contents(«php: //input»). «JSON»: «», «POST»: [], «GET»: [] — это просто мой тестовый php-код, выгружающий содержимое в текстовый файл, чтобы я мог видеть, что происходит.

4. У меня также есть веб-хук github, настроенный на отправку всего.

5. вы настроили его на отправку application / json? если да, можете ли вы добавить свой код .. в принципе, webhook не отправляет null

Ответ №2:

Перенаправление NGINX с / на /index.php была проблема, кажется, что все данные не полностью передаются через перенаправление с / на index.php .

РЕШЕНИЕ Установите webhook так, чтобы он указывал на файл напрямую, в данном случае index.php