[PYTHON] Le robot en ligne le plus simple au monde pour perdre du poids

introduction

Ce robot de ligne a été produit trois mois après le début de la programmation de la présentation du produit de l'école. Si quelqu'un se demande quoi faire après avoir commencé à apprendre, j'espère que ce sera utile. De plus, comme c'est le premier produit que j'ai fabriqué, il y a quelques parties où le code est approximatif. Et si c'était comme ça? S'il y a une partie, je vous serais reconnaissant si vous pouviez me le faire savoir dans les commentaires.

Pourquoi je l'ai fait

J'étais toujours insatisfaite de grossir et d'être trop difficile à perdre du poids. ** Un régime ne réussira que si vous faites de l'exercice idéalement et continuez à consommer les calories calculées de chaque repas pendant 3 mois, au moins 1 mois. ** Cependant, pour y parvenir, vous devez éviter les tentations comme Mara. Désir de repos insoutenable à la fin du travail. Ramen et envies de boire qui peuvent être dites chroniques. Une sensation de répulsion à l'exercice en raison du manque d'exercice. La bataille des gens modernes est toujours difficile. Donc ** Si vous mangez et grossissez, vous pouvez perdre du poids simplement en mangeant! ** Ce robot de ligne a été créé avec un service aussi simple à l'esprit.

Pourquoi vous perdez du poids

Au fait, savez-vous combien de kilogrammes vous devez brûler pour perdre un kilogramme? ** En fait, on dit que c'est 7 000 kilokcal. ** ** Dans ce bot de ligne, le métabolisme de base est calculé en fonction de la taille, du poids, de l'âge et du sexe saisis, l'apport cible en kcal inférieur de 1000 kcal à celui-ci est calculé et un menu est créé au hasard à partir des produits LAWSON et Seven Eleven, et sur la ligne. Il l'enverra. ** En d'autres termes, vous pouvez économiser 7000 kcal par semaine et perdre 1 kg simplement en achetant et en mangeant les éléments de menu que vous avez reçus en ligne. Une alimentation mensuelle de 4 kg est une réussite! !! Tout ce que vous faites est de manger comme on vous le dit! !! !! ** **

cible

Les personnes qui veulent perdre du poids sans faire d'exercice (en particulier les femmes qui ne sont pas douées pour faire de l'exercice) Les personnes qui souhaitent conserver leur morphologie actuelle (recommandé la veille et après une fête ou une soirée buvette!) Les personnes qui vivent seules et qui ont du mal à penser à quoi manger tous les jours

Inscrivez-vous comme ami

Si vous souhaitez essayer ce robot de ligne, veuillez ajouter un ami sur LINE parmi les suivants. 646hrric.png

Comment utiliser

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578416/0b681596-8685-e688-bf75-4ff3cdc4ac03.jpeg "width=70%>

  1. Tout d'abord, ajoutez un ami et envoyez "Paramètres" pour recevoir le message.
  2. Complétez les paramètres de données personnelles en fonction du format envoyé (Exemple d'entrée: ** Enregistrement. 178-78-25-1 **)
  3. Après cela, vous pouvez recevoir le menu en envoyant "Lawson" ou "Seven".

Fonction implémentée

  1. Enregistrez les résultats du scraping de pages Web dans une liste
  2. Calculez le kcal à ingérer le matin, le jour et la nuit à partir des données personnelles reçues de l'utilisateur et enregistrez-le dans la base de données avec l'ID utilisateur acquis.
  3. Lorsqu'une demande de menu est reçue d'un utilisateur, les données de l'utilisateur sont appelées à partir de la base de données.
  4. Sélectionnez au hasard des produits dans la liste des produits du dépanneur et faites une boucle jusqu'à ce qu'ils soient proches du kcal cible. Envoyer le résultat à l'utilisateur

À propos du code

Seuls le code de scraping et le code principal sont répertoriés. Si vous voulez voir le texte complet, veuillez visiter mon hub git. git hub

Code de raclage

Puisqu'il est long d'y mettre Lawson, seul Seven est répertorié.

mk-data.py


import requests
from bs4 import BeautifulSoup as bs
import pickle

Grattage avec BeautifulSoup et enregistrement dans un fichier à l'aide de pickle.

mk-data.py


#Sept fonctions de grattage
def seven_scraping(url):
    header = {"User-Agent" : "Mozilla/5.0"}
    s = bs(requests.get(url, headers=header).content, 'html.parser')
    
    #Nom
    s_names = []
    for i in s.find_all('div', class_='itemName'):
        s_names.append(i.text)

    #image
    s_images = []
    for i in s.find_all('div', class_='image'):
        j = i.a.get("href")
        s_images.append("https://www.sej.co.jp"+j)

    #calorie
    s_kcals = []
    for i in s.find_all('div', class_='summary'):
        j = i.find('li', class_ ='n1')
        j = j.text
        j = j.strip("* Les calories peuvent varier selon la région.")
        j = j.split("kcal")[0]
        j = int(j)
        s_kcals.append(j)

    return list(zip(s_kcals, s_names, s_images))

Créez des données récupérées sous forme de liste de noms, d'images et de calories. Une fonction qui les combine finalement en une seule liste et la renvoie.

mk-data.py


def main():
    seven_url ="https://www.sej.co.jp/i/products/anshin/calorie/"
    seven_list = seven_scraping(seven_url)
    f = open('seven_list.txt', 'wb')
    list_row02 = seven_list
    pickle.dump(list_row02, f)

if __name__ == '__main__':
    main()

Exécuter la fonction et enregistrer dans un fichier à l'aide de pickle

Code principal

main.py


from flask import Flask, request, abort
import os
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

import re
import pickle
import random
import sqlite3

main.py


app = Flask(__name__)
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]
line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)
f = open("./lawson_list.txt","rb")
list_row = pickle.load(f)
f02 = open("./seven_list.txt","rb")
list_row02 = pickle.load(f02)

