[PYTHON] Ich habe einen LINE-Bot erstellt, der jeden Tag pünktlich empfohlene Bilder sendet

Einführung

Ich bin ein Fan von Mayu Matsuoka (allgemein bekannt als Mayura) Ich habe einen LINE Bot nur für mich gemacht, nur für mich.

Nach ca. 5 Jahren als Fan

→ Suchen Sie auf der Twitter-Timeline nach Tweets zu Mayu Matsuoka → Speichern Sie Bilder und Videos von Mayu Matsuoka

Ich mag diese Arbeit nicht mehr so sehr wie früher und bin selbst Mitglied der Gesellschaft, sodass ich nicht jeden Tag Zeit habe, auf Twitter zu surfen.

** Lass uns alles automatisieren! !! ** **.

Suchen Sie also als ersten Schritt nach Tweets mit Bildern und Videos, die kürzlich auf Twitter beliebt waren, rufen Sie die Bild-URL ab und senden Sie sie jeden Tag pünktlich mit LINE Bot! !! !! !!

Bitte fügen Sie Freunde hinzu, wenn Sie möchten.

<img src = "https://scdn.line-apps.com/n/line_add_friends/btn/ja.png " alt = "Freund hinzufügen" Höhe = "36" border = "0">

L.png

Die Erklärung zur Verwendung der Twitter-API und zur Registrierung von LINE-Entwicklern wird hier weggelassen.

Tweet-Suche, Bild- / Videoaufnahme mit Tweepy

Twitter-Entwicklerseite https://developer.twitter.com/en/portal/dashboard

tweepy offizielle Dokumentation http://docs.tweepy.org/en/latest/

Festlegen von Umgebungsvariablen bei Verwendung von tweepy

Die Umgebungsvariablen werden in der Yaml-Datei im Ordner env beschrieben.

search_tweets.py


import os
import tweepy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

#Satz von Umgebungsvariablen
consumer_key = os.getenv('TWITTER_CONSUMER_KEY')
consumer_secret = os.getenv('TWITTER_CONSUMER_SECRET')
access_token = os.getenv('TWITTER_ACCESS_TOKEN')
access_token_secret = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')
bearer_token = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')


#auf Twitter#Funktion zum Suchen nach Bildern von Mayu Matsuoka und Abrufen der URL
def search_tweets():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

env/stg.yml


STAGE: stg
LINE_ACCESS_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
USER_ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_CONSUMER_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_CONSUMER_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_BEAR_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_ACCESS_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_ACCESS_TOKEN_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TZ: Asia/Tokyo

Tweet-Suche und Erfassung von Bildern / Videos

search_tweets.py


    #Holen Sie sich das gestrige Datum
    yesterday = datetime.strftime(datetime.today() - relativedelta(days=1), f"%Y-%m-%d")
    #Twitter Suchwort
    q = f'#Mayu Matsuoka ODER Mayu Matsuoka-Matsuoka Mayu-ähnlicher Filter:media exclude:retweets min_faves:10 since:{yesterday} min_retweets:2'
    #Suche
    cric_tweet = tweepy.Cursor(
        api.search, q=q, 
        tweet_mode='extended', #Holen Sie sich alle ausgelassenen Tweets
        include_entities=True).items(20) #Holen Sie sich alle ausgelassenen Links

    #Bild
    contents = []

    for tweet in cric_tweet:
        print(tweet.full_text)
        try:
            #Ein Array, das die URLs von Bildern und Videos in Tweets speichert
            media = tweet.extended_entities['media']
            print(media)
            for m in media:
                print(m)
                #Bild-URL des Vorschaubildschirms erforderlich, wenn mit LINE Bot gesendet wird
                preview = m['media_url_https']
                #Für Video
                if m['type'] == 'video':
                    #Beim Abrufen der Video-URL Inhalt_Typ ist Video/Wenn es sich nicht um mp4 handelt, wird das Video beim Senden mit LINE Bot nicht abgespielt.
                    #Außerdem wollte ich es irgendwie in eine Zeile schreiben, also habe ich die Einschlussnotation gewaltsam verwendet und schließlich[0]Ich habe die URL in.
                    origin = [variant['url'] for variant in m['video_info']
                              ['variants'] if variant['content_type'] == 'video/mp4'][0]
                #Für Bilder
                else:
                    #URL des Inhaltsbildes, das beim Klicken auf das Vorschaubild angezeigt wird
                    origin = m['media_url_https']

                #Ordnen Sie es beim Senden mit der LINE Bot Messaging-API in der erforderlichen Form an.
                content = {'preview': preview,
                           'origin': origin, 'type': m['type']}
                contents.append(content)

            print('--------------------------------------------')
        except:
            print('noUrl')
            print('--------------------------------------------')
    return contents

