[PYTHON] J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent

J'ai créé un programme pour avertir par LINE lorsqu'un commutateur difficile à obtenir (?) Arrive. Ici, Joshin et Amazon sont visés.

environnement

Les choses nécessaires

--Compte développeur LINE --Machine qui exécute des scripts python

Préparation

Premier,

pip install requests
pip install beautifulsoup4
pip install line-bot-sdk

Et mettez dans les bibliothèques requises. Si vous le faites avec Raspberry pi, vous pouvez obtenir une erreur si vous n'écrivez pas sudo au début.

Ensuite, préparez un compte de développeur LINE. Comment le faire est décrit en détail ci-dessous. Une histoire sur la création d'un système qui notifie ip lorsque raspi commence à utiliser linebot

Ce que nous voulons ici, c'est "Channel Access Token" et "Your user Id". Copiez-les et collez-les dans «LINE_ACCESS_TOKEN» et «LINE_USER_ID» dans le programme ci-dessous.

programme

zaikochecker.py


# coding: UTF-8
import re
import requests
from bs4 import BeautifulSoup
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

LINE_ACCESS_TOKEN = "Collez le jeton d'accès LINE"
LINE_USER_ID = "Coller l'ID utilisateur LINE"
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)

#Pour le camouflage UA
my_header = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko"
}

#URL du produit
joshin_url = [
    ""
]

amazon_url = [
    ""
]

#Chaîne de caractères au moment de la notification LINE
result_str = ""

#Pour Joshin
result_str = "Joshin\n"
for i in range(len(joshin_url)):
    data = requests.get(joshin_url[i], headers = my_header)
    data.encoding = data.apparent_encoding
    data = data.text
    soup = BeautifulSoup(data, "html.parser")
    try:
        detail = soup.find("form",{"name":"cart_button"}).text.encode("UTF-8")
        print(detail) #déboguer
        if ("Vente" in detail) == False: # Vente休止中ですとなっていなければ在庫あり
            if(i == 0) : result_str += "Néon en stock\n"
            if(i == 1) : result_str += "Gris en stock\n"
    except AttributeError:
            print("Error")

#Notification LINE pour Joshin
if result_str != "Joshin\n":
    try:
        line_bot_api.push_message(LINE_USER_ID, TextSendMessage(text=result_str))
    except LineBotApiError as e:
        print(e)

#Pour Amazon
result_str = "Amazon\n"
for i in range(len(amazon_url)):
    data = requests.get(amazon_url[i], headers = my_header)
    data.encoding = data.apparent_encoding
    data = data.text
    soup = BeautifulSoup(data, "html.parser")
    detail = soup.find("div",id="merchant-info").find("a").text
    print(detail) #déboguer
    if ("Amazon" in detail) == True: # Amazon.co.En stock si jp est à vendre
        if(i == 0) : result_str += "Néon en stock\n"
        if(i == 1) : result_str += "Gris en stock\n"

#Notifications LINE pour Amazon
if result_str != "Amazon\n":
    try:
        line_bot_api.push_message(LINE_USER_ID, TextSendMessage(text=result_str))
    except LineBotApiError as e:
        print(e)

Ce programme peut être difficile à comprendre car il est inefficace car il s'agit d'une description push-and-pull. En termes simples, ce programme accède à l'URL du produit cible et vérifie s'il est prêt à passer une commande.

