Un..Régler la goupille avant d'utiliser
1.Puisque c'est un rappel de message cloué,Donc le numéro a besoin d'un clou.
2.La deuxième étape du robot personnalisé est le Groupe de robots,Donc il faut un groupe.
3.Ajouter un robot,Cliquez sur le portrait>Gestion des robots>Robot personnalisé
4.Donnez un nom au Robot>Sélectionnez le Groupe à ajouter>Choisissez les paramètres de sécurité qui vous conviennent>Terminé.
2..Paramètres de sécurité
1.Il y a trois modes de sécurité:Mots clés personnalisés、Signez.、IPAdresse.
2.Mots clés personnalisés:En termes simples, ce que vous envoyez doit contenir ce mot clé,Envoyer avec succès.
3.Signez.:Est de générer votre signature spécifique,Dans la procédure,Effectuer les paramètres de génération de chiffrement,Sur demande,Porter ce paramètre,Envoyer avec succès.
4.IPAdresse:C'est la désignation qui est faiteIPDemande dans la plage d'adresses,Envoyer avec succès.
5.Choisissez le réglage de sécurité qui vous convient,Ce que vous choisissez ici, c'est l'étiquette,C'est - à - dire une fois configuré,Le Code est utilisé、Multiplexage、 Les aspects tels que la migration seront un peu plus flexibles , Si dans l'entreprise , Sélectionnez en fonction des besoins réels . Notez cette signature , Il sera nécessaire plus tard pour chiffrer les paramètres de construction .
6.Après avoir cliqué sur terminer,Pour voir sonWebhook,Notez - le.,À utiliser plus tard.
Trois.Envoyer la demande
1.Tout d'abord,,In__init__Dans la méthode, Configurer les informations du robot .
def __init__(self):
# Les paramètres de sécurité sont marqués
timestamp = str(round(time.time() * 1000))
secret = 'SEC7******fe0a' # La signature qui vient d'être enregistrée
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 = urllib.parse.quote_plus(base64.b64encode(hmac_code))
# Voici la configuration de sécurité signée , Autres paramètres de sécurité , Il n'est pas nécessaire de configurer les informations ci - dessus
# webhookAdresse
webhook = 'https://oapi.dingtalk.com/robot/send?******' # Ce qui vient d'être enregistré webhook
self.webhook = "{}×tamp={}&sign={}".format(webhook, timestamp, sign) # .Si le vôtre n'est pas signé en toute sécurité , C'est bon. ×tamp={}&sign={} Paramètres partiels
# Demandes de configurationheaders
self.headers = {
"Content-Type": "application/json",
"Charset": "UTF-8" # LancementPOSTSur demande, L'encodage du jeu de caractères doit être défini à UTF-8.
}
2.Deuxièmement,,Envoyer la demande
def send_req(self, message):
""" Envoyer la demande :param message: Votre corps de message :return: """
# Demande de donnéesjsonEncapsulation des données
form_data = json.dumps(message)
# Demande d'initiation
res_info = requests.post(url=self.webhook, headers=self.headers, data=form_data)
# Imprimer les résultats retournés
print(' Envoyer les résultats :', res_info.json())
print(' Notification réussie !' if (res_info.json())['errmsg'] == 'ok' else ' Échec de la notification !')
3.Encore une fois,Construire un corps de message, Le clou donne 6 Type de message
3.1.Première catégorie、text Type de données textuelles
def send_text_msg(self, content, at_mobiles=None, is_at_all=False):
""" Envoyertext Type de données textuelles :param content: Contenu du message :param at_mobiles: Données de type de liste entrantes ,@ Contacts téléphoniques figurant sur la liste , S'il n'y a pas de contact dans le Groupe ,Alors [email protected](Paramètres optionnels) :param is_at_all: Est - ce [email protected] le monde., Non, par défaut. (Paramètres optionnels) :return: """
message = {
"msgtype": "text", # Type de message
"text": {
"content": content
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_text_msg('Message de test envoyé!')
b.Tableau des effets
3.2.Deuxième type、link Type de données textuelles
def send_link_msg(self, text, title, message_url, pic_url=None):
""" Envoyerlink Type de données textuelles :param text: Contenu du message :param title: Titre du message :param message_url: Cliquez sur le message pour sauter URL :param pic_url: PhotosURL(Paramètres optionnels) :return: """
message = {
"msgtype": "link",
"link": {
"text": text, # Contenu du message, Si elle est trop longue, elle ne sera que partiellement affichée
"title": title, # Titre du message
"picUrl": pic_url, # PhotosURL
"messageUrl": message_url # Cliquez sur le message pour sauter URL
}
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_link_msg(
text='Partager l'amour,L'amour tourne,Aimer la vie, Soyez heureux de partager certaines de vos expériences d'apprentissage 、Expérimentez.',
title='a'ゞ Le blog des pistaches ',
message_url='https://blog.csdn.net/qq_45352972',
pic_url='https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png'
)
b.Tableau des effets
3.3.La troisième、markdown Type de données textuelles
def send_markdown_msg(self, text, title, at_mobiles=None, is_at_all=False):
""" Envoyermarkdown Type de données textuelles :param text: markdownContenu du format :param title: Titre :param at_mobiles: Données de type de liste entrantes ,@ Contacts téléphoniques figurant sur la liste , S'il n'y a pas de contact dans le Groupe ,Alors [email protected](Paramètres optionnels) :param is_at_all: Est - ce [email protected] le monde., Non, par défaut. (Paramètres optionnels) :return: """
message = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": text
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_markdown_msg(
text="## C'est un titre de niveau 2 \n ![news](https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png)\n###### {}Publication".format(time.strftime("%Y-%m-%d %H:%M:%S")),
title='markdownFormat des données',
)
b.Tableau des effets
3.4.Type 4、Saut globalActionCardType de données
def send_all_action_card_msg(self, text, title, single_url, single_title='Lire l'article complet'):
""" Envoyer un saut global ActionCardType de données :param text: markdownContenu du format :param title: Titre :param single_url: DétailsurlAdresse :param single_title: Cliquez sur le bouton entrer les détails :return: """
message = {
"actionCard": {
"title": title,
"text": text,
"singleTitle": single_title,
"singleURL": single_url
},
"msgtype": "actionCard"
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_all_action_card_msg(
text='## Outil de prise de sac-mitmproxyPrelude\n ![](https://img-blog.csdnimg.cn/20201211103655824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70)\nIntroduction:mitmproxySimilaire àFiddler、CharlesLa fonction de,Peut soutenirHTTPSuivez - moi.HTTPSDemande, C'est juste qu'il fonctionne comme une console .mitmproxy Il y a deux composants associés ,mitmdumpSuivez - moi.mitmweb.mitmdump- Oui.mitmproxyInterface en ligne de commande pour;mitmwebC'est unwebProcédure,Ça marche....',
title='Outil de prise de sac-mitmproxyPrelude',
single_url='https://blog.csdn.net/qq_45352972/article/details/111028741?spm=1001.2014.3001.5501'
)
b.Tableau des effets
3.5.Cinquième catégorie、Saut indépendantActionCardType de données
def send_alone_action_card_msg(self, text, title, btn_orientation=1, btns=None):
""" Envoyer un saut indépendant ActionCardType de données :param text: markdownFormatage des données textuelles :param title: Titre :param btn_orientation: 0-Les boutons sont disposés verticalement;1-Disposition latérale des boutons - poussoirs :param btns: Données de la Liste, Il y a une chaîne dedans , Pour mettre des informations sur les boutons et des liens ,Comme suit [ { "title": "Bon contenu", "actionURL": "https://www.dingtalk.com/" }, { "title": "Pas intéressé", "actionURL": "https://www.dingtalk.com/" } ] :return: """
message = {
"msgtype": "actionCard",
"actionCard": {
"title": title,
"text": text,
"hideAvatar": "0",
"btnOrientation": btn_orientation,
"btns": btns
}
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_alone_action_card_msg(
text='### Voir le blog des amis \n![](https://profile.csdnimg.cn/C/B/7/1_qq_45352972)',
title=' Voir le blog des amis ',
btns=[
{
"title": "Pas intéressé",
"actionURL": "https://www.dingtalk.com/"
},
{
"title": "Je vais voir.",
"actionURL": "https://blog.csdn.net/qq_45352972/"
}
]
)
b.Tableau des effets
3.6.Sixième、FeedCardDonnées de type
def send_feed_card_msg(self, links):
""" EnvoyerFeedCardDonnées de type :param links: Type de liste,Le format est le suivant: [ { "title": "Le train du temps avance1", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" }, { "title": "Le train du temps avance2", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" } ] :return: """
message = {
"msgtype": "feedCard",
"feedCard": {
"links": links
}
}
self.send_req(message) # Envoyer un message
a.Appelez
DingTalkWarn().send_feed_card_msg(
links=[
{
"title": " La solution crawler nécessite une connexion au site ",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/113831698?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/20210217102838577.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center"
},
{
"title": " Console simple réalisation de l'impression afficher la barre de progression ",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/112191329?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/20210104184651355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70"
},
{
"title": "EmailRappel par courriel",
"messageURL": "https://blog.csdn.net/qq_45352972/article/details/109280576?spm=1001.2014.3001.5501",
"picURL": "https://img-blog.csdnimg.cn/2020102522530334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center"
}
]
)
b.Tableau des effets
Quatre.Code complet
import base64
import hashlib
import hmac
import time
import urllib.parse
import requests
import json
class DingTalkWarn:
"""Notification du message pin"""
def __init__(self):
# Les paramètres de sécurité sont marqués
timestamp = str(round(time.time() * 1000))
# La signature qui vient d'être enregistrée
secret = 'SEC24e640447734a80b9d430d678765a103652b33f334a69974cfda88415e601d22'
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 = urllib.parse.quote_plus(base64.b64encode(hmac_code))
# Voici la configuration de sécurité signée , Autres paramètres de sécurité , Il n'est pas nécessaire de configurer les informations ci - dessus
# webhookAdresse( Ce qui vient d'être enregistré webhook)
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=5f56131ba70c78f42a10c7e9531c8da55def990313a4a74cfc87bf82c4bb8b7b'
# .Si le vôtre n'est pas signé en toute sécurité , C'est bon. ×tamp={}&sign={} Paramètres partiels
self.webhook = "{}×tamp={}&sign={}".format(webhook, timestamp, sign)
# Demandes de configurationheaders
self.headers = {
"Content-Type": "application/json",
"Charset": "UTF-8" # LancementPOSTSur demande, L'encodage du jeu de caractères doit être défini à UTF-8.
}
def send_text_msg(self, content, at_mobiles=None, is_at_all=False):
""" Envoyertext Type de données textuelles :param content: Contenu du message :param at_mobiles: Données de type de liste entrantes ,@ Contacts téléphoniques figurant sur la liste , S'il n'y a pas de contact dans le Groupe ,Alors [email protected](Paramètres optionnels) :param is_at_all: Est - ce [email protected] le monde., Non, par défaut. (Paramètres optionnels) :return: """
message = {
"msgtype": "text", # Type de message
"text": {
"content": content
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # Envoyer un message
def send_link_msg(self, text, title, message_url, pic_url=None):
""" Envoyerlink Type de données textuelles :param text: Contenu du message :param title: Titre du message :param message_url: Cliquez sur le message pour sauter URL :param pic_url: PhotosURL(Paramètres optionnels) :return: """
message = {
"msgtype": "link",
"link": {
"text": text, # Contenu du message, Si elle est trop longue, elle ne sera que partiellement affichée
"title": title, # Titre du message
"picUrl": pic_url, # PhotosURL
"messageUrl": message_url # Cliquez sur le message pour sauter URL
}
}
self.send_req(message) # Envoyer un message
def send_markdown_msg(self, text, title, at_mobiles=None, is_at_all=False):
""" Envoyermarkdown Type de données textuelles :param text: markdownContenu du format :param title: Titre :param at_mobiles: Données de type de liste entrantes ,@ Contacts téléphoniques figurant sur la liste , S'il n'y a pas de contact dans le Groupe ,Alors [email protected](Paramètres optionnels) :param is_at_all: Est - ce [email protected] le monde., Non, par défaut. (Paramètres optionnels) :return: """
message = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": text
},
"at": {
"atMobiles": at_mobiles,
"isAtAll": is_at_all
}
}
self.send_req(message) # Envoyer un message
def send_all_action_card_msg(self, text, title, single_url, single_title=u'Lire l'article complet'):
""" Envoyer un saut global ActionCardType de données :param text: markdownContenu du format :param title: Titre :param single_url: DétailsurlAdresse :param single_title: Cliquez sur le bouton entrer les détails :return: """
message = {
"actionCard": {
"title": title,
"text": text,
"singleTitle": single_title,
"singleURL": single_url
},
"msgtype": "actionCard"
}
self.send_req(message) # Envoyer un message
def send_alone_action_card_msg(self, text, title, btn_orientation=1, btns=None):
""" Envoyer un saut indépendant ActionCardType de données :param text: markdownFormatage des données textuelles :param title: Titre :param btn_orientation: 0-Les boutons sont disposés verticalement;1-Disposition latérale des boutons - poussoirs :param btns: Données de la Liste, Il y a une chaîne dedans , Pour mettre des informations sur les boutons et des liens ,Comme suit [ { "title": "Bon contenu", "actionURL": "https://www.dingtalk.com/" }, { "title": "Pas intéressé", "actionURL": "https://www.dingtalk.com/" } ] :return: """
message = {
"msgtype": "actionCard",
"actionCard": {
"title": title,
"text": text,
"hideAvatar": "0",
"btnOrientation": btn_orientation,
"btns": btns
}
}
self.send_req(message) # Envoyer un message
def send_feed_card_msg(self, links):
""" EnvoyerFeedCardDonnées de type :param links: Type de liste,Le format est le suivant: [ { "title": "Le train du temps avance1", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" }, { "title": "Le train du temps avance2", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png" } ] :return: """
message = {
"msgtype": "feedCard",
"feedCard": {
"links": links
}
}
self.send_req(message) # Envoyer un message
def send_req(self, message):
""" Envoyer la demande :param message: Votre corps de message :return: """
# Demande de donnéesjsonEncapsulation des données
form_data = json.dumps(message)
# Demande d'initiation
res_info = requests.post(url=self.webhook, headers=self.headers, data=form_data)
# Imprimer les résultats retournés
print(u' Envoyer les résultats :', res_info.json())
print(u' Notification réussie !' if (res_info.json())['errmsg'] == 'ok' else u' Échec de la notification !')
if __name__ == '__main__':
"""Test envoyer un message"""
DingTalkWarn().send_text_msg(u'Message de test envoyé!')
""" DingTalkWarn().send_link_msg( text='Partager l'amour,L'amour tourne,Aimer la vie, Soyez heureux de partager certaines de vos expériences d'apprentissage 、Expérimentez.', title='a'ゞ Le blog des pistaches ', message_url='https://blog.csdn.net/qq_45352972', pic_url='https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png' ) DingTalkWarn().send_markdown_msg( text="## C'est un titre de niveau 2 \n ![news](https://cdn.jsdelivr.net/gh/King-ing/CDN/assets/background.png)\n###### {}Publication".format(time.strftime("%Y-%m-%d %H:%M:%S")), title='markdownFormat des données', ) DingTalkWarn().send_all_action_card_msg( text='## Outil de prise de sac-mitmproxyPrelude\n ![](https://img-blog.csdnimg.cn/20201211103655824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70)\nIntroduction:mitmproxySimilaire àFiddler、CharlesLa fonction de,Peut soutenirHTTPSuivez - moi.HTTPSDemande, C'est juste qu'il fonctionne comme une console .mitmproxy Il y a deux composants associés ,mitmdumpSuivez - moi.mitmweb.mitmdump- Oui.mitmproxyInterface en ligne de commande pour;mitmwebC'est unwebProcédure,Ça marche....', title='Outil de prise de sac-mitmproxyPrelude', single_url='https://blog.csdn.net/qq_45352972/article/details/111028741?spm=1001.2014.3001.5501' ) DingTalkWarn().send_alone_action_card_msg( text='### Voir le blog des amis \n![](https://profile.csdnimg.cn/C/B/7/1_qq_45352972)', title=' Voir le blog des amis ', btns=[ {"title": "Pas intéressé", "actionURL": "https://www.dingtalk.com/" }, { "title": "Je vais voir.", "actionURL": "https://blog.csdn.net/qq_45352972/" } ] ) DingTalkWarn().send_feed_card_msg( links=[ { "title": " La solution crawler nécessite une connexion au site ", "messageURL": "https://blog.csdn.net/qq_45352972/article/details/113831698?spm=1001.2014.3001.5501", "picURL": "https://img-blog.csdnimg.cn/20210217102838577.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center" }, { "title": " Console simple réalisation de l'impression afficher la barre de progression ", "messageURL": "https://blog.csdn.net/qq_45352972/article/details/112191329?spm=1001.2014.3001.5501", "picURL": "https://img-blog.csdnimg.cn/20210104184651355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70" }, { "title": "EmailRappel par courriel", "messageURL": "https://blog.csdn.net/qq_45352972/article/details/109280576?spm=1001.2014.3001.5501", "picURL": "https://img-blog.csdnimg.cn/2020102522530334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1MzUyOTcy,size_16,color_FFFFFF,t_70#pic_center" } ] ) """