→コード: v2.2.0 埋め込まれた動画を取得できるように変更 エラー処理などは追い追い wiki文法と衝突する文字のエスケープロジック変更
>Fet-Fe (→コード: v2.1.8 archive.phにリクエストするとき、魚拓対象のurlに含まれる"="にはURIエンコードすべきものとしないものとがあるので、判定ロジックを追加) |
>Fet-Fe (→コード: v2.2.0 埋め込まれた動画を取得できるように変更 エラー処理などは追い追い wiki文法と衝突する文字のエスケープロジック変更) |
||
6行目: | 6行目: | ||
''' | ''' | ||
ver2. | ver2.2.0 2022/12/10恒心 | ||
当コードは恒心停止してしまったhttps://rentry.co/7298gの降臨ショーツイート自動収集スクリプトの復刻改善版です | 当コードは恒心停止してしまったhttps://rentry.co/7298gの降臨ショーツイート自動収集スクリプトの復刻改善版です | ||
75行目: | 75行目: | ||
##記事の文章に使うのはクリアネット | ##記事の文章に使うのはクリアネット | ||
##末尾にスラッシュ必須 | ##末尾にスラッシュ必須 | ||
ARCHIVE_TODAY_STANDARD: Final[str] = 'https://archive. | ARCHIVE_TODAY_STANDARD: Final[str] = 'https://archive.md/' | ||
##twitterのURL | ##twitterのURL | ||
423行目: | 423行目: | ||
media_list.append(f"[[ファイル:(画像の取得ができませんでした)|240px]]") | media_list.append(f"[[ファイル:(画像の取得ができませんでした)|240px]]") | ||
# 動画についてはm3u8で落ちてきて面倒臭いため取得しない | # 動画についてはm3u8で落ちてきて面倒臭いため取得しない | ||
for i, video in enumerate(tweet_media.select('.attachment.video-container video')): | |||
for video in tweet_media.select('.attachment.video-container video'): | |||
media_url: str = unquote(re.search(r'[^\/]+$', video.get('data-url')).group(0)) | media_url: str = unquote(re.search(r'[^\/]+$', video.get('data-url')).group(0)) | ||
tweet_id: str = urljoin(self.TWITTER_URL, re.sub('#[^#]*$', '', tweet.find(class_='tweet-link').get('href'))).split('/')[-1] | |||
media_list.append(f"[[ファイル:{tweet_id}_{i}.mp4]]") | |||
os.system(f"yes N 2>/dev/null | ffmpeg -http_proxy {self.PROXIES['http']} -i \"{urljoin(self.NITTER_INSTANCE, media_url)}\" -c copy {os.path.join(self.MEDIA_DIR, tweet_id)}_{i}.ts &> /dev/null") | |||
os.system(f"yes N 2>/dev/null | ffmpeg -i {os.path.join(self.MEDIA_DIR, tweet_id)}_{i}.ts -acodec copy -vcodec copy {os.path.join(self.MEDIA_DIR, tweet_id)}_{i}.mp4 &> /dev/null") | |||
print(f"{os.path.join(self.MEDIA_DIR, tweet_id)}_{i}.mp4をアップロードしなければない。") | |||
media_txt = '<br>\n' + ' '.join(media_list) | media_txt = '<br>\n' + ' '.join(media_list) | ||
return media_txt | return media_txt | ||
488行目: | 490行目: | ||
print(f"{self.LIMIT_N_TWEETS}件も記録している。もうやめにしませんか。") | print(f"{self.LIMIT_N_TWEETS}件も記録している。もうやめにしませんか。") | ||
self._make_txt() | self._make_txt() | ||
#MediaWiki文法と衝突する文字を無効化する | #MediaWiki文法と衝突する文字を無効化する | ||
511行目: | 495行目: | ||
text = text.replace('\n', '<br>\n') | text = text.replace('\n', '<br>\n') | ||
text = re.sub(r'^ ', ' ', text, flags=re.MULTILINE) | text = re.sub(r'^ ', ' ', text, flags=re.MULTILINE) | ||
text = | text = re.sub(r'^([\*#:;])', r'<nowiki>\1</nowiki>', text, flags=re.MULTILINE) | ||
text = re.sub(r'^----', '<nowiki>----</nowiki>', text, flags=re.MULTILINE) | |||
return text | return text | ||
543行目: | 528行目: | ||
def _archive(self, url: Final[str]) -> str: | def _archive(self, url: Final[str]) -> str: | ||
def encode_query_value_equals(url: str) -> str: | def encode_query_value_equals(url: str) -> str: | ||
query_found = False | query_found: bool = False | ||
in_query_value = False | in_query_value: bool = False | ||
i = 0 | i: int = 0 | ||
for c in url: | for c in url: | ||
if c == '?': | if c == '?': | ||
559行目: | 544行目: | ||
return url | return url | ||
archive_url: str = urljoin(self.ARCHIVE_TODAY_STANDARD, | archive_url: str = urljoin(self.ARCHIVE_TODAY_STANDARD, quote(unquote(url), safe='&=+?%')) ##wikiに載せるとき用URLで失敗するとこのままhttps://archive.ph/https%3A%2F%2Fxxxxxxxxの形で返される | ||
res: Final[Response | None] = self._request(urljoin(self.ARCHIVE_TODAY, | res: Final[Response | None] = self._request(urljoin(self.ARCHIVE_TODAY, quote(unquote(url), safe='&=+?%'))) ##アクセス用URL使って結果を取得 | ||
if res is None : ##魚拓接続失敗時処理 | if res is None : ##魚拓接続失敗時処理 | ||
print(archive_url + 'にアクセス失敗ナリ。出力されるテキストにはそのまま記載されるナリ。') | print(archive_url + 'にアクセス失敗ナリ。出力されるテキストにはそのまま記載されるナリ。') |