5kg 뚱뚱해서 잘 생긴 사람이 다이어트를 응원해주는 Line bot 만들려고 한 이야기

빌어 먹을 앱 Advent Calendar 2019 가 버즈 하고 있는 것을 보고, 약 2년전에 만들려고 한 빌어 먹을 설계☆빌어 먹을 어플을 생각해냈다. . .

어떤 앱



꽃미남(가정)에게 「목표 체중」과 「오늘의 체중」을 가르쳐, 그 차분으로부터 매도되거나 칭찬받는 LineBot.


(실제 체중이 아닙니다)

2년 전의 나



와이 「장난감도 오세치도 맛있다. 귤도 뷔페. 행복하다...」
(오랜만에 체중계 타기)
와이 「우와! 5kg 살찐!!!!!!(울음)」
와이 「마른다. 어떻게 하면 좋겠어. 미남에게 꾸짖으면 마른다.」
와이 「....」
와이 「그런가, 매도해 주는 미남 싫어하면 만들면 좋은 것인가(뇌사)」

사용한 기술


  • Messaging API (LINE)
  • ruby ​​on rails 5.2.3
  • Heroku

  • 아마 도움이 되었던 기사


  • 지금은 Rails5+line-bot-sdk-ruby+Heroku로 LineBot 작성해 보면, 여러가지 막혔으므로 정리했습니다.

  • 지금 나



    우선, Line Bot 자체는 찾지 못했기 때문에, 코드만 잘 보자...
    응? 이게 뭐야.....
    빌어 먹을 앱 이전에 빌어 먹을 디자인이야 !!!! (큰 소리)

    【빌어 먹을 포인트 1】 내 목표 체중은 이즈코에 ...



    우선 데이터의 구조를 살펴보자...
    음...? app/models 안에 아무것도 쓰지 않았다. 물론 db 안에 아무것도 없다 ...

    내 목표 체중은 이즈코에게 ...

    클래스 변수에 저장되었습니다.



    이 앱에서는 linebot_controller.rb 밖에 대부분 코드가 쓰지 않고, 거기에 모든 처리가 쓰여 있었다.

    linebot_controller.rb
    class LinebotController < ApplicationController
      require "line/bot"  # gem "line-bot-api"
    
      # callbackアクションのCSRFトークン認証を無効
      protect_from_forgery :except => [:callback]
    
      def client
        @client ||= Line::Bot::Client.new { |config|
          config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
          config.channel_token = ENV["LINE_CHANNEL_ACCESS_TOKEN"]
        }
      end
    
      def callback
        body = request.body.read
        signature = request.env["HTTP_X_LINE_SIGNATURE"]
        unless client.validate_signature(body, signature)
          error 400 do "Bad Request" end
        end
    
        events = client.parse_events_from(body)
    
        ・・・
    
        events.each { |event|
          case event
          when Line::Bot::Event::Message
            case event.type
            when Line::Bot::Event::MessageType::Text
    
              if event.message["text"].match(/設定/)
                if t = event.message["text"].match(/([1-9][0-9]{0,2}|0)(\.[0-9])?/)
                  @@targetWeight =  t[0].to_f
                  ・・・
                end
              elsif ・・・
               ・・・
              end
              client.reply_message(event["replyToken"], message)
            end
          end
        }
      end
    end
    

    그래, 철저히 볼거리 가득.

    Messaging API의 요청 본문에는 destination (봇의 사용자 ID)와 events (사용자가 발화)가 저장되어 있으며 events 안에는 아래와 같은 json 객체가 있습니다.
    {
      "replyToken": "",
      "type": "message",
      "mode": "active",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "..."
      },
      "message": {
        "id": "325708",
        "type": "text",
        "text": "目標体重を50kgに設定して"
      }
    }
    

    사용자를 확인하는 것은 매우 간단합니다.

    그런데 사용자별 데이터를 관리하지 않고 클래스 변수로 목표 체중을 관리하고 있다.
    즉, 이 목표 체중은 전 유저 공통으로 재기록 자유로운 상태가 되어 있었던 것이다.
    자신의 목표 체중, 둥근 알 수 있습니다. . . .

    그럴까. 모두의 미남(가)이 되는 것이 싫었던 것일까.

    【빌어 먹을 포인트 2】 성버릇.yml



    DB가 없지만 미남은 대사를 돌려준다.
    게다가 목표 체중에 가까워지면 상냥해진다.
    이것이 어떻게 작동하는지 ...라고 탐구하면 ...


    ※ 더 이상 보여드릴 수 없습니다

    꽃미남(임시)에게 말하고 싶은 대사가 제대로 쓰여 있다 性癖.yml 가 발굴되었습니다.
    전부 스스로 나열했는지... 아프다, 자신.

    또한 yaml도 절묘하게 읽기 어렵다.
    중첩된 배열이 어긋나---와 달라지고 있어, voice["message"][差分][乱数] 로 취해 온다고 느낀다.
    배열 할 필요가 없었던 부분까지 배열 ...

    linebot_controller.rb
    # ymlファイル読み込み
    voice = YAML.load_file("#{Rails.root}/config/project.yml")
    
    # diffは目標体重と現在の体重の差分
    message_length = voice["message"][diff].length - 1
    diet_message = voice["message"][diff][rand(message_length)]
    
    message = {
      type: "text",
      text: "今日の体重は#{weight}kgで、目標体重の#{@@target}まであと#{sprintf("%.1f", diff)}kg減か!#{diet_message}"
    }
    

    【빌어 먹을 포인트 3】 와이 “오늘은 23세의 생일! 50kg이었다! 」 꽃미남(가정) 「오늘의 체중은 23kg」



    message에 숫자가 있으면, 반드시 최초로 나오는 숫자를 체중이라고 취급하는 처리가 걸려 있기 때문에, 꽃미남(가정)과 원활한 대화를 전혀 할 수 없는 사양.
    쓰는 방법도 철저히 볼거리 가득 ...
    if myWeight = event.message["text"].match(/([1-9][0-9]{0,2}|0)(\.[0-9])?/)
      myWeight = myWeight[0].to_f #やばい
     # 果てしなく痛い処理の連続
    end
    

    사실



    Q. 이 bot을 잡았습니까?
    A. 사용하지 않습니다. 성버릇.yml을 쓰고 있을 때 깨어났습니다.

    Q. 마른거야?
    A. 전혀 마르지 않았습니다.

    사이고에게



    엄청난 기사를 끝까지 읽어 주셔서 감사합니다.
    평소에는 상당히 성실하게 기사를 쓰고 있으므로, 좋으면 읽어 주세요.
  • 【Nuxt.js】create-nuxt-app의 추천 ~ create-nuxt-app의 질문에 지고 싶지 않은 당신에게 ~
  • 모두의 나의 흐름 FLOCS를 정리해 보았다.

  • 덧붙여서, 다이어트에 제일 효력 있던 것은, 좋아하는 사람에게 말해진 「육 경단」의 일.
    마른다.

    좋은 웹페이지 즐겨찾기