|
@@ -1,16 +1,17 @@ |
|
|
from datetime import datetime, timedelta |
|
|
|
|
|
import io |
|
|
import io |
|
|
import json |
|
|
import json |
|
|
import time |
|
|
import time |
|
|
import sys |
|
|
import sys |
|
|
|
|
|
from datetime import datetime, timedelta |
|
|
|
|
|
|
|
|
|
|
|
import requests |
|
|
from atproto import Client, models |
|
|
from atproto import Client, models |
|
|
from bs4 import BeautifulSoup |
|
|
from bs4 import BeautifulSoup |
|
|
from requests.exceptions import Timeout |
|
|
from requests.exceptions import Timeout |
|
|
import requests |
|
|
|
|
|
|
|
|
|
|
|
from ai.talk import Talk |
|
|
|
|
|
import account |
|
|
import account |
|
|
|
|
|
import nico |
|
|
|
|
|
from ai.talk import Talk |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def check_notifications ( |
|
|
def check_notifications ( |
|
@@ -90,27 +91,29 @@ def main ( |
|
|
parent = records[0]['strong_ref'], |
|
|
parent = records[0]['strong_ref'], |
|
|
root = records[-1]['strong_ref'])) |
|
|
root = records[-1]['strong_ref'])) |
|
|
|
|
|
|
|
|
for datum in [e for e in get_nico_deerjika () |
|
|
|
|
|
if e['contentId'] not in watched_videos]: |
|
|
|
|
|
watched_videos += [datum['contentId']] |
|
|
|
|
|
|
|
|
|
|
|
uri = f"https://www.nicovideo.jp/watch/{ datum['contentId'] }" |
|
|
|
|
|
(title, description, thumbnail) = get_embed_info (uri) |
|
|
|
|
|
try: |
|
|
|
|
|
upload = client.com.atproto.repo.upload_blob ( |
|
|
|
|
|
io.BytesIO (requests.get (thumbnail, |
|
|
|
|
|
timeout = 60).content)) |
|
|
|
|
|
thumb = upload.blob |
|
|
|
|
|
except Timeout: |
|
|
|
|
|
thumb = None |
|
|
|
|
|
|
|
|
|
|
|
embed_external = models.AppBskyEmbedExternal.Main ( |
|
|
|
|
|
external = models.AppBskyEmbedExternal.External ( |
|
|
|
|
|
title = title, |
|
|
|
|
|
description = description, |
|
|
|
|
|
thumb = upload.blob, |
|
|
|
|
|
uri = uri)) |
|
|
|
|
|
client.post (Talk.main (f""" |
|
|
|
|
|
|
|
|
latest_deerjika = nico.get_latest_deerjika () |
|
|
|
|
|
if latest_deerjika is not None: |
|
|
|
|
|
for datum in [e for e in [latest_deerjika]] |
|
|
|
|
|
if e['contentId'] not in watched_videos]: |
|
|
|
|
|
watched_videos += [datum['contentId']] |
|
|
|
|
|
|
|
|
|
|
|
uri = f"https://www.nicovideo.jp/watch/{ datum['contentId'] }" |
|
|
|
|
|
(title, description, thumbnail) = get_embed_info (uri) |
|
|
|
|
|
try: |
|
|
|
|
|
upload = client.com.atproto.repo.upload_blob ( |
|
|
|
|
|
io.BytesIO (requests.get (thumbnail, |
|
|
|
|
|
timeout = 60).content)) |
|
|
|
|
|
thumb = upload.blob |
|
|
|
|
|
except Timeout: |
|
|
|
|
|
thumb = None |
|
|
|
|
|
|
|
|
|
|
|
embed_external = models.AppBskyEmbedExternal.Main ( |
|
|
|
|
|
external = models.AppBskyEmbedExternal.External ( |
|
|
|
|
|
title = title, |
|
|
|
|
|
description = description, |
|
|
|
|
|
thumb = upload.blob, |
|
|
|
|
|
uri = uri)) |
|
|
|
|
|
client.post (Talk.main (f""" |
|
|
ニコニコに『{ datum['title'] }』という動画がアップされました。 |
|
|
ニコニコに『{ datum['title'] }』という動画がアップされました。 |
|
|
つけられたタグは「{ '」、「'.join (datum['tags']) }」です。 |
|
|
つけられたタグは「{ '」、「'.join (datum['tags']) }」です。 |
|
|
概要には次のように書かれています: |
|
|
概要には次のように書かれています: |
|
@@ -118,7 +121,7 @@ def main ( |
|
|
{ datum['description'] } |
|
|
{ datum['description'] } |
|
|
``` |
|
|
``` |
|
|
このことについて、みんなに告知するとともに、ニジカちゃんの感想を教えてください。 """), |
|
|
このことについて、みんなに告知するとともに、ニジカちゃんの感想を教えてください。 """), |
|
|
embed = embed_external) |
|
|
|
|
|
|
|
|
embed = embed_external) |
|
|
|
|
|
|
|
|
if now.hour == 14 and has_got_snack_time: |
|
|
if now.hour == 14 and has_got_snack_time: |
|
|
has_got_snack_time = False |
|
|
has_got_snack_time = False |
|
@@ -156,42 +159,6 @@ def main ( |
|
|
time.sleep (60) |
|
|
time.sleep (60) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_nico_deerjika (): |
|
|
|
|
|
URL = ('https://snapshot.search.nicovideo.jp/api/v2/snapshot/video' |
|
|
|
|
|
'/contents/search') |
|
|
|
|
|
|
|
|
|
|
|
now = datetime.now () |
|
|
|
|
|
base = now - timedelta (hours = 24) |
|
|
|
|
|
|
|
|
|
|
|
params = { 'q': '伊地知ニジカ', |
|
|
|
|
|
'targets': 'tags', |
|
|
|
|
|
'_sort': '-startTime', |
|
|
|
|
|
'fields': 'contentId,title,description,tags,startTime', |
|
|
|
|
|
'_limit': 20, |
|
|
|
|
|
'jsonFilter': json.dumps ({ 'type': 'or', |
|
|
|
|
|
'filters': [{ |
|
|
|
|
|
'type': 'range', |
|
|
|
|
|
'field': 'startTime', |
|
|
|
|
|
'from': ('%04d-%02d-%02dT%02d:%02d:00+09:00' |
|
|
|
|
|
% (base.year, base.month, base.day, |
|
|
|
|
|
base.hour, base.minute)), |
|
|
|
|
|
'to': ('%04d-%02d-%02dT23:59:59+09:00' |
|
|
|
|
|
% (now.year, now.month, now.day)), |
|
|
|
|
|
'include_lower': True }] }) } |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
|
|
res = requests.get (URL, params = params, timeout = 60).json () |
|
|
|
|
|
except Timeout: |
|
|
|
|
|
return [] |
|
|
|
|
|
|
|
|
|
|
|
data = [] |
|
|
|
|
|
for datum in res['data']: |
|
|
|
|
|
datum['tags'] = datum['tags'].split () |
|
|
|
|
|
data.append (datum) |
|
|
|
|
|
|
|
|
|
|
|
return data |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_embed_info ( |
|
|
def get_embed_info ( |
|
|
url: str |
|
|
url: str |
|
|
) -> (str, str, str): |
|
|
) -> (str, str, str): |
|
|