Пользовательский ответ робота Python DingTalk
Пользовательский ответ робота Python DingTalk

Наверное, есть такая необходимость

  1. Соблюдайте условия ххх. Например, в определенный момент. робот автоматически получает уведомление в группе,и @relevant люди
  2. Например, ответьте на ключевое слово в группе и ожидайте получить нужную информацию, чтобы освободить свои руки. Эту часть необходимо реализовать путем подключения к API DingTalk. Например, этот тип вопросов и ответов

Как только вы поймете необходимость, идите Официальный сайт Я ищу документацию.

На самом деле, в документе официального сайта об этом сказано очень четко. Нечего добавить.

анализировать

  • Необходимо развернуть на сервере Служить
  • Помимо сроков, также необходимы индивидуальные ответы.
  • Он не должен быть слишком высокопроизводительным, просто и удобным. Поэтому я выбрал Python между go и Python.

Запуск с помощью Flash

Основной логический код

Язык кода:javascript
копировать
from flask import Flask
 
# http://flask.pocoo.org/docs/0.12/api/#flask.Flask
app = Flask(__name__)
 
 
@app.route('/HelloWorld')
def hello_world():
    return "Hello World!"
 
if __name__ == "__main__":
    # http://flask.pocoo.org/docs/0.12/quickstart/#a-minimal-application
    app.run(host='0.0.0.0', port='5000')

При использовании Python для открытия веб-службы Flask

  • Вам нужен только локальный доступ. Пока IP не установлен на 0.0.0.0, нормальный доступ будет в порядке.
  • Если вам нужен доступ к внешней сети, необходимо установить IP-адрес 0.0.0.0. В настоящее время при доступе на этом компьютере необходимо использовать IP-адрес по умолчанию 127.0.0.1 (то есть IP-адрес по умолчанию, если вы не установили его). IP). При доступе из внешней сети необходимо использовать локальный IP, не используйте 0.0.0.0.

Вы также можете запустить его таким образом

Язык кода:javascript
копировать
if __name__ == "__main__":
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(("", 8083))
    server_socket.listen(120)
    while True:
        client_socket, client_address = server_socket.accept()
        handle_client_process = Process(target=handle_client, args=(client_socket,))
        handle_client_process.start()
        client_socket.close()

Затем просто реализуйте handle_client. Пространство ограничено. Полный код можно получить, подписавшись на публичный аккаунт Luol Street.

Схема архитектуры

процесс

  • Пользователи используют администраторскую панель Django для добавления конфигурации сообщения, то есть ключевых слов и содержимого ответа.
  • Пользователи используют предприятие DingTalk во внутренней группе @робот + Ключевые слова.
  • предприятиеробот После получения,Получено мониторингом сокетов Служить,И возвращаемся после обработки по типу сообщения.
  • После получения возвращенного сообщения предприятиеробот отвечает через адрес сопоставления внешней сети, указанный инструментом проникновения во внутреннюю сеть.
  • Внутренняя группа предприятия отображает ответные сообщения,Пользователь видит ответное сообщение.

упражняться

Для триггеров, срабатывающих по времени или при достижении условий xxx, просто добавьте робота в интеллектуальный групповой помощник.

Выберите пользовательского робота

Затем настройте один из методов безопасности

Получите адрес вебхука.

Вы также можете сначала создать завиток, чтобы проверить его.

Язык кода:javascript
копировать
curl 'https://oapi.dingtalk.com/robot/send?access_token=381c2f405e0f906fd556b27cea9f66864120860b5d8b117bb046e10b6599b050&timestamp=1613211530113&secret=SEC2e67120c5e4affa1177ac25fe8dc77ba1c5b49284a9dc7e1888770bc3b76b1fc' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text","text": {"content": "test"}}'

Основной логический код

Язык кода:javascript
копировать
import base64
import hashlib
import hmac
import json
import time
import urllib
import urllib.parse
import requests


def sign():
    timestamp = str(round(time.time() * 1000))
    secret = "SECe5d17dac6060b76c01ea60aec260fe76c6e0644394b932bfffa963342bb630a1"
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign_res = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    return timestamp, sign_res


def send_ding_message(text_info):
    webhook = "https://oapi.dingtalk.com/robot/send?access_token=f069339ad1fcb9410d0e96fd947d9a2bf3416451d01dc97e3ef4256c1fdb2b7a"
    header = {
        "Content-Type": "application/json",
        "Charset": "UTF-8"
    }
    text = text_info
    message = {
        "msgtype": "text",
        "text": {
            "content": text
        },
        "at": {
            # "isAtAll": False
            # "atMobiles": [
            #     "18512345678"
            # ]
            "atUserIds": [
                "lbkgv8q"
            ]
        }
    }
    message_json = json.dumps(message)
    timestamp, sign_res = sign()
    webhook += "&timestamp=" + timestamp + "&sign=" + sign_res
    info = requests.post(url=webhook, data=message_json, headers=header)


def usage():
    send_ding_message('test 1')


if __name__ == "__main__":
    usage()

Эффект

Для пользовательских ответных сообщений

Официальная ссылка

Просто перейдите по ссылке и сначала добавьте его

Поскольку DingTalk необходимо перезвонить нашему сервису, нам необходимо проверить легальность токена и его подписи.

Язык кода:javascript
копировать
timestamp = request.headers.get('Timestamp')
sign = request.headers.get('Sign')

if sign(timestamp) == sign:

Сгенерировать правила, приведены официальные примеры

Язык кода:javascript
копировать
def sign():
    timestamp = str(round(time.time() * 1000))
    secret = "SECe5d17dac6060b76c01ea60aec260fe76c6e0644394b932bfffa963342bb630a1"
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign_res = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    return timestamp, sign_res

Конечно, вы также можете использовать сегмент IP для проверки безопасности.

Если это внутренняя сеть предприятия, а не общедоступная сеть, для проникновения в нее необходимо использовать внутреннюю сеть. Чиновник также привел примеры, поэтому я не буду их здесь повторять.

Некоторые подводные камни, с которыми вы можете столкнуться
  1. При использовании Python Flask сообщается об ошибке “POST / HTTP/1.1” 405 - 可能是没有允许请求本身的方法
    • Решение: добавить метод
    • @app.route(‘/‘, methods=[‘GET’, ‘POST’])
  2. Исправлен вебхук Dingdingrobot.、Если несколько групп хотят использовать одного и того же робота、Вам нужно использовать app_secret, чтобы решить эту проблему.
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода