→コード: v4.1.2
>Fet-Fe (→コード: v4.1.1 --search-unarchivedでリツイートを除く処理を追加) |
>Fet-Fe (→コード: v4.1.2) |
||
7行目: | 7行目: | ||
"""Twitter自動収集スクリプト | """Twitter自動収集スクリプト | ||
ver4.1. | ver4.1.2 2023/10/22恒心 | ||
当コードは恒心停止してしまった https://rentry.co/7298g の降臨ショーツイート自動収集スクリプトの復刻改善版です | 当コードは恒心停止してしまった https://rentry.co/7298g の降臨ショーツイート自動収集スクリプトの復刻改善版です | ||
70行目: | 70行目: | ||
from time import sleep | from time import sleep | ||
from types import MappingProxyType, TracebackType | from types import MappingProxyType, TracebackType | ||
from typing import | from typing import Final, NamedTuple, NoReturn, Self, override | ||
from urllib.parse import quote, unquote, urljoin | from urllib.parse import quote, unquote, urljoin | ||
from zoneinfo import ZoneInfo | from zoneinfo import ZoneInfo | ||
504行目: | 504行目: | ||
raise | raise | ||
def _request_with_callable( | def _request_with_callable[T]( | ||
self, | self, | ||
url: str, | url: str, | ||
request_callable: Callable[[str], | request_callable: Callable[[str], T]) -> T | None: | ||
"""`request_callable` の実行を :const:`~LIMIT_N_REQUESTS` で定義された回数まで試す。 | """`request_callable` の実行を :const:`~LIMIT_N_REQUESTS` で定義された回数まで試す。 | ||
515行目: | 515行目: | ||
Args: | Args: | ||
url (str): 接続するURL | url (str): 接続するURL | ||
request_callable (Callable[[str], | request_callable (Callable[[str], T]): 1回リクエストを行うメソッド。 | ||
Returns: | Returns: | ||
T | None: レスポンス。接続失敗が何度も起きると `None` を返す。 | |||
""" | """ | ||
logger.debug('Requesting ' + unquote(url)) | logger.debug('Requesting ' + unquote(url)) | ||
for i in range(1, self.LIMIT_N_REQUESTS + 1): | for i in range(1, self.LIMIT_N_REQUESTS + 1): | ||
try: | try: | ||
res: Final[ | res: Final[T] = request_callable(url) | ||
except AccessError: | except AccessError: | ||
logger.warning( | logger.warning( | ||
736行目: | 736行目: | ||
if not hasattr(cls, '_escape_callables'): | if not hasattr(cls, '_escape_callables'): | ||
# 初回呼び出しの時だけ正規表現をコンパイルする | # 初回呼び出しの時だけ正規表現をコンパイルする | ||
head_space_pattern: Final[Pattern[str]] = re.compile( | |||
r'^ ', re.MULTILINE) | |||
head_marks_pattern: Final[Pattern[str]] = re.compile( | |||
r'^([\*#:;])', re.MULTILINE) | |||
bar_pattern: Final[Pattern[str]] = re.compile( | |||
r'^----', re.MULTILINE) | |||
cls._escape_callables: tuple[Callable[[str], str], ...] = ( | cls._escape_callables: tuple[Callable[[str], str], ...] = ( | ||
lambda t: t.replace('\n', '<br>\n'), | lambda t: t.replace('\n', '<br>\n'), | ||
lambda t: | lambda t: head_space_pattern.sub(' ', t), | ||
lambda t: | lambda t: head_marks_pattern.sub(r'<nowiki>\1</nowiki>', t), | ||
lambda t: | lambda t: bar_pattern.sub('<nowiki>----</nowiki>', t) | ||
) | ) | ||