Форум программистов, компьютерный форум, киберфорум
Python: Web
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/64: Рейтинг темы: голосов - 64, средняя оценка - 4.58
 Аватар для rtfmyoumust
0 / 0 / 0
Регистрация: 21.08.2018
Сообщений: 4

Получение вебхука от стороннего сервиса в скрипте Python

16.08.2019, 00:38. Показов 12984. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые форумчане. Я новичок в программировании и передо мной встала задача словить вэбхук от crm системы у себя на хостинге в скрипте , затем сохранить результаты в формате JSON. Что я нашел на просторах сети ...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import json
import os
import sys
import requests
import cgitb
 
cgitb.enable()
 
print("Content-Type: text/plain\n")
data = json.loads(sys.stdin.read(int(os.environ['CONTENT_LENGTH'])))
 
f = open('test.log', 'w')
f.write(data.txt)
f.close()
Я думал, что смогу послушать пост запрос - data = json.loads(sys.stdin.read()), поступающий из crm. Но увы.. Активное гугление привело к тому, что с помощью фреймфорков jango, flask и тд можно прочитать пост запрос(вебхук) прилетающий на мой сайтец на раз-два, но на чистом Python я нашел только вышеупомянутый пример.

Помогите, направьте на путь истинный. Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2019, 00:38
Ответы с готовыми решениями:

Добавление стороннего сервиса на сайт
Нужно перенести сервис для определения местоположения контейнера, . Мне нужно не сделать новый, а именно чтобы посетители моего сайта могли...

Получение данных со стороннего сайта.
Всем привет! Подскажите пожалуйста, как получить значение поля Available через jquery? сайт - http://rfcmfg.com/search-stock.html

Получение cookies стороннего сайта
Доброго времени суток! Есть БД на access, и в ней нужно с стороннего сайта вытаскивать json, разбирать и добавлять в таблицы. Из-за...

3
 Аватар для rtfmyoumust
0 / 0 / 0
Регистрация: 21.08.2018
Сообщений: 4
18.08.2019, 20:12  [ТС]
Этот пример не заработает, если у вас нет разрешения на запуск cgi-скриптов, а настраивается это дело в файле настроек вашего сервера (в моем случае апачи) - ".htaccess". В нем нужно указать два параметра: разрешение на запуск CGI - скриптов "Options +ExecCGI" и указатель на расширение файлов python - "AddHandler cgi-script .py".

Но дальше я столкнулся с проблемой посерьезней, я не могу обратиться к переменным среды сервера - "REQUEST_METHOD" и "CONTENT_LENGTH". Именно эти две переменные необходимы для того, чтобы я смог прочитать поступивший POST к моему python скрипту. При выводе переменных среды в терминале, я этих переменных не вижу, но что странно скрипт на ПХП делает это в пару строк и без лишний заморочек я вычитываю содержание запроса. Я думаю что это как то связано с правами на хостинге, я находил информацию о том что в php доступ на переменные среды устанавливается в php.ini файле, какие разрешения и как настраивать для питона, точнее для ресурсов на исполнение cgi - скрипта я не разобрался.

Если кто знает отпишите. Я даже на использование flask согласен. Поставил его на сервере, залил в папку с сайтом, настроил разрешения в файлике .htaccess, выстроил в скрипте __init__.py аналогичную логику, на стороне crm, настроил вебхук на этот файлик, но когда запускаю вебхук ничего не происходит. Перейдя в терминале по пути к файлику __init__.py и выполнив его принудительно получил следующий ответ:
Bash
1
2
3
4
5
6
* Serving Flask app "__init__" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Видимо скрипт слушает 5000й порт и ожидает что поступит какой нибудь запрос.

Так же еще вопрос относительно самого flask, получается прилетает вебхук, запускающий __init__.py, и скрипт так же обращается к переменным среды "REQUEST_METHOD" и "CONTENT_LENGTH"? Как это работает под капотом?) Содержание __init__.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
print("Content-Type: text/html")
print()
 