Appelez les données produit enregistrées précédemment.

main.py


#Fonction pour calculer le métabolisme de base et renvoyer la valeur cible
def base_energy(tall, weight, age, sex):
    if sex == 1:
        result = 13.397 * weight + 4.799 * tall - 5.677 * age + 88.362
        return result
    else:
        result = 9.247 * weight + 3.098 * tall - 4.33 * age + 447.593
    
    result = (result * 1.75) -1000
    return round(result)

Le taux métabolique basal est calculé à l'aide de l'équation de Harris-Benedict (version améliorée). Mâle: 13,397 x poids kg + 4,799 x hauteur cm-5,677 x âge +88,362 Femelle: 9.247 x poids kg + 3.098 x hauteur cm-4.33 x âge +447.593 Référence: "https://keisan.casio.jp/exec/system/1161228736"

main.py


#Calculer les calories matin et jour / nuit
def create_before(aim_kcal):
    return int(aim_kcal * 0.2)
def create_after(aim_kcal):    
    return int(aim_kcal * 0.4)

#Fonction pour sélectionner un menu au hasard
def make_menu(aim_num, conv_list):
    menu = []
    x = 0
    #Bouclez jusqu'à ce que la calorie cible soit de 100 kcal
    for i in range(150):
        i = random.choice(conv_list)
        if aim_num -100 <= x <= aim_num + 100:
            return menu
            break
        if i[0] + x <= aim_num + 100:
            x += i[0]
            menu.append(i)
        else:
            continue 

Réglez le kcal cible quotidien à un rapport de 2: 4: 4 matin: jour: nuit. La fonction de création de menu est un jeu de puissance qui continue d'appeler de la liste de produits au hasard jusqu'à ce qu'elle s'approche de la valeur cible. ↓ Un peu omis

main.py


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    word = event.message.text
    if word in ["Lawson"]:
        #Appeler les données métaboliques basales matin, jour et nuit
        profile = line_bot_api.get_profile(event.source.user_id)
        user_id = profile.user_id
        conn = sqlite3.connect('database.sqlite3')
        c = conn.cursor()
        c.execute('SELECT * FROM user WHERE id=?', (user_id,))
        list1 = c.fetchone()
        before_noon = list1[1]
        after_noon = list1[2]
        conn.commit()
        conn.close()
        today_morning = make_menu(before_noon, list_row)
        today_lunch = make_menu(after_noon, list_row)
        today_dinner= make_menu(after_noon, list_row)
        today_menu = []
        for i in today_morning:
            today_menu .append( "\n Petit déjeuner" + str(i))
        for i in today_lunch:
            today_menu.append("\n Déjeuner" + str(i))
        for i in today_dinner:
            today_menu.append("\n dîner" + str(i))
        reply = ','.join(today_menu)

        line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=reply))

