[PYTHON] [EN DIRECT] J'ai essayé de fournir les heures de lever et de coucher du soleil dans tout le pays chaque jour

Motive

Quand je le remarque, je reste souvent à la maison le soir, donc je veux agir quand il fait beau. En fait, à titre préventif contre la dépression propre à l'hiver, je mettrai à jour et afficherai quotidiennement les heures de lever et de coucher du soleil dans tout le pays.

Method

C'est le lever et le coucher du soleil, mais j'utilise l 'adresse Ohakon!? API.

C'est un script, mais ...

--Créer un article Qiita

--Mettre à jour les articles Qiita à l'aide de l'API

Divisez-le en deux parties et utilisez cron pour le configurer pour qu'il s'exécute vers midi.

Development

Script pour créer l'article Qiita

import requests
import datetime
from bs4 import BeautifulSoup
from collections import namedtuple
import asyncio
import os

State = namedtuple('State', ['name', 'id', 'lat', 'lng'])

#dataset
states = [
	State("Sapporo",    1, 43.06417,141.34694),
	State("Ville d'Aomori",    2, 40.82444,140.74),
	State("Ville de Morioka",    3, 39.70361,141.1525),
	State("Ville de Sendai",    4, 38.26889,140.87194),
	State("Ville d'Akita",    5, 39.71861,140.1025),
	State("Ville de Yamagata",    6, 38.24056,140.36333),
	State("Ville de Fukushima",    7, 37.75,140.46778),
	State("Mito City",    8, 36.34139,140.44667),
	State("Ville d'Utsunomiya",   9, 36.56583,139.88361),
	State("Ville de Maebashi",    10, 36.39111,139.06083),
	State("Ville de Saitama", 11, 35.85694,139.64889),
	State("Chiba",    12, 35.60472,140.12333),
	State("Quartier Shinjuku",    13, 35.68944,139.69167),
	State("Yokohama",    14, 35.44778,139.6425),
	State("Ville de Niigata",    15, 37.90222,139.02361),
	State("Toyama City",    16, 36.69528,137.21139),
	State("Ville de Kanazawa",    17, 36.59444,136.62556),
	State("Ville de Fukui",    18, 36.06528,136.22194),
	State("Ville de Kofu",    19, 35.66389,138.56833),
	State("Ville de Nagano",    20, 36.65139,138.18111),
	State("Ville de Gifu",    21, 35.39111,136.72222),
	State("Ville de Shizuoka",    22, 34.97694,138.38306),
	State("Ville de Nagoya",  23, 35.18028,136.90667),
	State("Ville de Tsu",     24, 34.73028,136.50861),
	State("Ville d'Otsu",   25, 35.00444,135.86833),
	State("Ville de Kyoto",   26,35.02139,135.75556),
	State("Ville d'Osaka",   27,34.68639,135.52),
	State("Ville de Kobe",   28,34.69139,135.18306),
	State("Nara City",   29,34.68528,135.83278),
	State("Ville de Wakayama",  30, 34.22611,135.1675),
	State("Ville de Tottori",   31,35.50361,134.23833),
	State("Matsue",   32,35.47222,133.05056),
	State("Okayama City",   33,34.66167,133.935),
	State("Ville d'Hiroshima",   34,34.39639,132.45944),
	State("Ville de Yamaguchi",   35,34.18583,131.47139),
	State("Ville de Tokushima",   36,34.06583,134.55944),
	State("Ville de Takamatsu",   37,34.34028,134.04333),
	State("Ville de Matsuyama",   38,33.84167,132.76611),
	State("Ville de Kochi",   39,33.55972,133.53111),
	State("Ville de Fukuoka",   40,33.60639,130.41806),
	State("Saga City",   41,33.24944,130.29889),
	State("Ville de Nagasaki",   42,32.74472,129.87361),
	State("Ville de Kumamoto",   43,32.78972,130.74167),
	State("Ville d'Oita",   44,33.23806,131.6125),
	State("Ville de Miyazaki",   45,31.91111,131.42389),
	State("Ville de Kagoshima", 46,31.56028,130.55806),
	State("Naha City",   47,26.2125,127.68111)
]

