- Регистрация
- 19.03.2021
- Сообщения
- 59
- Реакции
- 225
- Баллы
- 33
На момент написания статьи появился ещё один способ реализовать работу с вебхуками, настоятельно рекомендую ознакомиться
В данной статье мы рассмотрим, как работать с вебхуками в ZennoPoster (в данном примере с TG) и как реализовать скрипт, который будет принимать запросы. В статье представлены способы поднятия скрипта и для хостинга, и для VPS. Рассмотрим реализацию на PHP, Node.js и Python.
Что это такое ваш «вебхук»:
Webhook – это автоматически сгенерированный HTTP-запрос, созданный на основе каких-то данных. Он запускается предопределенным событием или действием в исходной системе и передается системе, с которой исходная система пытается установить связь.
Webhook работает быстрее, чем опрос или API. Вместе с этим для разработчиков он является менее трудоемким с точки зрения работы. Применительно к приложениям, Webhook – это не что иное, как SMS-уведомления, которые мы получаем во время использования приложения. Например, при покупке некого товара в Интернете продавец присылает вам уведомление по SMS.
Аналогично, каждый раз, когда в исходной системе происходит некоторое событие/действие, система принимающей стороны уведомляется через Webhook.
Источник: https://dzen.ru/a/YuwNNFsDd1B9M8zg
Webhook работает быстрее, чем опрос или API. Вместе с этим для разработчиков он является менее трудоемким с точки зрения работы. Применительно к приложениям, Webhook – это не что иное, как SMS-уведомления, которые мы получаем во время использования приложения. Например, при покупке некого товара в Интернете продавец присылает вам уведомление по SMS.
Аналогично, каждый раз, когда в исходной системе происходит некоторое событие/действие, система принимающей стороны уведомляется через Webhook.
Источник: https://dzen.ru/a/YuwNNFsDd1B9M8zg
Как будет работать webhook в наших шаблонах:
- Telegram передает на наш сервер данные в виде json
- Наш сервер сохраняет данные* в нашу базу данных
- Из базы данных мы можем запросить json с помощью ZennoPoster и использовать его в своих целях
Для сайта/IP адреса нам нужен SSL сертификат, подойдет и самоподписной, и которые предоставляют хостинги бесплатно.
1. Выбираем и настраиваем платформу
Хостинг для сайтов
На самом деле подойдет любой, который поддерживает PHP/Python/Node.js и есть возможность создать бд. Создаем отдельный каталог или же можем работать в корневом каталоге сайта.
VPS/VDS
В данном случае потребуется вручную поднимать phpMyAdmin, nginx (либо apache) и устанавливать самоподписные сертификаты. Я беру под такие задачи сервер с параметрами: AMD Epic 1 ядро, 2 Гб ОЗУ, 30 GB NVMe, ОС выбрал Ubuntu 18.04.
В таких случаях я обычно пользуюсь приведенными ниже гайдами:
- Устанавливаем nginx: https://www.digitalocean.com/community/tutorials/nginx-ubuntu-18-04-ru
- Устанавливаем phpMyAdmin: https://eternalhost.net/base/vps-vds/nginx-ustanovka-phpmyadmin-ubuntu
- Создаем самоподписные сертификаты: https://www.8host.com/blog/sozdanie-samopodpisannogo-ssl-sertifikata-dlya-nginx-v-ubuntu-18-04/
2. phpMyAdmin
Первым делом нам требуется скачать архив, который расположен в самом низу этой статьи. Внутри архива есть папка «webhook», в которой расположены скрипты под разные ЯП – python, node.js и php. Также имеется файл zenno.sql, который потребуется импортировать в phpMyAdmin.
Этот способ подходит и для хостинга, и для VPS, т.к. используется phpMyAdmin в обоих случаях.
- Входим в pma, выбираем базу данных, в которую будет импортироваться таблица
- Нажимаем «Импорт»
- Выбираем файл zenno.sql и нажимаем «Вперёд»
Для хостинга
Самым простым и быстрым способом является установить файлы из папки php в желаемый каталог на хостинге. Хостинги без каких-либо настроек сразу смогут работать с этими файлами. Чтобы все заработало нам остается указать необходимые данные от базы данных в connect.php.
Для VPS/VDS
PHP
Для запуска PHP скрипта нам требуется загрузить файлы в директорию, которая была указана в конфигурации nginx/apache. В файле connect.php требуется указать данные от базы данных.
Python
Для установки и запуска Python скрипта, нам потребуется установить необходимые пакеты:
sudo pip install configparser && sudo pip install flask && sudo pip install mysql-connector-pythonПосле установки и заполнения данных от бд в config.ini, мы можем запустить наш скрипт, командой
python main.pyNode.js
Для Node.js скрипта, потребуется установить пакеты и сам Node.js:
sudo apt install nodejs && sudo apt install npm && sudo npm i express && sudo npm i body-parser && sudo npm i mysqlПосле установки и заполнения данных от бд в main.js, мы можем запустить наш скрипт, командой
node main.jsКонфигурация nginx
В основном я проксирую порт 8081, на котором запущены скрипты, будь то python или же node.js. Сам же nginx с SSL размещается на порте 8443 и указываю путь до сертификатов. Часть конфигурационного файла:
Код:
server {
listen 8443 ssl http2 default_server;
listen [::]:8443 ssl http2 default_server;
server_name zennolab.com;
ssl_certificate "/root/certificate.crt";
ssl_certificate_key "/root/privkey.key";
location / {
proxy_pass http://localhost:8081;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4. Разбор кода
PHP
connect.php – в данном файле указываются данные для подключения к бд. Код с комментариями:
PHP:
<?php
header('Access-Control-Allow-Origin: *');
//Адерс бд, если стоит все на одном сервере, то localhost
$server = "server001.hosting.reg.ru";
//Пользователь бд, должен иметь права к удаленном подключению, если бд находится не на localhost
$username = "u1_zenno";
//Пароль от пользователя
$password = "zenno";
//Название базы данных
$database = "u1_user";
// Подключение к базе данный через MySQLi
$mysqli = new mysqli($server, $username, $password, $database);
?>
PHP:
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
//Получаем тело запроса
$telegram = file_get_contents('php://input');
//Подключаемся к базе данных по указанным данным из connect.php
require_once("connect.php");
//Отправляем SQL запрос в котором будет содержаться тело нашего запроса
$result_query_insert = $mysqli->query("INSERT INTO `zenno` (json) VALUES ('".$telegram."')");
$result_query_insert->close();
$mysqli->close();
?>
Python
config.ini – в конфигурационном файле указываются данные для подключения к бд. Код с комментариями:
INI:
[db]
;Адерс бд, если стоит все на одном сервере, то localhost
host=server001.hosting.reg.ru
;Пользователь бд, должен иметь права к удаленном подключению, если бд находится не на localhost
user=u1_zenno
;Пароль от пользователя
pass=zenno
;Название базы данных
dbname=u1_user
Python:
# -*- coding: utf-8 -*-
from flask import Flask, request
from mysql.connector import connect, Error
import configparser
import json
app = Flask(__name__)
#Читаем файл config.ini для дальнейшего использования в коде
config = configparser.ConfigParser()
config.read("config.ini", encoding='utf-8')
#Запрашиваем необходимые нам строки из config.ini
dbHost = config["db"]["host"]
dbUser = config["db"]["user"]
dbPass = config["db"]["pass"]
dbName = config["db"]["dbname"]
#Если POST запрос был отправлен на адрес /, то в таком случае начинает работать функция webhook
@app.route('/', methods=['POST'])
def webhook():
try:
with connect(host=dbHost,user=dbUser,password=dbPass,database=dbName) as connection:
#Сначала мы получаем тело запроса - request.json, далее его преобразуем в json
#После этого переводим его в строку (str), чтобы можно было корректно отправить запрос в бд
sqlQuery = str(json.dumps(request.json))
#Кодируем все символы в UTF-8, чтобы не возникло проблем с запросом к бд
sqlQuery = sqlQuery.encode().decode('unicode_escape')
#Сам запрос к бд
#На самом деле его можно сократить до "INSERT INTO `zenno` (`json`) VALUES ('" + sqlQuery + "')"
#Так как наша таблица автоматически ставит и id, и status
createDbQuery = "INSERT INTO `zenno` (`id`, `json`, `status`) VALUES (NULL, '" + sqlQuery + "', 0)"
#Дополнительный запрос без которого не происходило сохранение данных строкой выше
commitQuery = "COMMIT"
with connection.cursor() as cursor:
#Отправляем запросы
cursor.execute(createDbQuery)
cursor.execute(commitQuery)
except Error as e:
print(e)
return 'ok'
#Запускаем сервер на порте 8081
app.run(host='0.0.0.0', port=8081)
Node.js
main.js – алгоритм схож с кодом python, только в данном случае данные для подключения указаны прямо в коде. Код с комментариями:
JavaScript:
const express = require("express")
const bodyParser = require("body-parser")
const mysql = require('mysql');
const app = express()
//Создаем подключение к базе данных, по указанным данным
var connection = mysql.createConnection({
host: 'server001.hosting.reg.ru', //Адерс бд, если стоит все на одном сервере, то localhost
user: 'u1_zenno', //Пользователь бд, должен иметь права к удаленном подключению, если бд находится не на localhost
password: 'zenno', //Пароль от пользователя
database: 'u1_user' //Название базы данных
});
app.use(bodyParser.json())
//Если POST запрос был отправлен на адрес /, то в таком случае начинает работать код ниже
app.post("/", (req, res) => {
connection.connect(); //Подключаемся к базе данных из var connection
connection.query("INSERT INTO `zenno` (`id`, `json`, `status`) VALUES (NULL, '" + JSON.stringify(req.body) + "', 0)", function (error, results, fields) {
if (error) throw error; // Отправляем SQL запрос, содержащий тело запроса, но его перед этим переводим в строку с помощью JSON.stringify
});
connection.end(); //Закрываем подключение к бд
res.status(200).end() //Отправляем статус 200
})
//Запускаем сервер на порте 8081 и оповещаем об этом в консоли
const server = app.listen(8081, function () {
console.log('Server listening on port ' + server.address().port)
})
Bonus
Также есть бонусный код, который извлекает id чата, ник и дату, реализованный на PHP. Для этого требуется импортировать новую таблицу zenno2.sql из той же папки. Код с комментариями:
PHP:
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
//Получаем тело запроса
$telegram = file_get_contents('php://input');
//Извлекаем из переменной telegram, значение id из chat
//Аналогично и для других строк
$chatId = $telegram["message"]["chat"]["id"];
$chatUser = $telegram["message"]["chat"]["username"];
$chatDate = $telegram["message"]["date"];
//Подключаемся к базе данных по указанным данным из connect.php
require_once("connect.php");
//Отправляем SQL запрос в котором будет содержаться тело нашего запроса и другие значения, которые мы указали выше
$result_query_insert = $mysqli->query("INSERT INTO `zenno` (json, chatId, chatUser, chatDate) VALUES ('".$telegram."', '".$chatId."', '".$chatUser."', '".$chatDate."')");
$result_query_insert->close();
$mysqli->close();
?>
5. Работа в ZennoPoster
Входные настройки и алгоритм работы проекта:
Подробно рассмотрен проект в видео и рассказано о том, как использовать это в своих проектах:
Минимальная допустимая версия для запуска - 7.1.3.0 (5.47.0)
- Номер конкурса статей
- Восемнадцатый конкурс статей
- Тема статьи
- Нестандартные хаки
- Соц. сети
Вложения
Последнее редактирование модератором:









