利用者・トーク:夜泣き

話題を追加
2023年9月26日 (火) 16:55時点における>化学に強い弁護士による版 (→‎v4.0.2)

てすや

スクリプトに欲しい機能

適当に思いついたのを追加していってほしいですを

  • こんな感じで箇条書きにしてください。
  • 日付まで自動で出力できるとしばらく収集をサボっても楽ですね(ロジックが大幅に変わりそうですが)--Fet-Fe (トーク) 2022年9月10日 (土) 01:22 (JST)
    • Fet-Fe師との出会いに感謝。今週中に作るつもりにしときます。検索クエリに日付入れる感じでやっていく予定。--夜泣き (トーク) 2022年9月12日 (月) 19:19 (JST)
    • 完成したのでとりあえず取り急ぎ。検索クエリに日付入れようとしたらドツボにハマったのでツイートから日付読み出すようにしましたを--夜泣き (トーク) 2022年9月17日 (土) 22:36 (JST)

利用者:夜泣き/スクリプトについて

ファイル:Symbol opinion vote.svg 提案 - どうせrequestモジュールでpipが必要ならBeautifulSoupも入れてしまえば、HTMLから文字を抜き出す際にgrepやreを使うよりもすっきり書けると思います。貴職がどういうロジックにするつもりなのかまだわかりませんが--Fet-Fe (トーク) 2022年6月16日 (木) 23:26 (JST)

  コメント - それは思ってました。標準のみか追加するかの2択しかないんで後者ならたぶん使うことになるでしょう。BeautifulSoupのほうは使ったこと無いってのがネックですがなんとかなるでしょう。--夜泣き (トーク) 2022年6月16日 (木) 23:31 (JST)
ファイル:Symbol rename vote.svg 返信 - 当職も利用者:Fet-Fe#恒心教徒の皆様へ:当Wikiのソースの魚拓取得をお手伝い下さいで少しだけ使ったので、よろしければ参考にして下さい。不慣れだったので効率の悪い書き方かもしれませんが--Fet-Fe (トーク) 2022年6月17日 (金) 00:33 (JST)
ファイル:Symbol rename vote.svg 返信 - 出会いに感謝。参考にさせてもらいました。関数アノテーションは知らなかっただけになんとも言えないですわ・・・--夜泣き (トーク) 2022年6月18日 (土) 21:04 (JST)

  コメント - 出会いに感謝。すごく読みやすいです。取り敢えず思ったことを

  • テンプレート:Archiveではなくテンプレート:CallinShowLinkを使っていただけると嬉しいです
  • DoS攻撃になりかねないのでrequest_onetimesleep(1)を入れた方が良いと思います
  • 出力の魚拓がTor用のURLになっています
  • 返り値がNoneの可能性があるときは‎requests.models.Response | None([1])などとした方が良いです
  • 贅沢なことを言うとhttps://github.com/palewire/archiveis/blob/master/archiveis/api.pyみたいな感じで魚拓も自動で取れると理想的ですね 当職が前に試したときは何ページかリクエストすると弾かれてしまっていました あと玉葱だとどうなるかわかりません
  • あと当職はその書き方をしたことがないのでわからないのですが、doublesoupとかって必要ですか?soupにfindなどした結果にそのままさらにfindなどの処理をすることは多分可能だと思います

--Fet-Fe (トーク) 2022年6月20日 (月) 12:06 (JST)