Ich habe einen Artikel darüber geschrieben, wann ich von diesem Prozess abhängig war, also verpassen Sie ihn bitte nicht ↓

Eine Geschichte, die ich süchtig danach war, eine Video-URL mit Tweepy zu bekommen https://qiita.com/soma_sekimoto/items/65c664f00573284b0b74

Senden Sie eine Nachricht von LINE Bot

LINE Bot Offizielle Referenz https://developers.line.me/ja/docs/messaging-api/getting-started/

LINE Bot SDK Github https://github.com/line/line-bot-sdk-python

send_media.py


# -*- coding:utf-8 -*-
import logging
from linebot import LineBotApi

from linebot.exceptions import LineBotApiError
from linebot.models import (
    TextSendMessage, ImageSendMessage, VideoSendMessage
)

import requests
import os


import search_tweets

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def send_media(event, context):

    logger.info("Authentication OK.")
    #Erstellen Sie ein LineBot-API-Objekt
    token = os.getenv('LINE_ACCESS_TOKEN')

    line_bot_api = LineBotApi(token)

    try:
        #Holen Sie sich mit der Twitter-Suche eine Reihe von Bild- und Video-URL-Objekten
        all_media_list = search_tweets.search_tweets()
        print('all_media_list')
        print(all_media_list)

        messages = []

        #Transformieren Sie das durch Tweepy für LINE Bot erhaltene Array weiter
        for media in all_media_list:
            item = VideoSendMessage(
                original_content_url=media['origin'], preview_image_url=media['preview']) if media['type'] == 'video' else ImageSendMessage(
                original_content_url=media['origin'], preview_image_url=media['preview'])

            messages.append(item)

        print('messages')
        print(messages)
        #Stellen Sie sicher, dass Sie Nachrichten nur an sich selbst senden, außer in einer Produktionsumgebung.
        if os.getenv('STAGE') == 'prod':
            #Aus irgendeinem Grund kann ich nur 4 Bilder gleichzeitig senden, daher werde ich sie in zwei Teilen senden. (Trotzdem ist es immer noch ein Rätsel, dass insgesamt nur 7 Blätter gesendet werden können.)
            line_bot_api.broadcast(
                messages[0:3]
            )
            line_bot_api.broadcast(
                messages[4:8]
            )
        else:
            user_id = os.getenv('USER_ID')
            line_bot_api.push_message(
                user_id,
                messages[0:3]
            )
            line_bot_api.push_message(
                user_id,
                messages[4:8]
            )

    except LineBotApiError as e:
        print(e.status_code)
        print(e.error.message)
        print(e.error.details)

    return {"stautsCode": 200, "body": "OK"}


if __name__ == '__main__':
    send_media(None, None)

Bereitstellung mit Serverless Framework

requirements.py


import os
import sys


requirements = os.path.join(
    os.path.split(__file__)[0],
    '.requirements',
)

if requirements not in sys.path:
    sys.path.append(requirements)

requirements.txt


requests 
print_function
line-bot-sdk #Modul, das das LINE Bot SDK in Python verwenden kann
tweepy #Modul, das die Twitter-API in Python verwenden kann

serverless.yml


service: mayu-delivery

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1
  stage: stg
  deploymentBucket: sls-deps #Angeben eines Bereitstellungs-Buckets
  environment: ${file(./env/${opt:stage, self:provider.stage}.yml)}

plugins:
  - serverless-python-requirements

custom:
  scheduleEnabled:
    prod: true
    stg: false
    local: false

functions:
  send_media:
    handler: media_deliver.send_media
    timeout: 300
    events:
      - http:
          path: linebot/send_media
          method: post
      - schedule:
          rate: cron(30 3 * * ? *)
          enabled: ${self:custom.scheduleEnabled.${opt:stage, self:provider.stage}}
