toot_bot/setu.py
2021-03-11 10:12:49 +08:00

141 lines
4.4 KiB
Python

import os
import random
import time
from bs4 import BeautifulSoup
import requests
from mastodon import Mastodon
from moviepy.editor import VideoFileClip
from urllib.parse import urlparse
import logging
import traceback
logging.basicConfig(filename='/home/captain/dev/log/setu.log', level=logging.INFO)
logger = logging.getLogger('/home/captain/dev/log/setu.log')
mastodon = Mastodon(
access_token = 'iQHxw2fdVO92q73gg2w9yTpMj0inybgOq5ezR7thffU',
api_base_url = 'https://botsin.space'
)
account_name = '@setu'
# mastodon = Mastodon(
# access_token = 'd357sMhxQ7GoIbxt3qSGr9YbSx1tVVf9sggA2pVOoMA',
# api_base_url = 'https://o3o.ca'
# )
# account_name = '@kedai'
tvdl_url = 'https://tvdl-api.saif.dev/'
def load_id():
id_ = None
with open('/home/captain/dev/setu_dm') as f:
id_ = f.read()
f.close()
return id_
def save_id(id_):
with open('/home/captain/dev/setu_dm', 'wb') as f:
f.write(("%s\n" % id_).encode())
f.close()
def post_mentions():
min_id = load_id()
logger.info('!!! %s get %s', time.asctime(), min_id)
mentions = mastodon.notifications(mentions_only=True, min_id=min_id)
mentions.reverse()
for mention in mentions:
if 'status' not in mention:
continue
soup = BeautifulSoup(mention['status']['content'], 'html.parser')
if not (mention['type'] == 'mention' and mention['status']['visibility'] == 'direct'):
save_id(mention['id'])
continue
if not mention['status']['media_attachments']:
content = soup.get_text().split(account_name)[-1].strip()
media_ids = []
if content.startswith('http'):
logging.info('get url %s', content)
try:
url = urlparse(content)
url_ = url.geturl()
if 'twitter.com' in url_:
data = {
'url': url_,
'ver': 1306
}
r_ = requests.post(tvdl_url, data=data)
if r_.status_code != 200:
raise ValueError
resp_data = r_.json()
url_ = resp_data.get('high', {}).get('downloadURL')
r = requests.get(url_)
mime_type = 'image/jpeg'
url = urlparse(url_)
ext = url.path.split('.')[-1]
if ext.lower() in ['jpg', 'jpeg', 'gif']:
if ext == 'gif':
mime_type = 'image/gif'
toot_resp = mastodon.media_post(r.content, mime_type)
else:
f = open('/home/captain/dev/temp_download_file.%s' % ext, 'wb')
f.write(r.content)
f.close()
mime_type = None
toot_resp = mastodon.media_post('/home/captain/dev/temp_download_file.%s' % ext, mime_type)
except:
continue
if toot_resp.get('id'):
media_ids.append(toot_resp['id'])
mastodon.status_post('🔞', media_ids=media_ids, sensitive=True)
save_id(mention['id'])
continue
media_ids = []
for media in mention['status']['media_attachments']:
mime_type = 'image/jpeg'
if media['type'] == 'video':
resp = requests.get(media['url'])
if resp.status_code != 200:
continue
f = open('/home/captain/dev/temp_video.mp4', 'wb')
f.write(resp.content)
f.close()
try:
toot_resp = mastodon.media_post('/home/captain/dev/temp_video.mp4', mime_type)
except:
try:
clip = VideoFileClip('/home/captain/dev/temp_video.mp4')
clip.write_gif('/home/captain/dev/temp_gif.gif')
mime_type = 'image/gif'
toot_resp = mastodon.media_post('/home/captain/dev/temp_gif.gif', mime_type)
except:
continue
if toot_resp.get('id'):
media_ids.append(toot_resp['id'])
continue
r = requests.get(media['url'])
try:
toot_resp = mastodon.media_post(r.content, mime_type)
except:
continue
if toot_resp.get('id'):
media_ids.append(toot_resp['id'])
soup = BeautifulSoup(mention['status']['content'], 'html.parser')
logger.info('posting %s, %s, %s', mention['id'], soup.get_text(), mention['status']['media_attachments'])
status = soup.get_text().split(account_name)[-1]
if not status:
status = '🔞'
if media_ids:
mastodon.status_post(status, media_ids=media_ids, sensitive=True)
save_id(mention['id'])
while True:
try:
post_mentions()
time.sleep(10)
except Exception as ex:
logger.error(traceback.format_exc())
time.sleep(10)