[PYTHON] Un script qui facilite la création de menus riches avec l'API de messagerie LINE

Aperçu

Si vous définissez le menu riche à partir de l'API de messagerie, vous pouvez le définir de manière assez flexible et vous pouvez définir jusqu'à 20 boutons. Cependant, il est ridiculement gênant de faire en sorte que Json le définisse, j'ai donc écrit un script qui peut être défini facilement.

sample.png

Par exemple, si vous avez une image comme celle-ci Si vous définissez huit boutons sur chaque cercle, il serait trop fastidieux de connaître les coordonnées, la hauteur et la largeur.

étape 1

Tout d'abord, créez une image originale avec une taille de 2500x1686 pour le menu riche. C'est bien s'il ne s'agit que d'une simple figure comme cette image, mais il n'est pas possible de reconnaître des figures compliquées telles que des photos et des personnages, c'est donc une bonne idée de créer des images individuelles qui ne mettent en valeur que la partie sur laquelle vous souhaitez créer un bouton.

Appelons l'image où la partie bouton est facile à comprendre sample.png```

Étape 2

Nourrissez le script.

$ python menu_gen.py sample.png

Le script ressemble à ceci.

menu_gen.py


import cv2
import json
import collections as cl
import codecs
import sys

def main():

  args = sys.argv

  file_name = args[1]

  img_color = cv2.imread(file_name) #Importer l'image originale
  img_gray = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE) #Importer l'image en échelle de gris
  ret, img_binary = cv2.threshold(img_gray, 250, 255, cv2.THRESH_BINARY_INV) #Binariser les images en échelle de gris
  contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #Extraction de contour
  #cv2.drawContours(img_color, contours, -1, (0,0,255), 2) #Dessinez du rouge sur le contour
  print(len(contours),"J'en ai trouvé un") #Nombre de contours

  rich_menu_json = cl.OrderedDict()
  rich_menu_json["size"] = {"width": 2500, "height": 1686}
  rich_menu_json["selected"] = "true"
  rich_menu_json["name"] = file_name
  rich_menu_json["chatBarText"] = 'menu'
  rich_menu_json["areas"] = []

  for i, c in enumerate(contours):
    x,y,w,h = cv2.boundingRect(c) #Jugement rectangulaire
    # print("["+str(i)+"]",x,y,w,h)

    img_color = cv2.rectangle(img_color, (x,y), (x+w, y+h), (255,0,0), 3)
    img_color = cv2.putText(img_color, "b_"+str(i), (x+int(w/3),y+int(h/2)), cv2.FONT_HERSHEY_SIMPLEX, 4, (255,255,255), 2, cv2.LINE_AA)

    tmp = cl.OrderedDict()
    tmp["bounds"] = {
      "x": x,
      "y": y,
      "width": w,
      "height": h
    }
    tmp["action"] = {
      "type": "postback",
      "label": "b_"+str(i),
      "data": "{  }",
      "displayText": str(i)
    }
    rich_menu_json["areas"].append(tmp)



  fw = codecs.open(file_name.split('.')[0]+"_created_.json", 'w', "utf-8")
  json.dump(rich_menu_json, fw, indent=4, ensure_ascii=False)

  print('''
Créez un menu riche avec le contenu suivant

  curl -v -X POST https://api.line.me/v2/bot/richmenu \\
  -H 'Authorization: Bearer {Jeton d'accès}' \\
  -H 'Content-Type: application/json' \\
  -d \\
  '
Insérez le Json édité ici
  '

  ''')

  cv2.imwrite(file_name.split('.')[0]+"_created_.jpg ", img_color)
  cv2.imshow("window", img_color)
  cv2.waitKey()
  cv2.destroyAllWindows()

if __name__ == '__main__':
  main()

Ensuite, une image avec une étiquette pour chaque bouton comme `` b_1 '' est générée comme ceci.

sample_created_.jpg

