[PYTHON] Ein Skript, mit dem Sie mit der LINE Messaging-API auf einfache Weise umfangreiche Menüs erstellen können

Überblick

Wenn Sie das Rich-Menü über die Messaging-API festlegen, können Sie es sehr flexibel einstellen und bis zu 20 Schaltflächen einrichten. Es ist jedoch lächerlich mühsam, Json dazu zu bringen, es einzustellen, deshalb habe ich ein Skript geschrieben, das leicht eingestellt werden kann.

sample.png

Zum Beispiel, wenn Sie ein Bild wie dieses haben Wenn Sie jedem Kreis acht Schaltflächen zuweisen, ist es zu mühsam, die Koordinaten, die Höhe und die Breite herauszufinden.

Schritt 1

Erstellen Sie zunächst ein Originalbild mit einer Größe von 2500 x 1686 für das umfangreiche Menü. Es ist in Ordnung, wenn es sich nur um eine einfache Figur wie dieses Bild handelt, aber es ist nicht möglich, komplizierte Figuren wie Fotos und Zeichen zu erkennen. Daher ist es eine gute Idee, einzelne Bilder zu erstellen, die nur den Teil hervorheben, für den Sie eine Schaltfläche erstellen möchten.

Nennen wir das Bild, in dem der Schaltflächenteil leicht zu verstehen ist, "sample.png "

Schritt 2

Füttere das Skript.

$ python menu_gen.py sample.png

Das Skript sieht so aus.

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) #Originalbild importieren
  img_gray = cv2.imread(file_name, cv2.IMREAD_GRAYSCALE) #Bild in Graustufen importieren
  ret, img_binary = cv2.threshold(img_gray, 250, 255, cv2.THRESH_BINARY_INV) #Graustufenbilder binarisieren
  contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) #Konturextraktion
  #cv2.drawContours(img_color, contours, -1, (0,0,255), 2) #Zeichnen Sie rot auf die Kontur
  print(len(contours),"ich habe einen gefunden") #Anzahl der Konturen

  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"] = 'Speisekarte'
  rich_menu_json["areas"] = []

  for i, c in enumerate(contours):
    x,y,w,h = cv2.boundingRect(c) #Rechteckiges Urteil
    # 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('''
Erstellen Sie ein reichhaltiges Menü mit den folgenden Inhalten

  curl -v -X POST https://api.line.me/v2/bot/richmenu \\
  -H 'Authorization: Bearer {Zugangstoken}' \\
  -H 'Content-Type: application/json' \\
  -d \\
  '
Fügen Sie hier den bearbeiteten Json ein
  '

  ''')

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

if __name__ == '__main__':
  main()

Dann wird ein Bild mit einer Beschriftung für jede Schaltfläche wie "b_1" wie folgt erzeugt.

sample_created_.jpg

Gleichzeitig wird `` `sample_created.json``` aus den Informationen von Koordinaten, Höhe und Breite erstellt.

Es sieht wie folgt aus

{
    "size": {
        "width": 2500,
        "height": 1686
    },
    "selected": "true",
    "name": "sample.png ",
    "chatBarText": "Speisekarte",
    "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"
            }
        }
    ]
}

Derzeit ist es im Postback-Format, aber es scheint, dass Sie Zeit sparen können, indem Sie den Inhalt ausfüllen und den Inhalt hier mit dem Bild vergleichen.

Es ist eine grobe Erklärung, aber wenn es jemandem hilft.

Recommended Posts

Ein Skript, mit dem Sie mit der LINE Messaging-API auf einfache Weise umfangreiche Menüs erstellen können
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
[LINE Messaging API] Erstellen Sie mit Python ein umfangreiches Menü
Eine Geschichte, die es einfach macht, den Wohnbereich mit Elasticsearch und Python abzuschätzen
[Python] Ich habe einen Test von "Streamlit" geschrieben, der das Erstellen von Visualisierungsanwendungen erleichtert.
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie eine Webseite, auf der ein Modell ausgeführt wird, das die Auflösung des Bilds mithilfe von Gradio erhöht, wodurch das Erstellen eines Webbildschirms vereinfacht wird
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
[LINE Messaging API] Ich möchte eine Nachricht vom Programm an alle LINE senden
Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Ein einfaches System, das automatisch mit Objekterkennung aufnimmt und an LINE sendet
Versuchen Sie, mit Python eine Wellenform (Audiospektrum) zu erstellen, die sich entsprechend dem Klang bewegt
Ich habe ein Tool erstellt, mit dem das Erstellen und Installieren eines öffentlichen Schlüssels etwas einfacher ist.
Generieren Sie mit apg ein leicht zu merkendes Passwort
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Schritte zum Erstellen eines Jobs, der ein Docker-Image abruft und mit Github-Aktionen testet
Mit der LINE WORKS-Kalender-API können Sie Termine an andere Personen weitergeben
Eine Geschichte, die das Debuggen von Modellen in der Django + SQLAlchemy-Umgebung einfacher macht
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
[Python] Erstellen Sie ein Programm, das Zeilenumbrüche in der Zwischenablage löscht. + Als Verknüpfung mit Fenstern registrieren
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Wie einfach ist es, ein Medikament auf dem Markt zu synthetisieren?
Ich habe eine Python-Bibliothek erstellt, um die API von LINE WORKS aufzurufen
Erstellen Sie ein Shell-Skript, um die Python-Datei mehrmals auszuführen
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
Schreiben Sie ein Skript, um die Entfernung mit dem Elasticsearch 5-System schmerzfrei zu berechnen
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Es scheint, dass alle untergeordneten Bestellungen storniert werden können, um alle übergeordneten Bestellungen (Sonderbestellungen) mit der Bitflyer-API zu stornieren
Die Geschichte eines virtuellen Planetariums [bis es einem Anfänger gelingt, ein Modell mit einem Skript zu erstellen]
Klasse, die die API von DMM trifft
Erstellen Sie ein Sternensystem mit Blender 2.80-Skript
Skript zum Erstellen einer Mac-Wörterbuchdatei
Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Verwenden Sie den Befehl [shell], um eine beliebige Datei zu komprimieren, um eine Datei zu erstellen und die Originaldatei zu löschen.
Erstellen Sie mithilfe der COTOHA-API eine App, die gut mit Berichten von Personen funktioniert
LINE Bot hat mir das Scraping-Ergebnis der IT-Trendinformationen gesendet [LINE Messaging API]
Ich habe ein Skript geschrieben, um die Schluckuhr wiederzubeleben, die bald sterben wird
Konvertieren der cURL-API in ein Python-Skript (mithilfe des IBM Cloud-Objektspeichers)
Python-Skript, das alle UTF-8-Dateien unter dem Ordner mit Stückliste ohne Stückliste erstellt
Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.