「利用者:夜泣き/スクリプト」の版間の差分

>Fet-Fe
(→‎コード: v4.1.1 --search-unarchivedでリツイートを除く処理を追加)
>Fet-Fe
(→‎コード: v4.1.2)
7行目: 7行目:
"""Twitter自動収集スクリプト
"""Twitter自動収集スクリプト


ver4.1.1 2023/10/22恒心
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 Any, Final, NamedTuple, NoReturn, Self, override
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], Any]) -> Any | None:
             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], Any]): 1回リクエストを行うメソッド。
             request_callable (Callable[[str], T]): 1回リクエストを行うメソッド。


         Returns:
         Returns:
             Any | None: レスポンス。接続失敗が何度も起きると `None` を返す。
             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[Any] = request_callable(url)
                 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'):
             # 初回呼び出しの時だけ正規表現をコンパイルする
             # 初回呼び出しの時だけ正規表現をコンパイルする
             patterns: tuple[Pattern[str], ...] = (
             head_space_pattern: Final[Pattern[str]] = re.compile(
                re.compile(r'^ ', re.MULTILINE),
                r'^ ', re.MULTILINE)
                re.compile(r'^([\*#:;])', re.MULTILINE),
            head_marks_pattern: Final[Pattern[str]] = re.compile(
                re.compile(r'^----', re.MULTILINE)
                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: patterns[0].sub('&nbsp;', t),
                 lambda t: head_space_pattern.sub('&nbsp;', t),
                 lambda t: patterns[1].sub(r'<nowiki>\1</nowiki>', t),
                 lambda t: head_marks_pattern.sub(r'<nowiki>\1</nowiki>', t),
                 lambda t: patterns[2].sub('<nowiki>----</nowiki>', t)
                 lambda t: bar_pattern.sub('<nowiki>----</nowiki>', t)
             )
             )


匿名利用者