2022-10-02 16:34:28 +00:00
|
|
|
import contextlib
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from defs.glover import consumer_key, consumer_secret, access_token_key, access_token_secret
|
|
|
|
|
|
|
|
import twitter
|
|
|
|
|
|
|
|
from pyrogram.enums import ParseMode
|
2022-10-03 06:13:37 +00:00
|
|
|
from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton, InputMediaPhoto, InputMediaVideo, \
|
|
|
|
InputMediaDocument, InputMediaAnimation
|
2022-10-02 16:34:28 +00:00
|
|
|
|
|
|
|
twitter_api = twitter.Api(consumer_key=consumer_key,
|
|
|
|
consumer_secret=consumer_secret,
|
|
|
|
access_token_key=access_token_key,
|
|
|
|
access_token_secret=access_token_secret,
|
2022-10-03 06:13:37 +00:00
|
|
|
tweet_mode='extended',
|
|
|
|
timeout=30)
|
2022-10-02 16:34:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
def twitter_link(status_id, qid, uid):
|
|
|
|
if qid:
|
|
|
|
return InlineKeyboardMarkup([[
|
|
|
|
InlineKeyboardButton(text="Source", url=f"https://twitter.com/{uid}/status/{status_id}"),
|
|
|
|
InlineKeyboardButton(text="RSource", url=f"https://twitter.com/{qid}"),
|
|
|
|
InlineKeyboardButton(text="Author", url=f"https://twitter.com/{uid}")]])
|
|
|
|
else:
|
|
|
|
return InlineKeyboardMarkup([[
|
|
|
|
InlineKeyboardButton(text="Source", url=f"https://twitter.com/{uid}/status/{status_id}"),
|
|
|
|
InlineKeyboardButton(text="Author", url=f"https://twitter.com/{uid}")]])
|
|
|
|
|
|
|
|
|
|
|
|
def twitter_user_link(user_username, status_link):
|
2022-10-03 06:13:37 +00:00
|
|
|
return InlineKeyboardMarkup([[InlineKeyboardButton(text="Author", url=f"https://twitter.com/{user_username}"),
|
|
|
|
InlineKeyboardButton(text="Status", url=status_link)]]) if status_link else \
|
|
|
|
InlineKeyboardMarkup([[InlineKeyboardButton(text="Author", url=f"https://twitter.com/{user_username}")]])
|
2022-10-02 16:34:28 +00:00
|
|
|
|
|
|
|
|
2022-10-03 06:13:37 +00:00
|
|
|
def twitter_media(text, media_model, media_list, static: bool = False):
|
2022-10-02 16:34:28 +00:00
|
|
|
media_lists = []
|
2022-10-03 06:13:37 +00:00
|
|
|
for ff in range(len(media_model)):
|
|
|
|
if static:
|
|
|
|
media_lists.append(InputMediaDocument(
|
|
|
|
media_list[ff],
|
|
|
|
caption=text if ff == 0 else None,
|
|
|
|
parse_mode=ParseMode.HTML
|
|
|
|
))
|
|
|
|
elif media_model[ff] == 'photo':
|
2022-10-02 16:34:28 +00:00
|
|
|
media_lists.append(InputMediaPhoto(
|
|
|
|
media_list[ff],
|
|
|
|
caption=text if ff == 0 else None,
|
|
|
|
parse_mode=ParseMode.HTML
|
|
|
|
))
|
2022-10-03 06:13:37 +00:00
|
|
|
elif media_model[ff] == 'gif':
|
|
|
|
media_lists.append(InputMediaAnimation(
|
|
|
|
media_list[ff],
|
|
|
|
caption=text if ff == 0 else None,
|
|
|
|
parse_mode=ParseMode.HTML
|
|
|
|
))
|
2022-10-02 16:34:28 +00:00
|
|
|
else:
|
|
|
|
media_lists.append(
|
|
|
|
InputMediaVideo(
|
|
|
|
media_list[ff],
|
|
|
|
caption=text if ff == 0 else None,
|
|
|
|
parse_mode=ParseMode.HTML
|
|
|
|
))
|
|
|
|
return media_lists
|
|
|
|
|
|
|
|
|
|
|
|
def get_twitter_time(date: str) -> str:
|
|
|
|
try:
|
|
|
|
date = datetime.strptime(date, "%a %b %d %H:%M:%S +0000 %Y") + timedelta(hours=8)
|
|
|
|
return date.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
except Exception:
|
|
|
|
return date
|
|
|
|
|
|
|
|
|
|
|
|
def get_twitter_user(url_json):
|
|
|
|
user_name = url_json.name
|
|
|
|
user_username = url_json.screen_name
|
|
|
|
status = ''
|
|
|
|
status_link = None
|
2022-10-03 06:13:37 +00:00
|
|
|
verified = '💎' if url_json.verified else ''
|
|
|
|
protected = '🔒' if url_json.protected else ''
|
2022-10-02 16:34:28 +00:00
|
|
|
if url_json.status:
|
|
|
|
status_link = f"https://twitter.com/{user_username}/{url_json.status.id_str}"
|
|
|
|
status = f'🆕 New Status: <a href="{status_link}">{get_twitter_time(url_json.status.created_at)}</a>\n'
|
|
|
|
text = f'<b>Twitter User Info</b>\n\n' \
|
|
|
|
f'Name: {verified}{protected}<code>{user_name}</code>\n' \
|
|
|
|
f'Username: <a href="https://twitter.com/{user_username}">@{user_username}</a>\n' \
|
|
|
|
f'Bio: <code>{url_json.description}</code>\n' \
|
|
|
|
f'Joined: <code>{get_twitter_time(url_json.created_at)}</code>\n' \
|
|
|
|
f'{status}' \
|
|
|
|
f'📤 {url_json.statuses_count} ❤️{url_json.favourites_count} ' \
|
|
|
|
f'粉丝 {url_json.followers_count} 关注 {url_json.friends_count}'
|
|
|
|
return text, user_username, status_link
|
|
|
|
|
|
|
|
|
|
|
|
def get_twitter_status(url_json):
|
|
|
|
created_at = get_twitter_time(url_json.created_at)
|
|
|
|
favorite_count = url_json.favorite_count if hasattr(url_json, 'favorite_count') else 0
|
|
|
|
retweet_count = url_json.retweet_count if hasattr(url_json, 'retweet_count') else 0
|
|
|
|
user_name = url_json.user.name
|
|
|
|
user_username = url_json.user.screen_name
|
|
|
|
text = url_json.full_text if hasattr(url_json, 'full_text') else '暂 无 内 容'
|
|
|
|
text = f'<code>{text}</code>'
|
|
|
|
verified = ''
|
|
|
|
protected = ''
|
|
|
|
if url_json.user.verified:
|
|
|
|
verified = '💎'
|
|
|
|
if url_json.user.protected:
|
|
|
|
protected = '🔒'
|
|
|
|
user_text = f'{verified}{protected}<a href="https://twitter.com/{user_username}">{user_name}</a> 发表于 {created_at}' \
|
|
|
|
f'\n👍 {favorite_count} 🔁 {retweet_count}'
|
|
|
|
media_model = []
|
|
|
|
media_list = []
|
|
|
|
media_alt_list = []
|
|
|
|
with contextlib.suppress(Exception):
|
|
|
|
media_info = url_json.media
|
|
|
|
for i in media_info:
|
2022-10-03 06:28:27 +00:00
|
|
|
media_url = i.url if hasattr(i, 'url') else None
|
|
|
|
if media_url:
|
|
|
|
text = text.replace(media_url, '')
|
2022-10-02 16:34:28 +00:00
|
|
|
if i.type == 'photo':
|
|
|
|
media_model.append('photo')
|
|
|
|
media_list.append(i.media_url_https)
|
|
|
|
elif i.type == 'animated_gif':
|
|
|
|
media_model.append('gif')
|
|
|
|
media_list.append(i.video_info['variants'][0]['url'])
|
|
|
|
else:
|
|
|
|
media_model.append('video')
|
2022-10-02 17:30:20 +00:00
|
|
|
for f in i.video_info['variants']:
|
|
|
|
if f['content_type'] == 'video/mp4':
|
|
|
|
media_list.append(f['url'])
|
|
|
|
break
|
2022-10-02 16:34:28 +00:00
|
|
|
try:
|
|
|
|
media_alt_list.append(i.ext_alt_text)
|
|
|
|
except:
|
|
|
|
media_alt_list.append('')
|
|
|
|
quoted_status = False
|
|
|
|
with contextlib.suppress(Exception):
|
|
|
|
quoted = url_json.quoted_status
|
|
|
|
quoted_status = quoted.user.screen_name + '/status/' + url_json.quoted_status_id_str
|
|
|
|
quoted_created_at = get_twitter_time(quoted.created_at)
|
|
|
|
quoted_favorite_count = quoted.favorite_count if hasattr(quoted, 'favorite_count') else 0
|
|
|
|
quoted_retweet_count = quoted.retweet_count if hasattr(quoted, 'retweet_count') else 0
|
|
|
|
quoted_user_name = quoted.user.name
|
|
|
|
quoted_user_username = quoted.user.screen_name
|
|
|
|
quoted_text = quoted.full_text if hasattr(quoted, 'full_text') else '暂 无 内 容'
|
|
|
|
text += f'\n\n> <code>{quoted_text}</code>'
|
|
|
|
quoted_verified = ''
|
|
|
|
quoted_protected = ''
|
|
|
|
if quoted.user.verified:
|
|
|
|
quoted_verified = '💎'
|
|
|
|
if quoted.user.protected:
|
|
|
|
quoted_protected = '🔒'
|
|
|
|
user_text += f'\n> {quoted_verified}{quoted_protected}<a href="https://twitter.com/{quoted_user_username}">' \
|
|
|
|
f'{quoted_user_name}</a> 发表于 {quoted_created_at}' \
|
|
|
|
f'\n👍 {quoted_favorite_count} 🔁 {quoted_retweet_count}'
|
|
|
|
with contextlib.suppress(Exception):
|
|
|
|
quoted_media_info = quoted.media
|
|
|
|
for i in quoted_media_info:
|
2022-10-03 06:28:27 +00:00
|
|
|
media_url = i.url if hasattr(i, 'url') else None
|
|
|
|
if media_url:
|
|
|
|
text = text.replace(media_url, '')
|
2022-10-02 16:34:28 +00:00
|
|
|
if i.type == 'photo':
|
|
|
|
media_model.append('photo')
|
|
|
|
media_list.append(i.media_url_https)
|
|
|
|
elif i.type == 'animated_gif':
|
|
|
|
media_model.append('gif')
|
|
|
|
media_list.append(i.video_info['variants'][0]['url'])
|
|
|
|
else:
|
|
|
|
media_model.append('video')
|
|
|
|
media_list.append(i.video_info['variants'][0]['url'])
|
|
|
|
try:
|
|
|
|
media_alt_list.append(i.ext_alt_text)
|
|
|
|
except:
|
|
|
|
media_alt_list.append('')
|
|
|
|
return text, user_text, media_model, media_list, quoted_status
|