てすや
スクリプトに欲しい機能
適当に思いついたのを追加していってほしいですを
利用者:夜泣き/スクリプトについて
提案 - どうせ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)