sls deploy
endpoints:
  POST - https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/prod/linebot/send_media
functions:
  send_media: mayu-delivery-prod-send_media

Vergessen Sie nicht, die URL der oben genannten Endpunkte auf die Seite des LINE-Bots zu kopieren.

スクリーンショット 2020-10-11 15.33.53.png

Abschlusscode

search_tweets.py


import os
import tweepy
from datetime import datetime, date, timedelta
from dateutil.relativedelta import relativedelta

consumer_key = os.getenv('TWITTER_CONSUMER_KEY')
consumer_secret = os.getenv('TWITTER_CONSUMER_SECRET')
access_token = os.getenv('TWITTER_ACCESS_TOKEN')
access_token_secret = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')
bearer_token = os.getenv('TWITTER_ACCESS_TOKEN_SECRET')


#auf Twitter#Suchen Sie das Bild von Mayu Matsuoka und erhalten Sie die URL
def search_tweets():
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    yesterday = datetime.strftime(
        datetime.today() - relativedelta(days=1), f"%Y-%m-%d")

    q = f'#Mayu Matsuoka ODER Mayu Matsuoka-Matsuoka Mayu-ähnlicher Filter:media exclude:retweets min_faves:10 since:{yesterday} min_retweets:2'

    cric_tweet = tweepy.Cursor(
        api.search, q=q, tweet_mode='extended', include_entities=True).items(20)

    contents = []
    for tweet in cric_tweet:
        print(tweet.full_text)
        try:
            media = tweet.extended_entities['media']
            print(media)
            for m in media:
                print(m)
                preview = m['media_url_https']
                if m['type'] == 'video':
                    origin = [variant['url'] for variant in m['video_info']
                              ['variants'] if variant['content_type'] == 'video/mp4'][0]
                else:
                    origin = m['media_url_https']

                content = {'preview': preview,
                           'origin': origin, 'type': m['type']}
                contents.append(content)

            print('--------------------------------------------')
        except:
            print('noUrl')
            print('--------------------------------------------')
    return contents


if __name__ == "__main__":
    search_tweets()

media_deliver.py


# -*- coding:utf-8 -*-
import logging
from linebot import LineBotApi

from linebot.exceptions import LineBotApiError
from linebot.models import (
    TextSendMessage, ImageSendMessage, VideoSendMessage
)

import requests
import os


import search_tweets

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def send_media(event, context):

    logger.info("Authentication OK.")
    #Erstellen Sie ein LineBot-API-Objekt
    token = os.getenv('LINE_ACCESS_TOKEN')

    line_bot_api = LineBotApi(token)

    try:
        #Holen Sie sich mit der Twitter-Suche eine Reihe von Bild- und Video-URL-Objekten
        all_media_list = search_tweets.search_tweets()
        print('all_media_list')
        print(all_media_list)

        messages = []

        for media in all_media_list:
            item = VideoSendMessage(
                original_content_url=media['origin'], preview_image_url=media['preview']) if media['type'] == 'video' else ImageSendMessage(
                original_content_url=media['origin'], preview_image_url=media['preview'])

            messages.append(item)

        print('messages')
        print(messages)
        if os.getenv('STAGE') == 'prod':
            line_bot_api.broadcast(
                messages[0:3]
            )
            line_bot_api.broadcast(
                messages[4:8]
            )
        else:
            user_id = os.getenv('USER_ID')
            line_bot_api.push_message(
                user_id,
                messages[0:3]
            )
            line_bot_api.push_message(
                user_id,
                messages[4:8]
            )

    except LineBotApiError as e:
        print(e.status_code)
        print(e.error.message)
        print(e.error.details)

    return {"stautsCode": 200, "body": "OK"}


if __name__ == '__main__':
    send_media(None, None)

requirements.py


import os
import sys


requirements = os.path.join(
    os.path.split(__file__)[0],
    '.requirements',
)

if requirements not in sys.path:
    sys.path.append(requirements)

requirements.txt


requests
line-bot-sdk
print_function
tweepy

serverless.yml


service: mayu-delivery

provider:
  name: aws
  runtime: python3.7
  region: ap-northeast-1
  stage: stg
  deploymentBucket: sls-deps
  environment: ${file(./env/${opt:stage, self:provider.stage}.yml)}