ファイル:Symbol rename vote.svg 返信 - 出会いに感謝。徹夜で意識が薄れながらギリギリに作った感じなのでやっぱ不具合ありましたか。今も頭あまり回ってませんがぶっちゃけ貴職のほうがスクリプト能力嵯峨山なので言ってもらえた所は直していこうかと。
  • テンプレート:Archiveではなくテンプレート:CallinShowLink
    • 存在を失念しておりました。修正コスト安そうなのでバグ取りと同時に直してしまいます。
      • 直しました。
  • request_onetimesleep(1)を入れた方が良い
    • 失敗した時は長く待ってリトライさせるために失敗用と成功用で待ち時間分けて失敗した時はrequestメソッド内で5秒待ち成功した時はrequestメソッド呼び出した後に呼出側で必ず1秒待つようにしてるのでDOS攻撃は一応大丈夫です。request_onetimeで必ず1秒待って失敗したとき追加で4秒待たせればいいだけなので指摘されると確かにいいコードではないですね。
      • 直しました。
  • 出力の魚拓がTor用のURLになっています
    • 恐らくスクレイピングした場所がバグってるようです。当職無能頭唐澤眼球麻原につき気づきませんでした。
      • 直しました。
  • 返り値がNoneの可能性があるとき
    • これもなんとかします。
      • requests.models.Response | Noneの書き方だとエラーでした。代わりにOptional[requests.models.Response]になってます。
  • 魚拓も自動で取れる
    • 玉ねぎだと取得時に100%One more stepが出ますのでさすがにrecaptcha突破は無理です。生IPだとかあんま使われてないVPNなら出てこないときもありそうですがスクリプト回す人全員が全員そんな環境ではないし最初から諦めてました。別で魚拓取得するためだけのスクリプトを作って回せる人に回してもらう方が現実的かと。
  • soupにfindなどした結果にそのままさらにfindなどの処理をすることは多分可能
    • ガチなのですか?soupはBeautifulSoupオブジェクトでfind使って取得したのはTagオブジェクトなので無理だと思ってました。それに使ってる中で動かなかった記憶もありますが別の理由でエラーだったのかもしれないですしあとで試してみます。
      • 普通にいけました。貴職有能当職無能。

--夜泣き (トーク) 2022年6月20日 (月) 22:19 (JST)

追記しましたを--夜泣き (トーク) 2022年6月21日 (火) 23:16 (JST)

v2.1.0

ツイートの画像を自動で取得するため、勝手ながら改造いたしました。

追加機能は以下の通りです

  • ツイートについている画像を自動でダウンロードし、MEDIA_DIRに入れておく
  • ツイートについている画像ファイル名をWiki記法に変換して本文に追加する
  • 引用リツイートの引用元URLを取得し、Archiveして本文に追加する
  • 最初にTorに接続できているかのチェックを追加
  • (推奨する訳ではありませんが)MacOSでの動作確認
    • brewでtorコマンドをインストールして実行しておいてからこのスクリプトを実行すれば、MacOSでもツイートが取得できます
    • MacOSから利用する場合、PySocksモジュールが必要になるのでpipで入れて下さい。またそれに合わせてPROXIESのプロキシをsocks5h://127.0.0.1:9050としていますが、環境によってはsocks5://127.0.0.1:9050でないと機能しないかもしれません

またこのスクリプトには現状バグがあります

https://twitter.com/CallinShow/status/1556339048138289152(魚拓)のように1ツイートに2枚以上の画像があると1枚しか処理しません

これに関してはまた修正しようと思います--Fet-Fe (トーク) 2022年8月9日 (火) 01:41 (JST)

v2.1.1

v2.1.0のバグを治すため、また勝手に改造いたしました

  • 1ツイートに2枚以上の画像があると1枚しか取れない問題の修正
  • archive.phにページの魚拓の存在を確認するときにURL中の#を%23にURLエンコードして、#以降が無視されないように修正
  • NitterではYouTubeへのリンクがpiped.kavin.rocksかinvidiousになっているので、それらをYouTubeのURLに変換するように
  • リンクのURL文字列を...で省略しないよう修正
  • 可読性のためtypingの記法を変更
    • このためPythonのバージョンを3.10以上にして下さい


またこのスクリプトには現状バグがあります

リンクのURLに#が含まれる場合、これを<nowiki>#</nowiki>に変換してしまいます。 本文中の#を<nowiki>#</nowiki>に直すのは正しい動作ですが、こちらは正しくありません