joshin_url et ʻamazon_url` sont un tableau d'URL de produits, et l'URL cible est décrite ici.

Si vous n'empruntez pas l'UA lors de l'accès, il sera lu sur Amazon, donc l'usurpation d'identité UA est décrite dans my_header.

Comment utiliser la demande et la belle soupe sortira si vous google, donc je vais l'omettre. Si c'est Joshin, s'il y a une chaîne de caractères "Invendu" dans cart_button, cela signifie que vous ne pouvez pas commander. En d'autres termes, s'il n'y a pas de mot «vente» dans la chaîne de caractères acquise, vous pouvez commander. À propos, la raison pour laquelle seul Joshin est traité par try est que si vous accédez trop avec Joshin, la page du produit ne s'affichera pas correctement. (Le bouton de commande ne s'affiche-t-il pas s'il y a de nombreux accès depuis une adresse IP spécifique dans un certain temps?) De plus, s'il s'agit d'Amazon, le vendeur est inscrit dans la balise a de «merchant-info», mais s'il s'agit d'Amazon.co.jp à vendre, il est jugé qu'il est prêt à commander.

Vous trouverez ci-dessous plus de détails sur les notifications LINE. LINE API Reference Cela devrait fonctionner si le jeton et l'ID corrects sont entrés.

Lorsque la notification arrive, cela ressemble à ceci. スクリーンショット 2017-03-23 13.41.19.png

Exécution du programme

Même si le programme ci-dessus n'est exécuté qu'une seule fois, seul l'état lors de son exécution peut être obtenu. Par conséquent, il est nécessaire de vérifier l'inventaire à certains intervalles de temps. Ici, nous utiliserons cron pour vérifier l'inventaire toutes les minutes.

Pour savoir comment utiliser cron, je me suis référé à ce qui suit. [Traiter à une heure fixe](http://make.bcde.jp/raspberry-pi/%E6%B1%BA%E3%81%BE%E3%81%A3%E3%81%9F%E6% 99% 82% E9% 96% 93% E3% 81% AB% E5% 87% A6% E7% 90% 86% E3% 81% 99% E3% 82% 8B /)

Si vous vérifiez toutes les minutes

*/1 * * * * python /home/hoge/zaikochecker.py

Ca devrait être fait.

Résumé

Avec ce programme, j'ai été effectivement notifié et j'ai pu passer une commande en toute sécurité. Cependant, il y a quelques problèmes. La première consiste à accéder toutes les minutes, il y a donc un risque que le serveur de l'autre partie soit surchargé et joué. La seconde est de vérifier toutes les minutes, donc si le stock est en stock pendant une longue période, vous recevrez une notification LINE toutes les minutes.

Je pense que vous pouvez le faire avec la même procédure si vous savez utiliser une belle soupe même avec des Yodobashi et de gros appareils photo.

Recommended Posts

J'ai créé un programme pour vous avertir par LINE lorsque les commutateurs arrivent
J'ai créé un système qui vous permet de tweeter simplement en passant un appel téléphonique
Je vous ai fait exécuter des commandes depuis un navigateur WEB
J'ai essayé de faire un programme pour résoudre (indice) la recherche d'erreur de Saiseriya
Vous ne voulez pas dire que vous avez créé un programme de reconnaissance faciale?
J'ai fait un tampon LINE où vous pouvez étudier les commandes Linux
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
J'ai fait un script pour afficher des pictogrammes
Quand tu veux casser une ligne pendant longtemps
Lorsque vous souhaitez remplacer une colonne par une valeur manquante (NaN) colonne par colonne
J'ai créé un programme pour saisir ce que j'ai mangé et afficher les calories et les sucres
J'ai créé un konoha de bibliothèque qui fait passer le tokenizer à une belle sensation
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai essayé de programmer la bulle de tri par langue
Envoyer un message à LINE avec Python (LINE Notify)
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
Je viens de créer un outil pour afficher facilement les données sous forme de graphique par opération GUI
Création d'un LINE BOT pour notifier d'autres concours AtCoder à l'aide d'AWS
J'ai créé un Bot LINE avec Serverless Framework!
Comment se souvenir quand on oublie un mot
J'ai fait un module en langage C qui filtre les images chargées par Python
J'ai créé un outil pour obtenir de nouveaux articles
J'ai créé un programme pour rechercher des mots sur la fenêtre (développement précédent)
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai créé un programme cryptographique César en Python.
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
Utilisez AWS Lambda + LINE Notify pour avertir LINE de ne pas oublier votre parapluie lorsque vous rentrez chez vous
J'ai oublié d'utiliser VIM, j'ai donc fait une vidéo pour la mémorisation. 3 vidéos par niveau
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai fait une bibliothèque pour bien séparer les phrases japonaises
J'ai fait un script pour mettre un extrait dans README.md
J'ai créé un module Python pour traduire les commentaires
J'ai créé un code pour convertir illustration2vec en modèle Keras
J'ai essayé de faire LINE BOT avec Python et Heroku
[Projet spécial Valentine] J'ai fait un diagnostic de compatibilité LINE!
J'ai fait une commande pour marquer le clip de la table
J'ai créé une bibliothèque python qui fait rouler le rang
Lorsque vous voulez plt.save dans l'instruction for
〇✕ J'ai fait un jeu
Je suis toujours impatient lorsque je commande un café, j'ai donc créé une application React pour le résoudre
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
Une histoire qui a trébuché lorsque j'ai créé un bot de chat avec Transformer
Je souhaite enregistrer les photos envoyées par LINE vers S3
J'ai essayé de notifier les informations de retard de train avec LINE Notify
J'ai créé un package pour filtrer les séries chronologiques avec python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
J'ai fait une boîte pour me reposer avant que Pepper ne se fatigue
J'ai fait une commande pour générer un commentaire pour une table dans Django
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
J'ai fait une fonction pour vérifier le modèle de DCGAN