「利用者・トーク:夜泣き」の版間の差分
>夜泣き (ページの作成:「てすや」) |
>Fet-Fe |
||
(4人の利用者による、間の44版が非表示) | |||
1行目: | 1行目: | ||
てすや | てすや | ||
== スクリプトに欲しい機能 == | |||
適当に思いついたのを追加していってほしいですを | |||
*こんな感じで箇条書きにしてください。 | |||
*日付まで自動で出力できるとしばらく収集をサボっても楽ですね(ロジックが大幅に変わりそうですが)--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年9月10日 (土) 01:22 (JST) | |||
**Fet-Fe師との出会いに感謝。今週中に作るつもりにしときます。検索クエリに日付入れる感じでやっていく予定。--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年9月12日 (月) 19:19 (JST) | |||
**完成したのでとりあえず取り急ぎ。検索クエリに日付入れようとしたらドツボにハマったのでツイートから日付読み出すようにしましたを--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年9月17日 (土) 22:36 (JST) | |||
*オプションで--krswを指定した時にも上限以内で引っかかった書き込みがあると自動停止する機能が欲しいですを<br>例えば--stop-condition "稲ちゃんが不正ログインと言っているんだ。みんなこれは解散だよ。"<ref>当職の英語力は唐澤貴洋なので条件の英訳はconditionが一番適切なのかが分かりません</ref>と書いたら https://x.com/CallinShow/status/1818847336296333529 で自動停止するといった次第でふ<br>\nで改行を指定出来る仕様はあっても無くても構いません。--[[利用者:唐澤貴洋 部下に熱湯|唐澤貴洋 部下に熱湯]] ([[利用者・トーク:唐澤貴洋 部下に熱湯|トーク]]) 2024年9月1日 (日) 04:20 (JST) | |||
**[[#v4.4.0|v4.4.0]]で機能を追加しました。<code>--krsw</code>の後ろに自動停止させたいテキストを入れてください。改行には対応しておりません--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2024年9月4日 (水) 02:08 (JST) | |||
== [[利用者:夜泣き/スクリプト]]について == | |||
{{CM|提案}} - どうせrequestモジュールでpipが必要ならBeautifulSoupも入れてしまえば、HTMLから文字を抜き出す際にgrepやreを使うよりもすっきり書けると思います。貴職がどういうロジックにするつもりなのかまだわかりませんが--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年6月16日 (木) 23:26 (JST) | |||
:{{CM}} - それは思ってました。標準のみか追加するかの2択しかないんで後者ならたぶん使うことになるでしょう。BeautifulSoupのほうは使ったこと無いってのがネックですがなんとかなるでしょう。--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年6月16日 (木) 23:31 (JST) | |||
::{{CM|返信}} - 当職も[[利用者:Fet-Fe#恒心教徒の皆様へ:当Wikiのソースの魚拓取得をお手伝い下さい]]で少しだけ使ったので、よろしければ参考にして下さい。不慣れだったので効率の悪い書き方かもしれませんが--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年6月17日 (金) 00:33 (JST) | |||
:::{{CM|返信}} - 出会いに感謝。参考にさせてもらいました。関数アノテーションは知らなかっただけになんとも言えないですわ・・・--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年6月18日 (土) 21:04 (JST) | |||
{{CM}} - 出会いに感謝。すごく読みやすいです。取り敢えず思ったことを | |||
* [[テンプレート:Archive]]ではなく[[テンプレート:CallinShowLink]]を使っていただけると嬉しいです | |||
* DoS攻撃になりかねないので<code>request_onetime</code>に<syntaxhighlight lang="python3" inline>sleep(1)</syntaxhighlight>を入れた方が良いと思います | |||
* 出力の魚拓がTor用のURLになっています | |||
* 返り値がNoneの可能性があるときは<syntaxhighlight lang="python3" inline>requests.models.Response | None</syntaxhighlight>([https://docs.python.org/ja/3/library/typing.html#typing.Optional])などとした方が良いです | |||
* 贅沢なことを言うと[https://github.com/palewire/archiveis/blob/master/archiveis/api.py https://github.com/palewire/archiveis/blob/master/archiveis/api.py]みたいな感じで魚拓も自動で取れると理想的ですね [[利用者:Fet-Fe#恒心教徒の皆様へ:当Wikiのソースの魚拓取得をお手伝い下さい|当職が前に試したとき]]は何ページかリクエストすると弾かれてしまっていました あと玉葱だとどうなるかわかりません | |||
* あと当職はその書き方をしたことがないのでわからないのですが、doublesoupとかって必要ですか?soupにfindなどした結果にそのままさらにfindなどの処理をすることは多分可能だと思います | |||
--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年6月20日 (月) 12:06 (JST) | |||
::{{CM|返信}} - 出会いに感謝。徹夜で意識が薄れながらギリギリに作った感じなのでやっぱ不具合ありましたか。今も頭あまり回ってませんがぶっちゃけ貴職のほうがスクリプト能力嵯峨山なので言ってもらえた所は直していこうかと。 | |||
*[[テンプレート:Archive]]ではなく[[テンプレート:CallinShowLink]] | |||
**存在を失念しておりました。修正コスト安そうなのでバグ取りと同時に直してしまいます。 | |||
***直しました。 | |||
*<code>request_onetime</code>に<syntaxhighlight lang="python3" inline>sleep(1)</syntaxhighlight>を入れた方が良い | |||
**失敗した時は長く待ってリトライさせるために失敗用と成功用で待ち時間分けて失敗した時はrequestメソッド内で5秒待ち成功した時はrequestメソッド呼び出した後に呼出側で必ず1秒待つようにしてるのでDOS攻撃は一応大丈夫です。request_onetimeで必ず1秒待って失敗したとき追加で4秒待たせればいいだけなので指摘されると確かにいいコードではないですね。 | |||
***直しました。 | |||
* 出力の魚拓がTor用のURLになっています | |||
**恐らくスクレイピングした場所がバグってるようです。当職無能頭唐澤眼球麻原につき気づきませんでした。 | |||
***直しました。 | |||
*返り値がNoneの可能性があるとき | |||
**これもなんとかします。 | |||
***<syntaxhighlight lang="python3" inline>requests.models.Response | None</syntaxhighlight>の書き方だとエラーでした。代わりに<syntaxhighlight lang="python3" inline>Optional[requests.models.Response]</syntaxhighlight>になってます。 | |||
*魚拓も自動で取れる | |||
**玉ねぎだと取得時に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のプロキシを<code>socks5h://127.0.0.1:9050</code>としていますが、環境によっては<code>socks5://127.0.0.1:9050</code>でないと機能しないかもしれません | |||
またこのスクリプトには現状バグがあります | |||
{{Archive|1=https://twitter.com/CallinShow/status/1556339048138289152|2=https://archive.ph/TFBKb|3=https://twitter.com/CallinShow/status/1556339048138289152}}のように1ツイートに2枚以上の画像があると1枚しか処理しません | |||
これに関してはまた修正しようと思います--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月9日 (火) 01:41 (JST) | |||
=== v2.1.1 === | |||
v2.1.0のバグを治すため、また勝手に改造いたしました | |||
*1ツイートに2枚以上の画像があると1枚しか取れない問題の修正 | |||
*archive.phにページの魚拓の存在を確認するときにURL中の<nowiki>#</nowiki>を%23にURLエンコードして、<nowiki>#</nowiki>以降が無視されないように修正 | |||
*NitterではYouTubeへのリンクがpiped.kavin.rocksかinvidiousになっているので、それらをYouTubeのURLに変換するように | |||
*リンクのURL文字列を...で省略しないよう修正 | |||
*可読性のためtypingの記法を変更 | |||
**このためPythonのバージョンを3.10以上にして下さい | |||
またこのスクリプトには現状バグがあります | |||
リンクのURLに<nowiki>#</nowiki>が含まれる場合、これを<nowiki><nowiki>#</nowiki></nowiki>に変換してしまいます。 | |||
本文中の<nowiki>#</nowiki>を<nowiki><nowiki>#</nowiki></nowiki>に直すのは正しい動作ですが、こちらは正しくありません | |||
更にバグというわけではありませんが、現状ではarchive.phの魚拓のうち最も古いものを取ってきています。 | |||
新しいものだと元ページが削除された後に取られた魚拓の可能性もあるのでこのようになっていると考えられますが、Twitterの魚拓を取る動作は不安定であることも多く、アクセス失敗ページの魚拓が出力に使われている可能性もあります。 | |||
ユーザ側で魚拓の他の版をワンクリックで見られるので大した問題ではないと思いますが、このような動作になっていることはご了承下さい。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月13日 (土) 23:16 (JST) | |||
:{{CM|返信}} - グレードアップされている、これはいい。有能なFet-Fe師との出会いに感謝。貴職の能力見てると当職のコードは実にお粗末ですわ・・・お勉強中なので許してクレメンス。ソース独占するつもりはないので触ってもらって全然大丈夫ですよ。もし不具合出ても編集履歴から戻せますし。--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年8月14日 (日) 23:25 (JST) | |||
:{{CM}} - ちょっと動けないタイミングなんでいろいろ対応することあっても今は少し無理ですみません。スクリプト恒心してもらうのは全然OKです。どこかのデブみたいに三日坊主で飽きたわけじゃないですのでご了承ください。やったほうがいいことがあれば書いといてもらえればいけるタイミングで対処します。--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年8月14日 (日) 23:33 (JST) | |||
::{{CM|返信}} - 当職も貴職が手をつけて下さらなければやろうとすら思わなかったので有り難かったです--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月22日 (月) 01:58 (JST) | |||
{{CM|報告}} - ツイートに含まれる行の頭に半角スペースがあるとWiki記法として認識されてしまうようです。修正しようとすると、<code><nowiki><nowiki> </nowiki></nowiki></code>と書いても<code>&#x20;</code>と書いても行頭スペースが反映されないのでなんとも言えないですわ・・・・・・--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月22日 (月) 01:58 (JST) | |||
{{CM|提案}} - あと日付まで自動で出力できるとしばらく収集をサボっても楽ですね--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月22日 (月) 01:58 (JST) | |||
=== v2.1.2 === | |||
v2.1.1のバグを治すため、また勝手に改造いたしました | |||
*リンクのURLに<nowiki>#</nowiki>が含まれる場合、これを<nowiki><nowiki>#</nowiki></nowiki>に変換してしまうバグの修正 | |||
*ツイートに含まれる行の頭に半角スペースがあるとWiki記法として反映されてしまうバグの修正 | |||
*Archiveテンプレート内のURLがURLエンコードされていたらデコードするように修正--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年8月29日 (月) 01:12 (JST) | |||
:{{CM|返信}} - 見逃しててガチでスマン。普段の環境と違う環境でしかツイとウィッキ垢運用してないから完全に見るの忘れてました。当職 無能 頭唐澤。貴職がグレードアップしていってくれて感謝してます。上に追加してほしい機能欄を作ったので追加しといてくれれば作れる範囲で作ります。最近ほとんど貴職が作ってくれていて申し訳ないので。--[[利用者:夜泣き|夜泣き]] ([[利用者・トーク:夜泣き|トーク]]) 2022年9月3日 (土) 22:26 (JST) | |||
=== v2.1.4 === | |||
*日付を0埋めしないよう修正 | |||
*投票を取得 | |||
**整形は適当なので直してください | |||
*URLやファイルパスの合成にurllib.parse.urljoinやos.path.joinを用いるように | |||
*ArchiveのURLの合成ロジックの修正--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年9月22日 (木) 00:49 (JST) | |||
=== v2.1.5 === | |||
*投票を整形して表示するよう修正 | |||
*全通信がTorを通る環境でも、Torプロキシを立ててそれを指定して通信する必要がある環境でも動くよう修正 | |||
*NitterでどんなInvidiousのインスタンスが使われていてもyoutubeのリンクに置き換えられるよう修正--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2022年9月24日 (土) 01:36 (JST) | |||
=== v3.0.0 === | |||
3/10以降の編集が消えているのを戻した分もあるので差分が大きいですが、大きな機能としてはnitterの新仕様への対応です。 | |||
Twitterの垢なし検索の禁止化に伴い、nitterでもsearchが機能しなくなりました。 | |||
そこでtweets or replies欄から、固定ツイートとリツイートを取り除いてツイートを取得するように変更しました。 | |||
急いで作ったので多分めちゃくちゃです、直してください | |||
またそれに伴い、特定のワードを検索して絞り込む機能が使えなくなったので、とりあえず全てのツイートを巡回して、指定のワードをすべて含むツイートのみを保存する方法に変更しました。だいぶ効率が悪いです。またこの機能のテストもまだしていません。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年4月29日 (土) 16:33 (JST) | |||
=== スクリプトが現在動かなくなっています === | |||
v3.0.3のスクリプトが現在正常に動作しません。 | |||
原因として、 | |||
# Tor版のnitterがtwitterの情報を取ってこられない | |||
# archive.todayがcurlやpythonのrequestモジュールでアクセスできない | |||
ことがあげられます。 | |||
1は最悪Tor版でないnitterを使えばなんとかなりますが、2が今のところ解決できていません。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月15日 (金) 02:12 (JST) | |||
:{{CM}} - 魚拓に関してですが、恐らくreCaptureに引っかかっていると思われます。archive.todayさんサイドが導入を継続する限り解決は難しいかと。--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2023年9月15日 (金) 11:37 (JST) | |||
=== v4.0.0 === | |||
reCAPTCHAに対処するため、SeleniumでTor Browserを動かして自分で解けるようにしました。 | |||
JavaScriptがonでないと解けないのであまり好ましくはありませんが、仕方ないです。 | |||
TODO | |||
* Seleniumが必要なくなったときのために、Requestsだけで動くモードを追加する | |||
* 動画を自動取得できるようにする | |||
* JavaScriptのオンオフを切り替えられるようにする(必要?) | |||
* バグがないか確認する | |||
* もっと読みやすくする | |||
急いで作ったので雑です。皆様直してください。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月24日 (日) 00:04 (JST) | |||
=== v4.0.2 === | |||
Requestsだけで動くモードを追加しました。またJavaScriptをオフにするオプションを追加しました。 | |||
また[https://pep8-ja.readthedocs.io PEP8]の書き方に順次対応するため、インデントをスペース4つにしました。 | |||
TODO | |||
* 動画を自動取得できるようにする | |||
* JavaScriptのオンオフを途中で切り替えられるようにする(必要?) | |||
* <code>_fail</code>や<code>_make_txt</code>では<code>exit</code>で終了するのをやめ、正常終了時はループを抜けて終了するようにする。 | |||
* <code>_txt_data</code>の組み立てを別のBuilderクラスに逃す | |||
* _<code>check_slash</code>がなくても動くようにする | |||
* [https://pep8-ja.readthedocs.io PEP8]に準拠した書き方にする | |||
* 出力にLoggerを利用する | |||
* バグがないか確認する--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月25日 (月) 02:14 (JST) | |||
==== 不具合報告(v4.0.2) ==== | |||
本スクリプトをWhonix環境で実行したところ、下記のエラーを出力しました。念のためpip install typingを実行しても変わらず(長いのでエラー内容は折りたたんで書きます)実行出来ませんでした。当職が無能なだけなのかプログラムに不備があるのかは分かりませんが。 | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
pip install typingを実行した時のエラー | |||
<div class="mw-collapsible-content"> | |||
<pre> | |||
(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. | |||
</pre> | |||
</div> | |||
</div> | |||
プログラム実行時のエラーは下記の通りです。 | |||
<pre> | |||
(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) | |||
</pre> | |||
補足説明:起動時の環境は当職のユーザーページに書いてあるそれです--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2023年9月27日 (水) 01:54 (JST) | |||
:{{CM|返信}} - <code>typing.Self</code>はpython3.11以上じゃないと使えないみたいですね。3.10以上指定も3.11以上指定もあまり変わらないと思うので、推奨環境を変更しておきます。当職 無能<br>あとWhonixのTor Browserのデフォルトの起動パスを教えていただけますか?今は<code>SeleniumAccessor.TOR_BROWSER_PATHS['Linux']</code>を空にしているので、そこを埋めないと動かないです--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月27日 (水) 23:48 (JST) | |||
::{{CM|返信}} - T or Browserのディレクトリは恐らく/usr/bin/torbrowserです<br>Python3.11以上を要求しているなら説明資料も恒心しておきます--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2023年9月28日 (木) 01:12 (JST) | |||
=== v4.0.3 === | |||
TODO | |||
*動画を自動取得できるようにする | |||
*JavaScriptのオンオフを途中で切り替えられるようにする(必要?) | |||
*_failや_make_txtではexitで終了するのをやめ、正常終了時はループを抜けて終了するようにする。 | |||
*PEP8に準拠した書き方にする | |||
*docstringを修正する | |||
*バグがないか確認する | |||
::{{CM||化弁師へ}} - <code>SeleniumAccessor.TOR_BROWSER_PATHS['Linux']</code>に<code>/usr/bin/torbrowser</code>を設定しましたが、動きますか?ディレクトリではなくブラウザのバイナリそのものを指定しないと動かないはずです--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月28日 (木) 02:32 (JST) | |||
:::{{CM|返信}} - コマンドラインで/usr/bin/torbrowserを実行したらブラウザは起動しますが、プログラムは下記のエラーで止まりました。<br> | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
プログラム実行時のエラー | |||
<div class="mw-collapsible-content"> | |||
<pre>(venv) user@host:~/Desktop$ python3.11 '/home/user/Desktop/降臨ショー.py' | |||
2023-09-28 13:27:45,358 [WARN] : reCAPTCHA対策のためJavaScriptをonにしますを | |||
Traceback (most recent call last): | |||
File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/driver_finder.py", line 38, in get_path | |||
path = SeleniumManager().driver_location(options) if path is None else path | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/selenium_manager.py", line 98, in driver_location | |||
output = self.run(args) | |||
^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/selenium_manager.py", line 144, in run | |||
raise WebDriverException(f"Unsuccessful command executed: {command}.\n{result}{stderr}") | |||
selenium.common.exceptions.WebDriverException: Message: Unsuccessful command executed: /home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/linux/selenium-manager --browser firefox --browser-path /usr/bin/torbrowser --output json. | |||
{'code': 65, 'message': 'error sending request for url (https://product-details.mozilla.org/1.0/firefox_versions.json): error trying to connect: dns error: failed to lookup address information: Name does not resolve', 'driver_path': '', 'browser_path': ''} | |||
The above exception was the direct cause of the following exception: | |||
Traceback (most recent call last): | |||
File "/home/user/Desktop/降臨ショー.py", line 339, in __init__ | |||
self.driver: webdriver.Firefox = webdriver.Firefox(options=options) | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ | |||
self.service.path = DriverFinder.get_path(self.service, options) | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/driver_finder.py", line 41, in get_path | |||
raise NoSuchDriverException(msg) from err | |||
selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location | |||
During handling of the above exception, another exception occurred: | |||
Traceback (most recent call last): | |||
File "/home/user/Desktop/降臨ショー.py", line 1537, in <module> | |||
twitter_archiver.execute( | |||
File "/home/user/Desktop/降臨ショー.py", line 1495, in execute | |||
with AccessorHandler(use_browser, enable_javascript) as accessor: | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/Desktop/降臨ショー.py", line 435, in __init__ | |||
self.selenium_accessor: SeleniumAccessor | None = SeleniumAccessor( | |||
^^^^^^^^^^^^^^^^^ | |||
File "/home/user/Desktop/降臨ショー.py", line 352, in __init__ | |||
self.quit() | |||
File "/home/user/Desktop/降臨ショー.py", line 358, in quit | |||
if self.driver: | |||
^^^^^^^^^^^ | |||
AttributeError: 'SeleniumAccessor' object has no attribute 'driver' | |||
</pre> | |||
</div> | |||
</div> | |||
また、実行時にこのようなエラーをウィンドウで出力したため、別のところに原因があるのかもしれません。 | |||
<pre> | |||
The following link will be opened in x-www-browser (/usr/bin/whichbrowser). | |||
Be careful if x-www-browser (/usr/bin/whichbrowser) is already running as your activities might get linked. | |||
-v | |||
Continue? | |||
</pre> | |||
恐らくTorブラウザのバイナリの場所はあってると思いますが、もう一度調査してみます。--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2023年9月28日 (木) 22:33 (JST) | |||
:{{CM|返信}} - プログラムのエラーについては実装ミスでした。v4.0.4で同じ操作をして、エラーが出なくなっているか確かめていただけると幸いです。実行時にウィンドウで出ているエラーについてですが、"Continue?"と尋ねられているので、エラーではなくそのまま操作を続けるかどうか聞かれています。<code>y</code>とか<code>yes</code>とか打てばそのまま動くのではないでしょうか--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年9月29日 (金) 02:42 (JST) | |||
=== v4.0.5 === | |||
上記TODO解消--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年10月1日 (日) 16:42 (JST) | |||
=== v4.1.0 === | |||
*Pythonの対応バージョンが3.12.0以上になりました。 | |||
*archive.todayからwiki未掲載のツイートのURLを収集する機能を追加しました。起動時に<code>-u</code>または<code>--search_unarchived</code>オプションをつけるとそのモードになります--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年10月9日 (月) 00:49 (JST) | |||
:{{CM}} - Whonix Workstationを日本語化した当職の環境が悪いのか分かりませんが、下記のエラーを出力して止まりました。相変わらずブラウザーを起動しますか(要約)というエラーは引き続き出ていますが、恐らく別の箇所でエラーが発生しているかと思われます。 | |||
<div class="toccolours mw-collapsible mw-collapsed"> | |||
プログラム実行時のエラー | |||
<div class="mw-collapsible-content"> | |||
<pre> | |||
(venv) user@host:~$ python3.12 '/home/user/Desktop/降臨ショー.py' | |||
2023-10-19 15:05:34,891 [WARN] : reCAPTCHA対策のためJavaScriptをonにしますを | |||
Traceback (most recent call last): | |||
File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/driver_finder.py", line 38, in get_path | |||
path = SeleniumManager().driver_location(options) if path is None else path | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/selenium_manager.py", line 98, in driver_location | |||
output = self.run(args) | |||
^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/selenium_manager.py", line 144, in run | |||
raise WebDriverException(f"Unsuccessful command executed: {command}.\n{result}{stderr}") | |||
selenium.common.exceptions.WebDriverException: Message: Unsuccessful command executed: /home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/linux/selenium-manager --browser firefox --browser-path /usr/bin/torbrowser --output json. | |||
{'code': 65, 'message': 'error sending request for url (https://ftp.mozilla.org/pub/firefox/releases/118.0.2/linux-x86_64/en-US/firefox-118.0.2.tar.bz2): error trying to connect: dns error: failed to lookup address information: Try again', 'driver_path': '', 'browser_path': ''} | |||
The above exception was the direct cause of the following exception: | |||
Traceback (most recent call last): | |||
File "/home/user/Desktop/降臨ショー.py", line 2029, in <module> | |||
twitter_archiver.execute( | |||
File "/home/user/Desktop/降臨ショー.py", line 1697, in execute | |||
with AccessorHandler(use_browser, enable_javascript) as accessor: | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/Desktop/降臨ショー.py", line 454, in __init__ | |||
SeleniumAccessor(enable_javascript) if use_browser else None | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/Desktop/降臨ショー.py", line 351, in __init__ | |||
self._driver: Final[webdriver.Firefox] = webdriver.Firefox( | |||
^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ | |||
self.service.path = DriverFinder.get_path(self.service, options) | |||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |||
File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/driver_finder.py", line 41, in get_path | |||
raise NoSuchDriverException(msg) from err | |||
selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location | |||
</pre> | |||
</div> | |||
</div> | |||
必要なライブラリが足りない場合はライブラリが無いよ(要約)というエラーを吐くため恐らくライブラリは全て揃っています。--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2023年10月20日 (金) 00:06 (JST) | |||
:{{CM|返信}} - まず先述の通り、「相変わらずブラウザーを起動しますか(要約)」はエラーではありませんので問題ありません。今回新しく出たエラーについては、プログラムがtor browserを見つけられずにfirefoxをダウンロードしようとしてしまっているんですかね?だとしたら<code>TOR_BROWSER_PATHS</code>に指定しているバイナリのパスが正しくないのかもしれないです。ただ"Unable to obtain driver"とも言っているので、https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location/ とかで解決する問題かもしれないです。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2023年10月22日 (日) 03:04 (JST) | |||
=== v4.2.0 === | |||
{{Archive|https://nitter.cz|https://archive.vn/MQM8h|Nitter}}が終了してしまったので、従来のモードをdeprecatedでマークしました。 | |||
デフォルトで起動するとarchive.todayからツイートの魚拓を収集するモードになります。 | |||
しかし魚拓からは取れないデータがあったり、Nitterと違ってHTMLの構造がちょこちょこ変わったりするので困りました… | |||
何か代替策は無いですかね…--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2024年2月16日 (金) 19:01 (JST) | |||
:[https://xcancel.com/ xcancel.com]だったらまだ生きてるのでそちらはどうでしょうか?.onionではないため匿名性は落ちますがNitterのHTMLは吐くと思います。ただ当職は時間も知識も無いためこういった提案しか出来ませんが…--[[利用者:化学に強い弁護士|化学に強い弁護士]] ([[利用者・トーク:化学に強い弁護士|トーク]]) 2024年9月1日 (日) 15:03 (JST) | |||
=== v4.4.0 === | |||
<code>-u</code>と<code>--krsw</code>オプションを同時に選択した際に、<code>--krsw</code>に引数を与えると、その文言で自動停止する機能を追加しました。 | |||
利用例 | |||
:<code>python3 script.py -u --krsw 稲ちゃんが不正ログインと言っているんだ。みんなこれは解散だよ。</code> | |||
<code>--krsw</code>に引数を与えない、<code>--krsw</code>を利用しない、あるいは<code>-u</code>を利用しない場合の動作は今まで通りです。--[[利用者:Fet-Fe|Fet-Fe]] ([[利用者・トーク:Fet-Fe|トーク]]) 2024年9月4日 (水) 02:07 (JST) | |||
==脚注== | |||
<references /> |
2024年9月4日 (水) 02:08時点における最新版
てすや
スクリプトに欲しい機能
適当に思いついたのを追加していってほしいですを
- こんな感じで箇条書きにしてください。
- 日付まで自動で出力できるとしばらく収集をサボっても楽ですね(ロジックが大幅に変わりそうですが)--Fet-Fe (トーク) 2022年9月10日 (土) 01:22 (JST)
- オプションで--krswを指定した時にも上限以内で引っかかった書き込みがあると自動停止する機能が欲しいですを
例えば--stop-condition "稲ちゃんが不正ログインと言っているんだ。みんなこれは解散だよ。"[1]と書いたら https://x.com/CallinShow/status/1818847336296333529 で自動停止するといった次第でふ
\nで改行を指定出来る仕様はあっても無くても構いません。--唐澤貴洋 部下に熱湯 (トーク) 2024年9月1日 (日) 04:20 (JST)
利用者:夜泣き/スクリプトについて
提案 - どうせrequestモジュールでpipが必要ならBeautifulSoupも入れてしまえば、HTMLから文字を抜き出す際にgrepやreを使うよりもすっきり書けると思います。貴職がどういうロジックにするつもりなのかまだわかりませんが--Fet-Fe (トーク) 2022年6月16日 (木) 23:26 (JST)
- コメント - それは思ってました。標準のみか追加するかの2択しかないんで後者ならたぶん使うことになるでしょう。BeautifulSoupのほうは使ったこと無いってのがネックですがなんとかなるでしょう。--夜泣き (トーク) 2022年6月16日 (木) 23:31 (JST)
- 返信 - 当職も利用者:Fet-Fe#恒心教徒の皆様へ:当Wikiのソースの魚拓取得をお手伝い下さいで少しだけ使ったので、よろしければ参考にして下さい。不慣れだったので効率の悪い書き方かもしれませんが--Fet-Fe (トーク) 2022年6月17日 (金) 00:33 (JST)
コメント - 出会いに感謝。すごく読みやすいです。取り敢えず思ったことを
- テンプレート:Archiveではなくテンプレート:CallinShowLinkを使っていただけると嬉しいです
- DoS攻撃になりかねないので
request_onetime
にsleep(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)
- テンプレート:Archiveではなくテンプレート:CallinShowLink
- 存在を失念しておりました。修正コスト安そうなのでバグ取りと同時に直してしまいます。
- 直しました。
- 存在を失念しておりました。修正コスト安そうなのでバグ取りと同時に直してしまいます。
request_onetime
にsleep(1)
を入れた方が良い- 失敗した時は長く待ってリトライさせるために失敗用と成功用で待ち時間分けて失敗した時はrequestメソッド内で5秒待ち成功した時はrequestメソッド呼び出した後に呼出側で必ず1秒待つようにしてるのでDOS攻撃は一応大丈夫です。request_onetimeで必ず1秒待って失敗したとき追加で4秒待たせればいいだけなので指摘されると確かにいいコードではないですね。
- 直しました。
- 失敗した時は長く待ってリトライさせるために失敗用と成功用で待ち時間分けて失敗した時は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オブジェクトなので無理だと思ってました。それに使ってる中で動かなかった記憶もありますが別の理由でエラーだったのかもしれないですしあとで試してみます。
- 普通にいけました。貴職有能当職無能。
- ガチなのですか?soupはBeautifulSoupオブジェクトでfind使って取得したのはTagオブジェクトなので無理だと思ってました。それに使ってる中で動かなかった記憶もありますが別の理由でエラーだったのかもしれないですしあとで試してみます。
--夜泣き (トーク) 2022年6月20日 (月) 22:19 (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)
- 返信 - グレードアップされている、これはいい。有能なFet-Fe師との出会いに感謝。貴職の能力見てると当職のコードは実にお粗末ですわ・・・お勉強中なので許してクレメンス。ソース独占するつもりはないので触ってもらって全然大丈夫ですよ。もし不具合出ても編集履歴から戻せますし。--夜泣き (トーク) 2022年8月14日 (日) 23:25 (JST)
- コメント - ちょっと動けないタイミングなんでいろいろ対応することあっても今は少し無理ですみません。スクリプト恒心してもらうのは全然OKです。どこかのデブみたいに三日坊主で飽きたわけじゃないですのでご了承ください。やったほうがいいことがあれば書いといてもらえればいけるタイミングで対処します。--夜泣き (トーク) 2022年8月14日 (日) 23:33 (JST)
報告 - ツイートに含まれる行の頭に半角スペースがあるとWiki記法として認識されてしまうようです。修正しようとすると、<nowiki> </nowiki>
と書いても 
と書いても行頭スペースが反映されないのでなんとも言えないですわ・・・・・・--Fet-Fe (トーク) 2022年8月22日 (月) 01:58 (JST)
提案 - あと日付まで自動で出力できるとしばらく収集をサボっても楽ですね--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)
- 返信 - 見逃しててガチでスマン。普段の環境と違う環境でしかツイとウィッキ垢運用してないから完全に見るの忘れてました。当職 無能 頭唐澤。貴職がグレードアップしていってくれて感謝してます。上に追加してほしい機能欄を作ったので追加しといてくれれば作れる範囲で作ります。最近ほとんど貴職が作ってくれていて申し訳ないので。--夜泣き (トーク) 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のスクリプトが現在正常に動作しません。
原因として、
- Tor版のnitterがtwitterの情報を取ってこられない
- 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)
- 返信 -
typing.Self
はpython3.11以上じゃないと使えないみたいですね。3.10以上指定も3.11以上指定もあまり変わらないと思うので、推奨環境を変更しておきます。当職 無能
あとWhonixのTor Browserのデフォルトの起動パスを教えていただけますか?今はSeleniumAccessor.TOR_BROWSER_PATHS['Linux']
を空にしているので、そこを埋めないと動かないです--Fet-Fe (トーク) 2023年9月27日 (水) 23:48 (JST)
v4.0.3
TODO
- 動画を自動取得できるようにする
- JavaScriptのオンオフを途中で切り替えられるようにする(必要?)
- _failや_make_txtではexitで終了するのをやめ、正常終了時はループを抜けて終了するようにする。
- PEP8に準拠した書き方にする
- docstringを修正する
- バグがないか確認する
プログラム実行時のエラー
(venv) user@host:~/Desktop$ python3.11 '/home/user/Desktop/降臨ショー.py' 2023-09-28 13:27:45,358 [WARN] : reCAPTCHA対策のためJavaScriptをonにしますを Traceback (most recent call last): File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/driver_finder.py", line 38, in get_path path = SeleniumManager().driver_location(options) if path is None else path ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/selenium_manager.py", line 98, in driver_location output = self.run(args) ^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/selenium_manager.py", line 144, in run raise WebDriverException(f"Unsuccessful command executed: {command}.\n{result}{stderr}") selenium.common.exceptions.WebDriverException: Message: Unsuccessful command executed: /home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/linux/selenium-manager --browser firefox --browser-path /usr/bin/torbrowser --output json. {'code': 65, 'message': 'error sending request for url (https://product-details.mozilla.org/1.0/firefox_versions.json): error trying to connect: dns error: failed to lookup address information: Name does not resolve', 'driver_path': '', 'browser_path': ''} The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/user/Desktop/降臨ショー.py", line 339, in __init__ self.driver: webdriver.Firefox = webdriver.Firefox(options=options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ self.service.path = DriverFinder.get_path(self.service, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.11/site-packages/selenium/webdriver/common/driver_finder.py", line 41, in get_path raise NoSuchDriverException(msg) from err selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/user/Desktop/降臨ショー.py", line 1537, in <module> twitter_archiver.execute( File "/home/user/Desktop/降臨ショー.py", line 1495, in execute with AccessorHandler(use_browser, enable_javascript) as accessor: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/Desktop/降臨ショー.py", line 435, in __init__ self.selenium_accessor: SeleniumAccessor | None = SeleniumAccessor( ^^^^^^^^^^^^^^^^^ File "/home/user/Desktop/降臨ショー.py", line 352, in __init__ self.quit() File "/home/user/Desktop/降臨ショー.py", line 358, in quit if self.driver: ^^^^^^^^^^^ AttributeError: 'SeleniumAccessor' object has no attribute 'driver'
また、実行時にこのようなエラーをウィンドウで出力したため、別のところに原因があるのかもしれません。
The following link will be opened in x-www-browser (/usr/bin/whichbrowser). Be careful if x-www-browser (/usr/bin/whichbrowser) is already running as your activities might get linked. -v Continue?
恐らくTorブラウザのバイナリの場所はあってると思いますが、もう一度調査してみます。--化学に強い弁護士 (トーク) 2023年9月28日 (木) 22:33 (JST)
- 返信 - プログラムのエラーについては実装ミスでした。v4.0.4で同じ操作をして、エラーが出なくなっているか確かめていただけると幸いです。実行時にウィンドウで出ているエラーについてですが、"Continue?"と尋ねられているので、エラーではなくそのまま操作を続けるかどうか聞かれています。
y
とかyes
とか打てばそのまま動くのではないでしょうか--Fet-Fe (トーク) 2023年9月29日 (金) 02:42 (JST)
v4.0.5
上記TODO解消--Fet-Fe (トーク) 2023年10月1日 (日) 16:42 (JST)
v4.1.0
- Pythonの対応バージョンが3.12.0以上になりました。
- archive.todayからwiki未掲載のツイートのURLを収集する機能を追加しました。起動時に
-u
または--search_unarchived
オプションをつけるとそのモードになります--Fet-Fe (トーク) 2023年10月9日 (月) 00:49 (JST)
- コメント - Whonix Workstationを日本語化した当職の環境が悪いのか分かりませんが、下記のエラーを出力して止まりました。相変わらずブラウザーを起動しますか(要約)というエラーは引き続き出ていますが、恐らく別の箇所でエラーが発生しているかと思われます。
プログラム実行時のエラー
(venv) user@host:~$ python3.12 '/home/user/Desktop/降臨ショー.py' 2023-10-19 15:05:34,891 [WARN] : reCAPTCHA対策のためJavaScriptをonにしますを Traceback (most recent call last): File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/driver_finder.py", line 38, in get_path path = SeleniumManager().driver_location(options) if path is None else path ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/selenium_manager.py", line 98, in driver_location output = self.run(args) ^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/selenium_manager.py", line 144, in run raise WebDriverException(f"Unsuccessful command executed: {command}.\n{result}{stderr}") selenium.common.exceptions.WebDriverException: Message: Unsuccessful command executed: /home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/linux/selenium-manager --browser firefox --browser-path /usr/bin/torbrowser --output json. {'code': 65, 'message': 'error sending request for url (https://ftp.mozilla.org/pub/firefox/releases/118.0.2/linux-x86_64/en-US/firefox-118.0.2.tar.bz2): error trying to connect: dns error: failed to lookup address information: Try again', 'driver_path': '', 'browser_path': ''} The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/user/Desktop/降臨ショー.py", line 2029, in <module> twitter_archiver.execute( File "/home/user/Desktop/降臨ショー.py", line 1697, in execute with AccessorHandler(use_browser, enable_javascript) as accessor: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/Desktop/降臨ショー.py", line 454, in __init__ SeleniumAccessor(enable_javascript) if use_browser else None ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/Desktop/降臨ショー.py", line 351, in __init__ self._driver: Final[webdriver.Firefox] = webdriver.Firefox( ^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/firefox/webdriver.py", line 59, in __init__ self.service.path = DriverFinder.get_path(self.service, options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/user/venv/lib/python3.12/site-packages/selenium/webdriver/common/driver_finder.py", line 41, in get_path raise NoSuchDriverException(msg) from err selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
必要なライブラリが足りない場合はライブラリが無いよ(要約)というエラーを吐くため恐らくライブラリは全て揃っています。--化学に強い弁護士 (トーク) 2023年10月20日 (金) 00:06 (JST)
- 返信 - まず先述の通り、「相変わらずブラウザーを起動しますか(要約)」はエラーではありませんので問題ありません。今回新しく出たエラーについては、プログラムがtor browserを見つけられずにfirefoxをダウンロードしようとしてしまっているんですかね?だとしたら
TOR_BROWSER_PATHS
に指定しているバイナリのパスが正しくないのかもしれないです。ただ"Unable to obtain driver"とも言っているので、https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location/ とかで解決する問題かもしれないです。--Fet-Fe (トーク) 2023年10月22日 (日) 03:04 (JST)
v4.2.0
Nitter(魚拓)が終了してしまったので、従来のモードをdeprecatedでマークしました。 デフォルトで起動するとarchive.todayからツイートの魚拓を収集するモードになります。
しかし魚拓からは取れないデータがあったり、Nitterと違ってHTMLの構造がちょこちょこ変わったりするので困りました… 何か代替策は無いですかね…--Fet-Fe (トーク) 2024年2月16日 (金) 19:01 (JST)
- xcancel.comだったらまだ生きてるのでそちらはどうでしょうか?.onionではないため匿名性は落ちますがNitterのHTMLは吐くと思います。ただ当職は時間も知識も無いためこういった提案しか出来ませんが…--化学に強い弁護士 (トーク) 2024年9月1日 (日) 15:03 (JST)
v4.4.0
-u
と--krsw
オプションを同時に選択した際に、--krsw
に引数を与えると、その文言で自動停止する機能を追加しました。
利用例
python3 script.py -u --krsw 稲ちゃんが不正ログインと言っているんだ。みんなこれは解散だよ。
--krsw
に引数を与えない、--krsw
を利用しない、あるいは-u
を利用しない場合の動作は今まで通りです。--Fet-Fe (トーク) 2024年9月4日 (水) 02:07 (JST)
脚注
- ↑ 当職の英語力は唐澤貴洋なので条件の英訳はconditionが一番適切なのかが分かりません