Lorsque vous recevez une demande de menu, récupérez user_id et appelez la calorie cible de l'utilisateur. Envoyez le numéro et le menu créés à partir de la liste de produits à l'utilisateur.

main.py


    elif word in ["Réglage"]:
        setup_text = """Veuillez saisir le format suivant\
        
Enregistrement. la taille-poids-âge-Sexe (1 homme ou 2 femmes)
* Veuillez utiliser tous les nombres demi-largeur
* Exemple: Inscription. 168-68-24-1
        """
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=setup_text))

    elif 0 <= word.find('Enregistrement.') :
        #Divisez les données reçues par taille, poids, âge et sexe
        #Basez-le_Passer à l'énergie
        personal_data = event.message.text
        personal_data = personal_data.replace("Enregistrement.", "")
        personal_data = personal_data.replace("-", ",")
        personal_data = personal_data.split(',')
        tall = int(personal_data[0])
        weight = int(personal_data[1])
        age = int(personal_data[2])
        sex = int(personal_data[3])
        aim_kcal = base_energy(tall, weight, age, sex)
        #Calculez les calories pour chaque repas
        #Écrire dans la base de données
        profile = line_bot_api.get_profile(event.source.user_id)
        prof_dict = {}
        prof_dict["id"] = profile.user_id
        prof_dict["before_noon"] = create_before(aim_kcal)
        prof_dict["after_noon"] = create_after(aim_kcal)
        conn = sqlite3.connect('database.sqlite3')
        c = conn.cursor()
        c.execute('insert into user(id, before_noon, after_noon) values(:id, :before_noon, :after_noon);', prof_dict)
        conn.commit()
        conn.close()

        line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text="Le réglage est terminé"))

    else:
        line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text="Entrez Lawson ou Seven ou Paramètres"))

if __name__ == "__main__":
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
    app.run()

Traitez les données envoyées par l'utilisateur selon le format, définissez la valeur cible et divisez-la en matin, jour et nuit.

$ heroku login
heroku create <Nom de l'application>

Enregistrez l'application avec heroku

$ git init
$ git add .
$ git commit -m "new commit"
$ git push heroku master

Poussez et terminez.

Convivialité

Je l'ai utilisé moi-même pendant une semaine après avoir été terminé. Comme une impression

Avantages

  1. Étonnamment, de nombreuses salades sont saines (les salades faibles en calories sont facilement sélectionnées par une boucle qui appelle les produits au hasard)
  2. Je mange des choses que je n'achète pas d'habitude, alors je tombe parfois sur des produits qui m'impressionnent
  3. Il y a une sensation de plénitude inattendue 4, ** J'ai perdu 1 kg! !! ** ** IMG_20200202_112624.jpg Dîner d'un jour (volume inattendu)



Inconvénients

  1. Ne convient pas pour économiser (cela coûte 1500-2000 yens par jour) 2, beaucoup en rupture de stock
  2. J'en ai assez de l'utilisation continue (même si je l'utilise sans en faire trop, c'est efficace)

Plan de profit (si un grand dépanneur introduit un service similaire)

1. Effet publicitaire

** Étant donné que le coût d'achat quotidien est de 1 500 yens ou plus, les ventes devraient augmenter d'environ 45 000 yens ou plus par mois avec un utilisateur actif. Si vous avez 100 personnes, vous pouvez vous attendre à plus de 4,5 millions de yens. ** ** De plus, l'effet publicitaire est plus rapide à conduire directement au comportement d'achat que les autres médias. Par exemple, lorsque nous apprenons l'existence d'un nouveau produit sur TV cm, nous avons un certain délai avant de l'acheter. Il est rare que vous voyiez réellement une publicité et que vous l'achetiez immédiatement, et l'effet publicitaire agit sur votre subconscient, ce qui conduit à un comportement d'achat au bout d'un certain temps. Dans ce cas, étant donné que cela a affecté sans le savoir le comportement des clients, le seul moyen de mesurer l'efficacité de la publicité est de déduire de l'augmentation ou de la diminution des ventes. D'un autre côté, avec ce service, on attend fortement des utilisateurs qu'ils effectuent un achat le jour où le menu est reçu, et il est facile pour les développeurs Line de déterminer combien d'utilisateurs actifs sont actuellement. De plus, le coût lui-même est le plus élevé, environ 30 000 yens par mois, ce qui est moins cher que les autres médias. ** En d'autres termes, il a une efficacité publicitaire élevée, un effet immédiat, un pouvoir de saisie et peut être mis en œuvre à faible coût. ** **