En même temps, sample_created.json``` est créé à partir des informations de coordonnées, de hauteur et de largeur.

Cela ressemble à ce qui suit

{
    "size": {
        "width": 2500,
        "height": 1686
    },
    "selected": "true",
    "name": "sample.png ",
    "chatBarText": "menu",
    "areas": [
        {
            "bounds": {
                "x": 91,
                "y": 1131,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_0",
                "data": "{  }",
                "displayText": "0"
            }
        },
        {
            "bounds": {
                "x": 2002,
                "y": 1130,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_1",
                "data": "{  }",
                "displayText": "1"
            }
        },
        {
            "bounds": {
                "x": 1047,
                "y": 1130,
                "width": 406,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_2",
                "data": "{  }",
                "displayText": "2"
            }
        },
        {
            "bounds": {
                "x": 1534,
                "y": 640,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_3",
                "data": "{  }",
                "displayText": "3"
            }
        },
        {
            "bounds": {
                "x": 559,
                "y": 639,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_4",
                "data": "{  }",
                "displayText": "4"
            }
        },
        {
            "bounds": {
                "x": 1047,
                "y": 149,
                "width": 406,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_5",
                "data": "{  }",
                "displayText": "5"
            }
        },
        {
            "bounds": {
                "x": 91,
                "y": 149,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_6",
                "data": "{  }",
                "displayText": "6"
            }
        },
        {
            "bounds": {
                "x": 2002,
                "y": 148,
                "width": 407,
                "height": 407
            },
            "action": {
                "type": "postback",
                "label": "b_7",
                "data": "{  }",
                "displayText": "7"
            }
        }
    ]
}

Pour le moment, il est au format postback, mais il semble que vous puissiez gagner du temps en remplissant le contenu tout en comparant le contenu ici avec l'image.

C'est une explication approximative, mais si cela aide quelqu'un.

Recommended Posts

Un script qui facilite la création de menus riches avec l'API de messagerie LINE
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
[API LINE Messaging] Créez un menu riche avec Python
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Créez une page Web qui exécute un modèle qui augmente la résolution de l'image à l'aide de gradio, ce qui facilite la création d'un écran Web
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
Créons-le en appliquant Protocol Buffer à l'API avec Serverless Framework.
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Comment créer un sous-menu avec le plug-in [Blender]
Créez une carte thermique de tweet avec l'API Google Maps
[LINE Messaging API] Créer un BOT de retour de perroquet avec Python
Un système simple qui prend automatiquement des photos avec détection d'objet et l'envoie à LINE
Essayez de créer une forme d'onde (spectre audio) qui se déplace en fonction du son avec python
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
Générez un mot de passe facile à retenir avec apg
Créons un script qui s'enregistre avec Ideone.com en Python.
Probablement le moyen le plus simple de créer un pdf avec Python 3
Création d'un script Python prenant en charge l'API e-Stat (ver.2)
Procédure pour créer un Job qui extrait une image Docker et la teste avec des actions Github
Donnez des rendez-vous à d'autres avec l'API de calendrier LINE WORKS
Une histoire qui rend le débogage de modèle plus facile à voir dans l'environnement Django + SQLAlchemy
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
Créez une API Web capable de fournir des images avec Django
[Python] Créez un programme qui supprime les sauts de ligne dans le presse-papiers + Enregistrez-vous comme raccourci avec Windows
Créez un alias pour Route53 vers CloudFront avec l'API AWS
Est-il facile de synthétiser un médicament sur le marché?
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
Créez un script shell pour exécuter le fichier python plusieurs fois
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
Écrivez un script pour calculer la distance avec le système Elasticsearch 5 sans douleur
Un script qui renvoie 0, 1 attaché au premier Python prime
Comment envoyer une requête à l'API DMM (FANZA) avec python
Essayez de créer un article de Qiita avec l'API REST [Préparation environnementale]
Comment créer une API de machine learning sans serveur avec AWS Lambda
[Python] Créez un script qui utilise FeedParser et LINE Notify pour informer LINE des dernières informations sur le nouveau virus corona du ministère de la Santé, du Travail et des Affaires sociales.
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
Une histoire qui visualise le présent de Qiita avec Qiita API + Elasticsearch + Kibana
Comment créer un bot LINE à intelligence artificielle avec l'API de messagerie Flask + LINE
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Il semble que l'annulation de toutes les commandes enfants puisse être utilisée pour annuler toutes les commandes parentes (commandes spéciales) avec l'API bitflyer
Histoire de créer un planétarium virtuel [jusqu'à ce que les débutants créent un modèle avec un script et parviennent à l'assembler]
Classe qui atteint l'API de DMM
Créez un système stellaire avec le script Blender 2.80
Script pour créer un fichier de dictionnaire Mac
Créez une application simple qui intègre l'API Fetch pour les requêtes Ajax dans Flask et expliquez-la rapidement.
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Utilisez la commande [shell] pour compresser par zip n'importe quel fichier pour créer un fichier et supprimer le fichier d'origine.
Créez une application qui fonctionne bien avec les rapports des utilisateurs à l'aide de l'API COTOHA
LINE Bot m'a envoyé le résultat du scraping des informations de tendance informatique [LINE Messaging API]
J'ai écrit un script pour relancer la montre gulp qui mourra bientôt
Convertir l'API cURL en script Python (à l'aide du stockage d'objets IBM Cloud)
Script Python qui crée tous les fichiers UTF-8 sous le dossier avec BOM sans BOM
Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)