async def get_time_sun_rise_set(year, month, day, state):
    url = 'http://labs.bitmeister.jp/ohakon/api/?'
    payload = {'mode':'sun_moon_rise_set', 'year':year, 'month':month, 'day':day, 'lat':state.lat, 'lng':state.lng}
    response = requests.get(url, params=payload)
    soup = BeautifulSoup(response.content, "html.parser")
    await asyncio.sleep(1)

    sunrise = datetime.datetime.strptime(soup.sunrise_hm.text,'%H:%M')
    sunset = datetime.datetime.strptime(soup.sunset_hm.text,'%H:%M')

    diff_seconds = (sunset - sunrise).total_seconds()
    diff_hours = int(diff_seconds // (60 * 60))
    diff_minutes = int((diff_seconds - diff_hours * (60 * 60)) / 60)

    return state.name, soup.sunrise_hm.text, soup.sunset_hm.text, "{:02d}:{:02d}".format(diff_hours, diff_minutes)

def write_session(foutobj, path):
	with open(path, "r", encoding='utf-8') as fin:
		foutobj.write(fin.read())	


if __name__ == "__main__":
	now = datetime.datetime.now()
	output = "./article.md"
	base_folder = "./templates/"

	loop = asyncio.get_event_loop()
	cors = [get_time_sun_rise_set(now.year, now.month, now.day, s) for s in states]
	result = loop.run_until_complete(
			asyncio.gather(*cors)
		)
	build_parts = ["motive.md", "method.md", "development.md", "contents.md", "future.md", "reference.md"]

	with open("./templates/contents.md", "w", encoding='utf-8') as fout:
		fout.write("# Sunrize/Sunset\n\n")
		fout.write("{}\n\n".format(datetime.datetime.now().strftime("【%Y/%m/%d %H:%Mis à jour à M]")))
		fout.write("|city|sunrize|sunset|hours of sunlight|\n")
		fout.write("|:--|:--|:--|:--|\n")
		for r in result:
			fout.write("|{}|{}|{}|{}|\n".format(*r))
		fout.write("\n\n")

	with open(output, "w", encoding='utf-8') as fout:
		for p in build_parts:
			write_session(fout, os.path.join(base_folder, p))

L'heure du lever et du coucher du soleil est sortie en utilisant l'API avec get_time_sun_rise_set (). Lors de la définition de la requête, payload = {'mode': 'sun_moon_rise_set', 'year': year, 'month': month, 'day': day, 'lat': state.lat, 'lng': state. Utilisez les paramètres de date et de latitude / longitude comme dans lng} .

De plus, afin d'obtenir chaque acquisition d'API de manière stable, le traitement asynchrone ʻasyncio` est utilisé au cas où.

	loop = asyncio.get_event_loop()
	cors = [get_time_sun_rise_set(now.year, now.month, now.day, s) for s in states]
	result = loop.run_until_complete(
			asyncio.gather(*cors)
		)

De plus, pour faciliter la modification ultérieure, les phrases de chaque section sont divisées et finalement agrégées. Lors de la simple lecture et écriture d'un fichier, ʻopen (chemin, 'r') était bien, mais lors de l'exécution avec cron, une erreur se produit dans le code de caractère. Vous devez donc définir explicitement ʻencoding = 'utf-8' dans l'argument. (Reportez-vous à Que faire lorsque UnicodeDecodeError se produit en raison d'E / S de fichier)

	build_parts = ["motive.md", "method.md", "development.md", "contents.md", "future.md", "reference.md"]
	with open(output, "w", encoding='utf-8') as fout:
		for p in build_parts:
			write_session(fout, os.path.join(base_folder, p))

Mettre à jour les articles Qiita à l'aide de l'API

import json
import requests

if __name__ == "__main__":
	BASE_URL = "https://qiita.com/api/v2/items/"
	TOKEN = "--Jeton d'accès--"
	headers = {"Authorization": f"Bearer {TOKEN}", "Content-Type":"application/json"}

	sentence = ""
	with open("article.md", "r", encoding='utf-8') as fin:
		sentence = fin.read()

	contents = {"title": "[EN DIRECT] J'ai essayé de fournir les heures de lever et de coucher du soleil dans tout le pays chaque jour",
				"tags": [{"name": "Python"},
						{"name":"cron"},
						{"name":"asyncio"},
						{"name":"QiitaAPI"},
						{"name":"api"}],
				"body": sentence,
				"id":"ada82beb3b747b99a05e"
				}

	res = requests.patch(BASE_URL + contents["id"], headers=headers, json=contents)
	print(res)

Issue Access Token est requis pour utiliser l'API Qiita, et est requis lors de la demande de l'API avec des requests. Vous pouvez mettre à jour le contenu avec requests.patch ({content URL}, {header}, {content content}).

Sunrize/Sunset

[Mis à jour à 01:00 le 05/06/2020]

city sunrize sunset hours of sunlight
Sapporo 3:56 19:10 15:14
Ville d'Aomori 4:06 19:05 14:59
Ville de Morioka 4:08 19:00 14:52
Ville de Sendai 4:13 18:57 14:44
Ville d'Akita 4:12 19:04 14:52
Ville de Yamagata 4:15 18:59 14:44
Ville de Fukushima 4:16 18:57 14:41
Mito City 4:20 18:53 14:33
Ville d'Utsunomiya 4:22 18:56 14:34
Ville de Maebashi 4:26 18:59 14:33
Ville de Saitama 4:25 18:55 14:30
Chiba 4:24 18:52 14:28
Quartier Shinjuku 4:25 18:54 14:29
Yokohama 4:26 18:54 14:28
Ville de Niigata 4:21 19:03 14:42
Toyama City 4:32 19:07 14:35
Ville de Kanazawa 4:35 19:09 14:34
Ville de Fukui 4:38 19:09 14:31
Ville de Kofu 4:30 18:59 14:29
Ville de Nagano 4:28 19:03 14:35
Ville de Gifu 4:38 19:05 14:27
Ville de Shizuoka 4:32 18:58 14:26
Ville de Nagoya 4:37 19:04 14:27
Ville de Tsu 4:40 19:04 14:24
Ville d'Otsu 4:42 19:08 14:26
Ville de Kyoto 4:43 19:08 14:25
Ville d'Osaka 4:44 19:08 14:24
Ville de Kobe 4:46 19:10 14:24
Nara City 4:43 19:07 14:24
Ville de Wakayama 4:47 19:08 14:21
Ville de Tottori 4:47 19:16 14:29
Matsue 4:52 19:20 14:28
Okayama City 4:51 19:15 14:24
Ville d'Hiroshima 4:57 19:20 14:23
Ville de Yamaguchi 5:02 19:23 14:21
Ville de Tokushima 4:50 19:10 14:20
Ville de Takamatsu 4:51 19:13 14:22
Ville de Matsuyama 4:58 19:17 14:19
Ville de Kochi 4:55 19:13 14:18
Ville de Fukuoka 5:08 19:26 14:18
Saga City 5:09 19:25 14:16
Ville de Nagasaki 5:12 19:26 14:14
Ville de Kumamoto 5:08 19:22 14:14
Ville d'Oita 5:04 19:20 14:16
Ville de Miyazaki 5:08 19:18 14:10
Ville de Kagoshima 5:12 19:20 14:08
Naha City 5:36 19:19 13:43

Future

Si vous indiquez les heures de lever et de coucher du soleil dans tout le pays, vous pouvez voir que le décalage horaire est d'environ 30 à 60 minutes et que le temps d'ensoleillement est d'environ 30 à 60 minutes.

Reference

Recommended Posts

[EN DIRECT] J'ai essayé de fournir les heures de lever et de coucher du soleil dans tout le pays chaque jour
J'ai essayé LeetCode tous les jours 13. Roman to Integer (Python, Go)
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
J'ai essayé d'énumérer les différences entre java et python
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
J'ai essayé de résumer la commande umask
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de reconnaître le mot de réveil
J'ai essayé d'exprimer de la tristesse et de la joie face au problème du mariage stable.
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de toucher l'API COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai implémenté le modèle VGG16 avec Keras et essayé d'identifier CIFAR10
J'ai essayé de livrer du courrier depuis Node.js et Python en utilisant le service de livraison de courrier (SendGrid) d'IBM Cloud!
J'ai essayé de contrôler la bande passante et le délai du réseau avec la commande tc
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
[Introduction à AWS] J'ai essayé de porter une application de conversation et de jouer avec text2speech @ AWS ♪
J'ai essayé de passer le test G et la qualification E en m'entraînant à partir de 50
J'ai essayé Web Scraping pour analyser les paroles.
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé d'optimiser le séchage du linge
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de corriger la forme trapézoïdale de l'image
Qiita Job J'ai essayé d'analyser le travail
LeetCode j'ai essayé de résumer les plus simples
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de mettre en œuvre le problème du voyageur de commerce
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de notifier la mise à jour de "Devenir romancier" en utilisant "IFTTT" et "Devenir un romancier API"
J'ai essayé de comprendre comment utiliser les pandas et la colinéarité multiple en utilisant l'ensemble de données Affaires comme thème.
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de noter la syntaxe trop humoristique et humoristique en utilisant l'API COTOHA.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé LeetCode tous les jours 7. Integer Integer (Python, Go)
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé de détecter l'iris à partir de l'image de la caméra
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de prédire le match de la J League (analyse des données)
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé d'ajouter des appels système et des planificateurs à Linux
J'ai essayé LeetCode tous les jours 20. Parenthèses valides (Python, Go)
J'ai essayé d'approcher la fonction sin en utilisant le chainer