更にバグというわけではありませんが、現状ではarchive.phの魚拓のうち最も古いものを取ってきています。 新しいものだと元ページが削除された後に取られた魚拓の可能性もあるのでこのようになっていると考えられますが、Twitterの魚拓を取る動作は不安定であることも多く、アクセス失敗ページの魚拓が出力に使われている可能性もあります。 ユーザ側で魚拓の他の版をワンクリックで見られるので大した問題ではないと思いますが、このような動作になっていることはご了承下さい。--Fet-Fe (トーク) 2022年8月13日 (土) 23:16 (JST)

ファイル:Symbol rename vote.svg 返信 - グレードアップされている、これはいい。有能なFet-Fe師との出会いに感謝。貴職の能力見てると当職のコードは実にお粗末ですわ・・・お勉強中なので許してクレメンス。ソース独占するつもりはないので触ってもらって全然大丈夫ですよ。もし不具合出ても編集履歴から戻せますし。--夜泣き (トーク) 2022年8月14日 (日) 23:25 (JST)
  コメント - ちょっと動けないタイミングなんでいろいろ対応することあっても今は少し無理ですみません。スクリプト恒心してもらうのは全然OKです。どこかのデブみたいに三日坊主で飽きたわけじゃないですのでご了承ください。やったほうがいいことがあれば書いといてもらえればいけるタイミングで対処します。--夜泣き (トーク) 2022年8月14日 (日) 23:33 (JST)
ファイル:Symbol rename vote.svg 返信 - 当職も貴職が手をつけて下さらなければやろうとすら思わなかったので有り難かったです--Fet-Fe (トーク) 2022年8月22日 (月) 01:58 (JST)

ファイル:Symbol information blue.svg 報告 - ツイートに含まれる行の頭に半角スペースがあるとWiki記法として認識されてしまうようです。修正しようとすると、<nowiki> </nowiki>と書いても&#x20;と書いても行頭スペースが反映されないのでなんとも言えないですわ・・・・・・--Fet-Fe (トーク) 2022年8月22日 (月) 01:58 (JST)

ファイル:Symbol opinion vote.svg 提案 - あと日付まで自動で出力できるとしばらく収集をサボっても楽ですね--Fet-Fe (トーク) 2022年8月22日 (月) 01:58 (JST)

v2.1.2

v2.1.1のバグを治すため、また勝手に改造いたしました

  • リンクのURLに#が含まれる場合、これを<nowiki>#</nowiki>に変換してしまうバグの修正
  • ツイートに含まれる行の頭に半角スペースがあるとWiki記法として反映されてしまうバグの修正
  • Archiveテンプレート内のURLがURLエンコードされていたらデコードするように修正--Fet-Fe (トーク) 2022年8月29日 (月) 01:12 (JST)
ファイル:Symbol rename vote.svg 返信 - 見逃しててガチでスマン。普段の環境と違う環境でしかツイとウィッキ垢運用してないから完全に見るの忘れてました。当職 無能 頭唐澤。貴職がグレードアップしていってくれて感謝してます。上に追加してほしい機能欄を作ったので追加しといてくれれば作れる範囲で作ります。最近ほとんど貴職が作ってくれていて申し訳ないので。--夜泣き (トーク) 2022年9月3日 (土) 22:26 (JST)

v2.1.4

  • 日付を0埋めしないよう修正
  • 投票を取得
    • 整形は適当なので直してください
  • URLやファイルパスの合成にurllib.parse.urljoinやos.path.joinを用いるように
  • ArchiveのURLの合成ロジックの修正--Fet-Fe (トーク) 2022年9月22日 (木) 00:49 (JST)

v2.1.5

  • 投票を整形して表示するよう修正
  • 全通信がTorを通る環境でも、Torプロキシを立ててそれを指定して通信する必要がある環境でも動くよう修正
  • NitterでどんなInvidiousのインスタンスが使われていてもyoutubeのリンクに置き換えられるよう修正--Fet-Fe (トーク) 2022年9月24日 (土) 01:36 (JST)

v3.0.0

