Créez une application semblable à Linews avec linebot et Rails

Lorsque vous saisissez des actualités, une liste d'articles d'actualité sera envoyée (Une fonction comme la livraison à quelle heure du matin sera implémentée la prochaine fois.)
Cela fait moins de quatre mois que j'ai commencé à travailler en tant que stagiaire ingénieur, mais je voulais être plus sensible à l'actualité technologique. Et j'ai pensé que si je pouvais le recevoir comme du linge de maison, je prendrais l'habitude de lire, alors j'ai décidé de le faire. L'image est comme un journal du matin
Rails 6.0.3.1
ruby 2.6.1
Utiliser WSL avec Surface Pro 6 Déployez l'application elle-même sur heroku
Cette fois, ce n'est pas un article de conférence sur la façon de le faire, donc je vais l'omettre. Cette fois, je me suis inscrit en me référant à l'article suivant.
Cette fois, nous allons gratter les nouvelles nouvelles de TechCrunch et afficher les 10 meilleurs éléments.
Une gemme appelée mécaniser est utilisée pour le grattage. Pour l'utilisation de base de ce joyau, j'ai fait référence à "Comment utiliser la méthode de grattage Rails Mechanize".
Analysez les balises avec les outils de développement de Chrome pour déterminer les pièces à gratter.
En conséquence, nous avons implémenté la méthode pour obtenir le titre, l'image et l'URL de l'article d'actualité comme suit.
  def get_tech_crunch_news
    title_ary = []
    src_ary = []
    href_ary = []
    agent = Mechanize.new
    page = agent.get("https://jp.techcrunch.com/")
    news_contents = page.search('div.block-content')
    news_contents.search('h2.post-title').each do |title|
      title_ary << title.inner_text
      href_ary << title.at('a')['href']
    end
    news_contents.each do |news_content|
      src_ary << news_content.at('img')['data-src']
    end
    return title_ary, src_ary, href_ary
  end
Cette fois, comme contre-mesure contre le Lazy Load de la balise img, nous obtiendrons l'attribut data-src au lieu de l'attribut src. Ceci termine la partie raclage.
Cette fois, nous utiliserons quelque chose appelé flexmessage pour délivrer des messages de type lineNews.
↑ C'est un tel gars
Consultez l'API officielle pour plus de détails.
Ce message flexible peut être facilement créé à l'aide des outils du WEB fournis par ligne.

Vous pouvez ressentir un peu de stress dans l'opération, mais je pense que vous pouvez l'exploiter avec un peu de connaissances en CSS.
Lorsque vous avez terminé, cliquez sur le bouton Afficher en tant que json en haut à droite et copiez et collez Json. Le JSON cette fois est le suivant.
{
  "type": "bubble",
  "size": "giga",
  "header": {
    "type": "box",
    "layout": "vertical",
    "contents": [
      {
        "type": "text",
        "text": "TechCrunch news",
        "size": "xl",
        "weight": "bold"
      }
    ]
  },
  "body": {
    "type": "box",
    "layout": "vertical",
    "contents": [
      {
        "type": "box",
        "layout": "horizontal",
        "margin": "lg",
        "spacing": "sm",
        "contents": [
          {
            "type": "box",
            "layout": "vertical",
            "contents": [
              {
                "type": "box",
                "layout": "vertical",
                "contents": [
                  {
                    "type": "image",
                    "url": "https://scdn.line-apps.com/n/channel_devcenter/img/fx/01_1_cafe.png ",← Ici src
                    "margin": "none",
                    "size": "full",
                    "aspectMode": "cover",
                    "gravity": "top"
                  }
                ],
                "position": "relative",
                "cornerRadius": "12px"
              },
              {
                "type": "box",
                "layout": "vertical",
                "contents": [
                  {
                    "type": "text",
                    "text": "WHILL introduit un système de conduite automatique à la porte d'embarquement en fauteuil roulant électrique à l'aéroport de Haneda",← Titre ici
                    "size": "md",
                    "weight": "bold",
                    "align": "center",
                    "wrap": true,
                    "maxLines": 4,
                    "color": "#ffffff"
                  }
                ],
                "position": "absolute",
                "width": "100%",
                "backgroundColor": "#00bfff80",
                "offsetBottom": "10px"
              }
            ],
            "action": {
              "type": "uri",
              "label": "action",
              "uri": "http://linecorp.com/"← ici href
            },
            "width": "50%",
            "position": "relative"
          },
     ~~~~~~~~~~~~~~~~~~~~~~(Abréviation)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
              "uri": "http://qiita.com/"
            },
            "width": "50%",
            "position": "relative"
          }
        ]
      }
    ]
  }
}
Ensuite, il suffit de mettre les données acquises en grattant cette fois à l'endroit correspondant et la fonction de distribution de nouvelles est pour l'instant terminée.
Jusqu'à présent, si vous tapez "news" dans linebot, vous pouvez extraire 10 nouveaux articles de TechCrunch du haut. La prochaine fois, j'aimerais pouvoir livrer de nouvelles nouvelles tous les matins à 8h00.
Enfin, je vais mettre la source du contrôleur.
linebot_controller.rb
class LinebotController < ApplicationController
  require 'line/bot'
  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_TOKEN"]
    }
  end
  def callback
    body = request.body.read
    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      head :bad_request
    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'].eql?('nouvelles')
            client.reply_message(event['replyToken'], template)
          end
        end
      end
    }
    head :ok
  end
  private
  def get_tech_crunch_news
    title_ary = []
    src_ary = []
    href_ary = []
    agent = Mechanize.new
    page = agent.get("https://jp.techcrunch.com/")
    news_contents = page.search('div.block-content')
    news_contents.search('h2.post-title').each do |title|
      title_ary << title.inner_text
      href_ary << title.at('a')['href']
    end
    news_contents.each do |news_content|
      src_ary << news_content.at('img')['data-src']
    end
    return title_ary, src_ary, href_ary
  end
  def template
    title, src, href = get_tech_crunch_news
    {
      "type": "flex",
      "altText": "this is a flex message",
      "contents":{
        "type": "bubble",
        "size": "giga",
        "header": {
          "type": "box",
          "layout": "vertical",
          "contents": [
            {
              "type": "text",
              "text": "TechCrunch news",
              "size": "xl",
 
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Abréviation
          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
L'URL à laquelle j'ai fait référence lors de cette production est jointe ci-dessous.
Comment utiliser la méthode de grattage Rails Mechanize
Recommended Posts