#php #git #github #webhooks
#php #git #github #веб-книги
Вопрос:
Я пытаюсь сделать следующее:
- Создайте веб-хук Github (готово)
- Создайте приложение PHP / Node, на которое указывает GIHook (готово)
- Ответ процесса (вот в чем проблема)
- В зависимости от того, на какую ветку передана, отправьте запрос на 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