3/10以降の編集が消えているのを戻した分もあるので差分が大きいですが、大きな機能としてはnitterの新仕様への対応です。 Twitterの垢なし検索の禁止化に伴い、nitterでもsearchが機能しなくなりました。 そこでtweets or replies欄から、固定ツイートとリツイートを取り除いてツイートを取得するように変更しました。 急いで作ったので多分めちゃくちゃです、直してください

またそれに伴い、特定のワードを検索して絞り込む機能が使えなくなったので、とりあえず全てのツイートを巡回して、指定のワードをすべて含むツイートのみを保存する方法に変更しました。だいぶ効率が悪いです。またこの機能のテストもまだしていません。--Fet-Fe (トーク) 2023年4月29日 (土) 16:33 (JST)

スクリプトが現在動かなくなっています

v3.0.3のスクリプトが現在正常に動作しません。

原因として、

  1. Tor版のnitterがtwitterの情報を取ってこられない
  2. archive.todayがcurlやpythonのrequestモジュールでアクセスできない

ことがあげられます。 1は最悪Tor版でないnitterを使えばなんとかなりますが、2が今のところ解決できていません。--Fet-Fe (トーク) 2023年9月15日 (金) 02:12 (JST)

  コメント - 魚拓に関してですが、恐らくreCaptureに引っかかっていると思われます。archive.todayさんサイドが導入を継続する限り解決は難しいかと。--化学に強い弁護士 (トーク) 2023年9月15日 (金) 11:37 (JST)

v4.0.0

reCAPTCHAに対処するため、SeleniumでTor Browserを動かして自分で解けるようにしました。 JavaScriptがonでないと解けないのであまり好ましくはありませんが、仕方ないです。

TODO

  • Seleniumが必要なくなったときのために、Requestsだけで動くモードを追加する
  • 動画を自動取得できるようにする
  • JavaScriptのオンオフを切り替えられるようにする(必要?)
  • バグがないか確認する
  • もっと読みやすくする

急いで作ったので雑です。皆様直してください。--Fet-Fe (トーク) 2023年9月24日 (日) 00:04 (JST)

v4.0.2

Requestsだけで動くモードを追加しました。またJavaScriptをオフにするオプションを追加しました。 またPEP8の書き方に順次対応するため、インデントをスペース4つにしました。

TODO

  • 動画を自動取得できるようにする
  • JavaScriptのオンオフを途中で切り替えられるようにする(必要?)
  • _fail_make_txtではexitで終了するのをやめ、正常終了時はループを抜けて終了するようにする。
  • _txt_dataの組み立てを別のBuilderクラスに逃す
  • _check_slashがなくても動くようにする
  • PEP8に準拠した書き方にする
  • 出力にLoggerを利用する
  • バグがないか確認する--Fet-Fe (トーク) 2023年9月25日 (月) 02:14 (JST)

不具合報告(v4.0.2)

本スクリプトをWhonix環境で実行したところ、下記のエラーを出力しました。念のためpip install typingを実行しても変わらず(長いのでエラー内容は折りたたんで書きます)実行出来ませんでした。当職が無能なだけなのかプログラムに不備があるのかは分かりませんが。

pip install typingを実行した時のエラー