plugins:
  - serverless-python-requirements

custom:
  scheduleEnabled:
    prod: true
    stg: false
    local: false

functions:
  send_media:
    handler: media_deliver.send_media
    timeout: 300
    events:
      - http:
          path: linebot/send_media
          method: post
      - schedule:
          rate: cron(30 3 * * ? *)
          enabled: ${self:custom.scheduleEnabled.${opt:stage, self:provider.stage}}

env/stg.yml


STAGE: stg
LINE_ACCESS_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
LINE_CHANNEL_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
USER_ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_CONSUMER_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_CONSUMER_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_BEAR_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_ACCESS_TOKEN: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWITTER_ACCESS_TOKEN_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TZ: Asia/Tokyo

abschließend

LINE Bot ist für mich immer noch unbefriedigend, aber ich werde die Funktionen weiter verbessern und hinzufügen.

Wenn Sie etwas falsches oder ähnliches finden, hinterlassen Sie bitte einen Kommentar! !!

Und bitte Freunde hinzufügen! !! !! !!

<img src = "https://scdn.line-apps.com/n/line_add_friends/btn/ja.png " alt = "Freund hinzufügen" Höhe = "36" border = "0">

L.png

Referenzartikel

https://blog.serverworks.co.jp/sls-line-beginner

Recommended Posts

Ich habe einen LINE-Bot erstellt, der jeden Tag pünktlich empfohlene Bilder sendet
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
[Python] Ich habe einen Bot erstellt, der mir die aktuelle Temperatur anzeigt, wenn ich einen Ortsnamen in LINE eingebe
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
[Python] Ich habe einen LINE-Bot erstellt, der Gesichter erkennt und Mosaikverarbeitungen durchführt.
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Ich habe einen Zwietrachtbot gemacht
Ich habe einen neuronalen Netzwerkgenerator erstellt, der auf FPGA läuft
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe einen Twitter-Bot erstellt, der das von #PokemonGO gefangene Pokemon murmelt
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Da ich zu verschiedenen Zeiten anfing zu arbeiten, machte ich einen Bot, der mir die Zeit sagt, die Arbeit zu verlassen
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich habe eine Chrome-Erweiterung erstellt, die ein Diagramm auf der Amedas-Seite anzeigt
Ein Memo, auf das ich gestoßen bin, als ich ein Zitat RT auf Twitter Bot gemacht habe
Ich habe einen SlackBot erstellt, der mich jede Woche über Informationen zum AtCoder-Wettbewerb informiert
Ich habe einen Linebot erstellt, der mich über nahegelegene Evakuierungsstellen auf AWS informiert
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Lassen Sie einen Papagei LINE Bot mit AWS Cloud9 zurückgeben
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
[Valentine Spezialprojekt] Ich habe eine LINE-Kompatibilitätsdiagnose gestellt!
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda
Ein Skript, das viele Websites an Personen sendet, die sie regelmäßig täglich besuchen
〇✕ Ich habe ein Spiel gemacht
Eine Geschichte, die stolperte, als ich mit Transformer einen Chat-Chat-Bot erstellte
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
unixtime ← → Ich habe versucht, eine Klasse zu erstellen, die die Datums- / Uhrzeitkonvertierung problemlos durchführt
Ich habe eine verdammte App gemacht, mit der du nicht überspringen kannst
Bis Django etwas mit einem Linienbot zurückgibt!
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich habe ein VGG16-Modell mit TensorFlow gemacht (unterwegs)
Ich habe ein Anomalieerkennungsmodell erstellt, das unter iOS funktioniert
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
Als ich einen Discord Bot gemacht habe, haben meine Klassenkameraden meinen Computer zerstört
Ich habe ein Plug-In erstellt, das "Daruma-san Fell" mit Minecraft ausführen kann
Ich habe Chatbot mit LINE Messaging API und Python erstellt
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Eine Geschichte, bei der es mir schwer fiel, Grafiken mit matplotlib anzuzeigen
Ich habe mit Heroku + Flask + PostgreSQL (Heroku Postgres) einen LINE-Bot erstellt, der mir den Typ und die Stärke von Pokemon in der Garal-Region angibt.