Cet article a été écrit pour les étudiants du SFC de l'Université Keio. Je vais essayer d'expliquer la technologie d'une manière facile à comprendre, mais veuillez noter que l'explication du système d'éducation physique lui-même est omise.
`De plus, nous ne sommes pas responsables des dommages causés par le programme créé en se référant à cet article, veuillez donc le faire à vos propres risques lors de la création d'un système similaire. ''
Puisqu'il s'agit d'une version bêta, je la poste avec des améliorations infinies.
Je souhaite faire une réservation rapide lorsqu'il y a un poste vacant dans la classe que je souhaite prendre avec le système de réservation d'éducation physique de SFC.
Il n'y a pas de page dans le système d'éducation physique qui décrit les conditions d'utilisation, mais [Conditions du site de l'Université Keio](https://www.students.keio.ac.jp/com/other/contact/about-this-site. Notez ce qui suit en référence au HTML). ** ・ Ne divulguez pas d'informations sur le site au public extérieur ** ** ・ Vous êtes libre de créer un lien vers le système de réservation d'éducation physique, mais si vous incluez le lien dans un élément du site tel qu'une image, spécifiez-le. ** ** ・ L'accès excessif est sujet à BAN, donc demandez dans les limites du bon sens **
・ MacOS Catalina 10.15.5 ・ Python 3.8.0
Si vous ne comprenez pas comment utiliser Xpath, reportez-vous à cet article → Résumé de l'utilisation de Xpath
pip ~
*https://notify-bot.line.me/ja/ Connectez-vous à votre compte LINE à partir du site ci-dessus et cliquez sur le bouton en haut à droite pour accéder à Ma page Il y a un bouton en bas de l'écran comme indiqué ci-dessous, alors cliquez dessus pour obtenir un jeton d'accès.
・ Main.py (fichier d'exécution) ・ Secrets.yaml (un fichier qui recueille des informations confidentielles)
main.py
import requests
import yaml
from lxml import html
from bs4 import BeautifulSoup
import time
#Comme insecureRequestWarning est bruyant, supprimez-le
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
#Lire les informations confidentielles d'un autre fichier
SECREATS = yaml.load(open('secrets.yaml').read(),Loader=yaml.SafeLoader)
def checkTargetClass(targetClass: str):
'''
Connectez-vous et renvoyez le lien de réservation pour la leçon spécifiée s'il y a de la place disponible
'''
PE_SYSTEM_URL = 'https://wellness.sfc.keio.ac.jp/v3/'
#Démarrer une session
session = requests.session()
#S'identifier
login_info = {
'login':SECREATS['user'],
'password':SECREATS['pass'],
'submit':'login',
'page':'top',
'lang':'ja',
'mode':'login',
'semester':'20205'
}
#Exécution de la connexion
res = session.post(PE_SYSTEM_URL, data=login_info, verify=False)
res.raise_for_status() #S'il y a une erreur, soulevez une exception ici
#Analyser dans un format qui peut être recherché par Xpath
soup_parsed_data = BeautifulSoup(res.text, 'html.parser')
lxml_coverted_data = html.fromstring(str(soup_parsed_data))
#Détection du lien de la page de réservation&Bouge toi
reservePageTag = lxml_coverted_data.xpath('//*[@id="sidenav"]/ul/li[4]/a')
reservePageLink = reservePageTag[0].get('href')
res = session.get(PE_SYSTEM_URL+reservePageLink)
res.raise_for_status()
#Perth
soup_parsed_data = BeautifulSoup(res.text, 'html.parser')
lxml_coverted_data = html.fromstring(str(soup_parsed_data))
#Obtenez une liste des cours disponibles et un lien vers la page de confirmation de réservation
targetElemChunk = lxml_coverted_data.xpath('//*[@id="maincontents"]/div[6]/table/tbody/tr')
classInfoList = []
for classInfoRow in targetElemChunk:
className = classInfoRow[7].text
reseveConfirmPageLink = classInfoRow[9].find('a').get('href')
if targetClass in className:
notify(className+PE_SYSTEM_URL+reseveConfirmPageLink)
classInfo = [className, reseveConfirmPageLink]
classInfoList.append(classInfo)
def watch():
while True:
checkTargetClass('Science diététique')
time.sleep(1800)
#Envoyer une notification
def notify(message):
LINE_NOTIFY_URL = 'https://notify-api.line.me/api/notify'
TOKEN = SECREATS['notify-token']
headers = {'Authorization': f'Bearer {TOKEN}'}
data = {'message': f'message: {message}'}
requests.post(LINE_NOTIFY_URL, headers = headers, data = data)
def main():
watch()
if __name__ == "__main__":
main()
secrets.yaml
user: 'Identifiant de connexion'
pass: 'mot de passe'
notify-token: 'Jeton émis par l'API LINE'
Exécutez
python main.py``` à partir de la ligne de commande et laissez-le tel quel
・ Je souhaite déplacer le fichier vers le serveur car il n'est pas pratique de le laisser définitivement. ・ Je veux en faire une application Web et l'utiliser avec l'interface graphique ・ Je règle la fréquence d'accès toutes les 1800 secondes, mais il peut être possible de raccourcir un peu l'intervalle. ・ Ou, si vous pouvez identifier le moment où les annulations se produisent fréquemment, vous pourrez peut-être le supporter en accédant fréquemment uniquement pendant cette période.
Recommended Posts