てすや
利用者:夜泣き/スクリプトについて
提案 - どうせ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)