2. Bonne compatibilité entre la fonction d'examen et les coupons

Si vous répondez "si vous voulez manger à nouveau", vous pouvez vous attendre à une augmentation du taux de répétition des utilisateurs et à l'acquisition d'évaluations de produits clients si vous ajoutez une fonction pour émettre des bons de réduction pour le lendemain uniquement. Du point de vue de l'utilisateur, on peut obtenir non seulement le mérite de "l'éclaircissage", mais aussi le mérite "d'acheter à bas prix" le lendemain, et le point faible de ce service, "non adapté à l'épargne", peut être couvert dans une certaine mesure. Cela aide également à poursuivre le régime. Du point de vue des entreprises, si le taux de maintien augmente, les ventes augmenteront, et comme les menus sont aléatoires, il y a un grand mérite que des données sur une large gamme de produits puissent être obtenues.

3. Utilité en tant que big data

Les cartes de points pratiques collectent uniquement des données sur le sexe et l'âge des personnes qui ont acheté le produit. En d'autres termes, ce ne sont que les données jusqu'à l'achat. Cependant, l'entreprise ne se termine pas au moment de l'achat. Nous pensons que "ce produit répondra à nos besoins", l'achetons, l'utilisons, faisons une impression et décidons de le répéter. Il est important de collecter des données post-achat afin de créer un mécanisme d'acquisition continue de clients. ** Données de couche d'achat et données d'évaluation de produit pour chaque groupe de clients. ** Le mérite de combiner deux données est très important.

4, exemple d'utilisation

Divisez les produits en quatre groupes à partir des deux données ci-dessus. ① Les ventes sont élevées, </ font> l'évaluation est également high </ font> produits ② Les ventes sont élevées, </ font> l'évaluation est low </ font> produits ③ Les ventes sont faibles, </ font> l'évaluation est high </ font> produits ④ Les ventes sont faibles, </ font> l'évaluation est également low </ font> produits

無題のプレゼンテーション.jpg

La division dans les groupes ci-dessus sera grandement bénéfique en termes de stratégie de développement de produits et de gestion de la distribution. Tout d'abord, en termes de gestion de la distribution, on peut s'attendre à des ventes élevées pour le produit (1) à l'avenir, mais pour (4), il est peu probable que les clients l'achètent, et même s'il est acheté, on ne peut pas s'attendre à des répétitions. ** En arrêtant la production de ④ tôt et en augmentant la production de ①, il est prévu de réduire les déchets dans les magasins et d'améliorer le résultat opérationnel. ** ** Ensuite, en ce qui concerne l'aspect du développement de produit, un grand avantage peut être obtenu en analysant (2) et (3). ② est nuisible. Parce que c'est un produit qui déçoit les attentes de nombreux clients. Beaucoup de gens trouvent intéressant d'acheter, mais ils sont déçus lorsqu'ils rentrent chez eux et mangent. Cependant, il ne fait aucun doute que ** ② est un produit très attractif ** jusqu'à ce que vous l'achetiez, et il y a quelque chose que les clients peuvent obtenir. ** En d'autres termes, le marketing du produit lui-même est susceptible de réussir. ** ③ ne se vend pas maintenant, mais il peut commencer à se vendre avec des rides au fil du temps, ou il peut se vendre en modifiant le design ou le nom. Si l'analyse de (2) est utilisée, il est possible que les ventes augmentent considérablement.

5. Expansion des affaires

Les dépanneurs sont les entreprises qui ont le potentiel de collecter des données sur les achats et les préférences les plus japonais. De plus, étant donné que nous gérons non seulement nos propres produits, mais également les produits d'autres entreprises (grandes entreprises de confiserie, entreprises alimentaires, etc.), nous pourrons peut-être faire plus de profits en vendant des données volumineuses et leurs analyses à ces entreprises. Je pense aussi qu'il serait intéressant d'essayer de produire des produits locaux à partir d'entreprises locales en utilisant le savoir-faire cultivé par l'analyse des données.

Recommended Posts