[PYTHON] C'est très rapide lorsque vous recevez le bulletin de tremblement de terre d'urgence sur le moniteur de mouvement fort et que vous le gérez avec JSON

Aperçu

Conditions préalables

Contexte

――Nous avons créé un mécanisme pour obtenir des tweets du compte Twitter sur les tremblements de terre via IFTTT. Le temps de réponse varie en fonction de l'état du serveur de Twitter, et il est précis. Dans le pire des cas, il ne peut pas être acquis en temps opportun. ――Je veux sortir le bulletin de tremblement de terre d'urgence sur le canal Discord ainsi que moi-même et le partager. ――Mon passe-temps est la surveillance des tremblements de terre. ――Cela a commencé à être bruyant en 2020, donc pour collecter des données.

Comment y parvenir

Image du flux de données (désolé pour la chaîne de caractères)

Moniteur de mouvement puissant Informations sur les tremblements de terre Serveur Push → Google Chrome de CentOS 7 → Serveur Web Python de CentOS 7 → API Discord / Slack / Twitter

Côté CentOS

--Parce qu'il gère l'interface graphique, commencez par le niveau d'exécution 5

Supplément

{
'type': 'eew', #Dans le cas d'un bulletin de tremblement de terre d'urgence, le type de chaîne eew
'time': '1589131429000', 
'report': '1', #Dans le cas du premier rapport, la chaîne de caractères 1 de type String. Le rapport final est une chaîne de type final
'epicenter': 'Iyo Nada', #épicentre
'depth': '60km', #Profondeur de la source
'magnitude': 3.5, #Magnitude montrant la magnitude du tremblement de terre
'latitude': 33.8, #Les deux lignes ici sont probablement la latitude et la longitude
'longitude': 132.1, 
'intensity': '2',  #Intensité sismique attendue
'index': 2
}

Les informations que je veux sont principalement de type String et de type Float, alors gardez cela à l'esprit. Pour référence, je publierai également le journal de détection d'accélération.

{
'type': 'pga_alert', 
'time': '1589131441839', 
'max_pga': 0.637, 
'new': True, 
'estimated_intensity': 0, 
'region_list': ['Ehime']
}

Côté Python

Il fonctionne comme un serveur Web.

from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs, urlparse
import sendToDiscord #Ceci est mon propre code. Je cuisine dans ceci et le POSTE sur le Webhook de Discord.


address = ('0.0.0.0', 8000)

class MyHTTPRequestHandler(BaseHTTPRequestHandler):

	def do_GET(self):

		parsed_path = urlparse(self.path)
		self.send_response(200)
		self.send_header('Content-Type', 'text/plain; charset=utf-8')
		self.end_headers()
		self.wfile.write(b'Hello from do_GET')

	def do_POST(self):

		parsed_path = urlparse(self.path)
		content_length = int(self.headers['content-length'])
		
		sendToDiscord.readJson('{}'.format((self.rfile.read(content_length).decode('utf-8'))))
		
		self.send_response(200)
		self.send_header('Content-Type', 'text/plain; charset=utf-8')
		self.end_headers()
		self.wfile.write(b'Hello from do_POST')

with HTTPServer(address, MyHTTPRequestHandler) as server:
    server.serve_forever()

C'est maladroit, mais je viens d'ajouter une ligne à l'exemple de code. Le JSON reçu est versé dans la fonction tel quel et traité.

2020/05/19 PostScript À @ sirorabi516 Je vais coller une partie du code de lancement dans le webhook Discord.

import json
import requests

webhookUrl = "DISCORD WEBHOOK URL"

'''
Envoyer un message à Discord Webhook
'''
def sendDiscord(msg):

	# Create JSON
	payload = {
	   "content" : "{0}".format(msg)
	}

	'''
Il semble préférable de vérifier le code d'état dans le contenu de res et d'incorporer le processus de nouvelle tentative
	'''
	# Send to Discord
	res = requests.post(webhookUrl, json.dumps(payload), headers={'Content-Type': 'application/json'})
	return


'''
Rédiger un message en convertissant le JSON reçu du serveur Web en dictionnaire
'''
def readJson(jsonData):
	jsonData = json.loads(jsonData)

	'''
S'il s'agit d'un bulletin de tremblement de terre d'urgence, du premier rapport et de l'intensité sismique attendue de 3 ou plus, il sera traité
	'''
	
	# get first eew message
	if jsonData.get('type') == 'eew' and jsonData.get('report') == '1' and int(jsonData.get('intensity')) > 2:
		magnitude = float(jsonData.get('magnitude'))

		# get EQ Data
		epicenter = str(jsonData.get('epicenter'))
		depth = str(jsonData.get('depth'))
		intensity = str(jsonData.get('intensity'))

		'''
Sortie de composition de message faisant partie de la discorde. Si vous spécifiez fix, tout le texte peut être jaune.
		'''
		# add EQ Data
		msg = '''```fix

 Rapport sur la vitesse du séisme au sol (1er rapport)

 Source du tremblement de terre: {0}
 Intensité sismique attendue: {1}
 Standard: M {2}
 Profondeur: {3}


#### **`'''.format(epicenter, intensity, str(magnitude), depth)`**
```format(epicenter, intensity, str(magnitude), depth)

		sendDiscord(msg)	
		return

	'''
En cas de faux rapport, pga_alert_Puisqu'il semble qu'une annulation soit envoyée, essayez de la détecter également
	'''
	# Alert Cancel
	if jsonData.get('type') == 'pga_alert_cancel':
		msg = '### Cancel Message ###'
		sendDiscord(msg)
		return

Je l'ai écrit comme ça. Je pense que le dernier "pga_alert_cancel" est obligatoire. Car, dans le passé, l'information «Intensité sismique 7 du nord de la baie de Tokyo» volait depuis le point d'observation de Tokyo dans le premier rapport. Quand je l'ai reçu, j'ai paniqué, "Quoi? N'est-ce pas le niveau auquel Tokyo sera détruit!" Après tout, c'était un faux rapport en raison de l'impact de la foudre, mais laisser les informations aller ailleurs ne devrait pas provoquer une étrange panique. Je dois également vous dire que c'était un faux rapport. Bien sûr pour moi.

Remarques

--JSON ne volera pas de l'extension Chrome à moins que vous ne quittiez do_GET.

finalement

Pour l'instant, je pense que cette méthode est facile de gérer les informations sur les tremblements de terre pour les utilisateurs avancés à une vitesse explosive sans entraîner de coûts. Puisque les données sont transmises en JSON, intégrez-les dans le message comme vous le souhaitez, Il existe également une atmosphère dans laquelle vous pouvez transmettre des informations à votre lieu préféré, il semble donc que vous puissiez les utiliser d'autres manières.

Recommended Posts

C'est très rapide lorsque vous recevez le bulletin de tremblement de terre d'urgence sur le moniteur de mouvement fort et que vous le gérez avec JSON
POST JSON avec Python et recevez avec PHP
POSTER l'image avec json et la recevoir avec flask
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Comment retourner les données contenues dans le modèle django au format json et les mapper sur le dépliant