(venv) user@host:~$ pip install typing
Collecting typing
  Downloading typing-3.7.4.3.tar.gz (78 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.6/78.6 kB 128.3 kB/s eta 0:00:00
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... error
  error: subprocess-exited-with-error
  
  × Preparing metadata (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [88 lines of output]
      /tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/dist.py:498: SetuptoolsDeprecationWarning: Invalid dash-separated options
      !!
      
              ********************************************************************************
              Usage of dash-separated 'license-file' will not be supported in future
              versions. Please use the underscore name 'license_file' instead.
      
              See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details.
              ********************************************************************************
      
      !!
        opt = self.warn_dash_deprecation(opt, section)
      /tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/config/setupcfg.py:293: _DeprecatedConfig: Deprecated config in `setup.cfg`
      !!
      
              ********************************************************************************
              The license_file parameter is deprecated, use license_files instead.
      
              By 2023-Oct-30, you need to update your project and remove deprecated calls
              or your builds will no longer be supported.
      
              See https://setuptools.pypa.io/en/latest/userguide/declarative_config.html for details.
              ********************************************************************************
      
      !!
        parsed = self.parsers.get(option_name, lambda x: x)(value)
      running dist_info
      creating /tmp/pip-modern-metadata-_760nep_/typing.egg-info
      writing /tmp/pip-modern-metadata-_760nep_/typing.egg-info/PKG-INFO
      writing dependency_links to /tmp/pip-modern-metadata-_760nep_/typing.egg-info/dependency_links.txt
      writing top-level names to /tmp/pip-modern-metadata-_760nep_/typing.egg-info/top_level.txt
      writing manifest file '/tmp/pip-modern-metadata-_760nep_/typing.egg-info/SOURCES.txt'
      reading manifest file '/tmp/pip-modern-metadata-_760nep_/typing.egg-info/SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      adding license file 'LICENSE'
      writing manifest file '/tmp/pip-modern-metadata-_760nep_/typing.egg-info/SOURCES.txt'
      creating '/tmp/pip-modern-metadata-_760nep_/typing-3.7.4.3.dist-info'
      Traceback (most recent call last):
        File "/home/user/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 353, in <module>
          main()
        File "/home/user/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 335, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File "/home/user/venv/lib/python3.10/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py", line 149, in prepare_metadata_for_build_wheel
          return hook(metadata_directory, config_settings)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 396, in prepare_metadata_for_build_wheel
          self.run_setup()
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 507, in run_setup
          super(_BuildMetaLegacyBackend, self).run_setup(setup_script=setup_script)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/build_meta.py", line 341, in run_setup
          exec(code, locals())
        File "<string>", line 57, in <module>
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/__init__.py", line 103, in setup
          return distutils.core.setup(**attrs)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 185, in setup
          return run_commands(dist)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/core.py", line 201, in run_commands
          dist.run_commands()
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 969, in run_commands
          self.run_command(cmd)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 989, in run_command
          super().run_command(command)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 988, in run_command
          cmd_obj.run()
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/command/dist_info.py", line 112, in run
          bdist_wheel = self.get_finalized_command('bdist_wheel')
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/cmd.py", line 304, in get_finalized_command
          cmd_obj = self.distribution.get_command_obj(command, create)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/_distutils/dist.py", line 860, in get_command_obj
          klass = self.get_command_class(command)
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/setuptools/dist.py", line 736, in get_command_class
          self.cmdclass[command] = cmdclass = ep.load()
        File "/usr/local/lib/python3.10/importlib/metadata/__init__.py", line 171, in load
          module = import_module(match.group('module'))
        File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
          return _bootstrap._gcd_import(name[level:], package, level)
        File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
        File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
        File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
        File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
        File "<frozen importlib._bootstrap_external>", line 883, in exec_module
        File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/wheel/bdist_wheel.py", line 28, in <module>
          from .macosx_libfile import calculate_macosx_platform_tag
        File "/tmp/pip-build-env-5gip_o42/overlay/lib/python3.10/site-packages/wheel/macosx_libfile.py", line 43, in <module>
          import ctypes
        File "/usr/local/lib/python3.10/ctypes/__init__.py", line 8, in <module>
          from _ctypes import Union, Structure, Array
      ImportError: libffi.so.7: cannot open shared object file: No such file or directory
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.
‎

プログラム実行時のエラーは下記の通りです。

(venv) user@host:~$ python3 '/home/user/Desktop/降臨ショー.py' 
Traceback (most recent call last):
  File "/home/user/Desktop/降臨ショー.py", line 54, in <module>
    from typing import Final, NoReturn, Any, Self
ImportError: cannot import name 'Self' from 'typing' (/usr/local/lib/python3.10/typing.py)

補足説明:起動時の環境は当職のユーザーページに書いてあるそれです--化学に強い弁護士 (トーク) 2023年9月27日 (水) 01:54 (JST)

「夜泣き」の利用者ページに戻る。