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.
Die Erklärung zur Verwendung der Twitter-API und zur Registrierung von LINE-Entwicklern wird hier weggelassen.
Twitter-Entwicklerseite https://developer.twitter.com/en/portal/dashboard
tweepy offizielle Dokumentation http://docs.tweepy.org/en/latest/
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
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
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)
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.
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
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! !! !! !!
https://blog.serverworks.co.jp/sls-line-beginner
Recommended Posts