from flask import Flask, request
import json
 
app = Flask(__name__)
 
@app.route('/', methods=['POST'])
def read_post():
 
        data = json.dumps(request.json)
        f = open('test.log', 'w')
        f.write(data.txt)
        f.close()
        return print(data)
 
if __name__ == '__main__':
    app.run()
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.08.2019, 01:24
Лучший ответ Сообщение было отмечено rtfmyoumust как решение

Решение

Цитата Сообщение от rtfmyoumust Посмотреть сообщение
Видимо скрипт слушает 5000й порт и ожидает что поступит какой нибудь запрос.
Да.
P.S. Да, кстати, CGI давно умер. Как интерфейс. Забудьте уже про него.
А flask использует стандартную технологию роутинга и MVC (Model, Views, Controller), переменные окружения у него другие, хотя и частично совпадающие со старыми CGI переменными.

Цитата Сообщение от rtfmyoumust Посмотреть сообщение
Как это работает под капотом?
Запустите и поизучайте. Мягкий старт в документацию я вам дал. Не пытайтесь что-то писать, не прочитав официальную документацию. Это вредно.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from flask import Flask, request,jsonify
 
app = Flask(__name__)
 
 
@app.route('/',methods=['POST','GET'])
def requestdata():
    d = {}
    # словарь переменных окружения; 
    d['ENVIRON'] = [(k,str(v)) for k,v in request.environ.items()]
    
    # заголовки запроса
    d['HEADERS'] = [(k,v) for k,v in request.headers]
    
    # все атрибуты объекта request, кроме частных
    d['REQUEST'] = [(attr,str(getattr( request , attr)))  
        for attr in dir(request) if attr[0] != '_']
    
    return jsonify(d) # это ответ клиенту в виде JSON; способов что-то отправить во Flack много
    
if __name__ == "__main__":
    app.run(port=8000,host="0.0.0.0",debug=True)
    # указываем порт для "прослушки" и разрешаем принимать запросы от всех хостов; 
    # debug=True - это режим отладки с отображением ошибок сервера.
request это встроенный потокобезопасный прокси-объект (экземпляр класса Request), хранящий все данные для каждого запроса.
----------------------------------------------------
Добавляем маршрутизацию на новый путь:
Python
1
2
3
@app.route('/x',methods=['POST','GET'])
def x():
    return request.data # возвращаем клиенту обратно его же данные
Отправляем запрос:
Windows Batch file
1
curl -X POST -H "Content-Type: application/json" -d"{\"username\":\"abc\",\"password\":\"abc\"}" http://localhost:8000/x
Ответ в консоли от curl:
Code
1
{"username":"abc","password":"abc"}
2
 Аватар для rtfmyoumust
0 / 0 / 0
Регистрация: 21.08.2018
Сообщений: 4
12.11.2019, 08:01  [ТС]
Благодарю! Вы помогли в решении мой проблемы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2019, 08:01
Помогаю со студенческими работами здесь

Получение текста из стороннего приложения
Всем доброго времени суток. Стоит такая задача: необходимо из внешнего приложения (например, гипертерминал) копировать текст в свою...

Получение информации из стороннего приложения
Доброго времени суток Уважаемому сообществу! Выручайте! Есть прога написанная прошлым кодером, исходники не сохранились, есть в этой...

Получение данных от сервиса
Добрый день. Не могу разобраться с такой проблемой: получаю данные от веб-сервиса, если такие данные имеются в базе 1С данные...

QWindow получение WID стороннего окна
Всем привет! Нужно создать скриншот окна, которое не является одним из окон программы, которую я пишу в Qt. Например, это окно MS Word....

Получение числового значения со стороннего сайта
Всем привет! Возни такой вопрос, как получить с сайта, к примеру ЦБ РФ -www.cbr.ru/ значение курса доллара и затем вывести его в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru