編集の要約なし
>Fet-Fe (→コード) |
>Fet-Fe 編集の要約なし |
||
6行目: | 6行目: | ||
''' | ''' | ||
ver2.1. | ver2.1.2 2022/8/29恒心 | ||
当コードは恒心停止してしまったhttps://rentry.co/7298gの降臨ショーツイート自動収集スクリプトの復刻改善版です | 当コードは恒心停止してしまったhttps://rentry.co/7298gの降臨ショーツイート自動収集スクリプトの復刻改善版です | ||
216行目: | 216行目: | ||
def _check_tor(self) -> None | NoReturn: | def _check_tor(self) -> None | NoReturn: | ||
print('Torのチェック中ですを') | print('Torのチェック中ですを') | ||
res: Final[Response] = self._request_once('https://check.torproject.org/api/ip') ##リクエスト | try: | ||
res: Final[Response] = self._request_once('https://check.torproject.org/api/ip') ##リクエスト | |||
is_tor: Final[bool] = json.loads(res.text)['IsTor'] | |||
if is_tor: | |||
print('Tor OK') | |||
else: | |||
raise RuntimeError('サイトにTorのIPでアクセスできていないなりを') | |||
except requests.exceptions.ConnectionError as e: | |||
print(e, file=sys.stderr) | |||
print('通信がTorのSOCKS proxyを経由していないなりを', file=sys.stderr) | |||
exit(1) | |||
##nitterのインスタンスが生きているかチェック | ##nitterのインスタンスが生きているかチェック | ||
233行目: | 238行目: | ||
res.raise_for_status() ##HTTPステータスコードが200番台以外でエラー発生 | res.raise_for_status() ##HTTPステータスコードが200番台以外でエラー発生 | ||
except requests.exceptions.RequestException as e: ##エラー発生時は終了 | except requests.exceptions.RequestException as e: ##エラー発生時は終了 | ||
print('インスタンスが死んでますを') | print(e, file=sys.stderr) | ||
exit() | print('インスタンスが死んでますを', file=sys.stderr) | ||
exit(1) | |||
##ツイート収集するユーザー名を取得 | ##ツイート収集するユーザー名を取得 | ||
284行目: | 290行目: | ||
print("取得成功した分だけ発行しますを") | print("取得成功した分だけ発行しますを") | ||
self._make_txt() | self._make_txt() | ||
exit() ##終了 | else: | ||
exit(1) ##終了 | |||
##テキスト発行 | ##テキスト発行 | ||
293行目: | 300行目: | ||
f.write(result_txt) | f.write(result_txt) | ||
print("テキストファイル手に入ったやで〜") | print("テキストファイル手に入ったやで〜") | ||
exit() ##終了 | exit(0) ##終了 | ||
##記録を中断するツイート | ##記録を中断するツイート | ||
328行目: | 335行目: | ||
else: | else: | ||
print('https://pbs.twimg.com/media/' + media_name + ' をアップロードしなければない。') | print('https://pbs.twimg.com/media/' + media_name + ' をアップロードしなければない。') | ||
# 動画についてはm3u8で落ちてきて面倒臭いため取得しない | |||
""" | """ | ||
for video in tweet_media.select('.attachment.video-container video'): | for video in tweet_media.select('.attachment.video-container video'): | ||
344行目: | 351行目: | ||
link = re.sub('#.*$', '', link) | link = re.sub('#.*$', '', link) | ||
link = self.TWITTER_URL + link | link = self.TWITTER_URL + link | ||
quote_txt | quote_txt = '<br>\n' + self._archive_url(link, link) | ||
return quote_txt | return quote_txt | ||
362行目: | 369行目: | ||
media_txt: str = self._get_tweet_media(tweet) ##ツイートに画像などのメディアを追加 | media_txt: str = self._get_tweet_media(tweet) ##ツイートに画像などのメディアを追加 | ||
quote_txt: str = self._get_tweet_quote(tweet) ##引用リツイートの場合、元ツイートを追加 | quote_txt: str = self._get_tweet_quote(tweet) ##引用リツイートの場合、元ツイートを追加 | ||
self._txt_data = '!' + archived_tweet_url + '\n|-\n|\n' + tweet_content.get_text() | self._txt_data = '!' + archived_tweet_url + '\n|-\n|\n' \ | ||
+ self._escape_wiki_reserved_words(tweet_content.get_text()) \ | |||
+ quote_txt + media_txt + '\n|-\n' \ | |||
+ self._txt_data ##wikiの文法に変化 | |||
self._limit_count += 1 ##記録回数をカウント | self._limit_count += 1 ##記録回数をカウント | ||
if self._limit_count % self.REPORT_INTERVAL == 0: | if self._limit_count % self.REPORT_INTERVAL == 0: | ||
372行目: | 382行目: | ||
print(f"{self.LIMIT_N_TWEETS}件も記録している。もうやめにしませんか。") | print(f"{self.LIMIT_N_TWEETS}件も記録している。もうやめにしませんか。") | ||
self._make_txt() | self._make_txt() | ||
#テンプレート外の#をnowikiで囲む | |||
def _escape_hash(self, text: str) -> str: | |||
archive_begin: Final[str] = '{{Archive|' | |||
callinshowlink_begin: Final[str] = '{{CallinShowLink|' | |||
archive_end: Final[str] = '}}' | |||
current_depth: int = 0 | |||
new_text: str = '' | |||
for i in range(len(text)): | |||
if text[i:i+len(archive_begin)] == archive_begin or text[i:i+len(callinshowlink_begin)] == callinshowlink_begin: | |||
current_depth += 1 | |||
elif text[i:i+len(archive_end)] == archive_end: | |||
current_depth = max(current_depth-1, 0) | |||
if current_depth == 0 and text[i] == '#': | |||
new_text += '<nowiki>#</nowiki>' | |||
else: | |||
new_text += text[i] | |||
return new_text | |||
#MediaWiki文法と衝突する文字を無効化する | |||
def _escape_wiki_reserved_words(self, text: str) -> str: | |||
text = text.replace('\n', '<br>\n') | |||
text = re.sub(r'^ ', ' ', text, flags=re.MULTILINE) | |||
text = self._escape_hash(text) | |||
return text | |||
#tagをテンプレートArchiveの文字列に変化させる | #tagをテンプレートArchiveの文字列に変化させる | ||
380行目: | 415行目: | ||
if re.match('https' + self.NITTER_INSTANCE[4:], url.get('href')): | if re.match('https' + self.NITTER_INSTANCE[4:], url.get('href')): | ||
#Nitter上のTwitterへのリンクを直す | #Nitter上のTwitterへのリンクを直す | ||
url_link = | url_link: str = url.get('href').replace('https' + self.NITTER_INSTANCE[4:], self.TWITTER_URL + '/') | ||
url_link = re.sub('\?.*$', '', url_link) | url_link = re.sub('\?.*$', '', url_link) | ||
url.replace_with(self._archive_url(url_link, url_link)) ##テンプレートArchiveに変化 | url.replace_with(self._archive_url(url_link, url_link)) ##テンプレートArchiveに変化 | ||
elif re.match('piped.kavin.rocks/', url.text) or re.match('invidio.us/', url.text): | elif re.match('piped.kavin.rocks/', url.text) or re.match('invidio.us/', url.text): | ||
#Nitter上のYouTubeへのリンクを直す | #Nitter上のYouTubeへのリンクを直す | ||
url_link = url.get('href') | url_link: str = url.get('href') | ||
url_link = | url_link = url_link.replace('piped.kavin.rocks/', 'youtu.be/') | ||
url_link = | url_link = url_link.replace('invidio.us/', 'youtu.be/') | ||
url.replace_with(self._archive_url(url_link, url_link)) ##テンプレートArchiveに変化 | url.replace_with(self._archive_url(url_link, url_link)) ##テンプレートArchiveに変化 | ||
else: | else: | ||
394行目: | 429行目: | ||
#URLをテンプレートArchiveに変化させる | #URLをテンプレートArchiveに変化させる | ||
def _archive_url(self, url: Final[str], text: Final[str]) -> str: | def _archive_url(self, url: Final[str], text: Final[str]) -> str: | ||
return '{{Archive|1=' + url + '|2=' + self._archive(url) + '|3=' + text + '}}' ##テンプレートArchiveの文字列返す | return '{{Archive|1=' + unquote(url) + '|2=' + self._archive(url) + '|3=' + unquote(text) + '}}' ##テンプレートArchiveの文字列返す | ||
#URLをテンプレートCallinShowlinkに変化させる | #URLをテンプレートCallinShowlinkに変化させる | ||
402行目: | 437行目: | ||
##URLから魚拓返す | ##URLから魚拓返す | ||
def _archive(self, url: Final[str]) -> str: | def _archive(self, url: Final[str]) -> str: | ||
archive_url: str = self.ARCHIVE_TODAY_STANDARD + | archive_url: str = self.ARCHIVE_TODAY_STANDARD + url.replace('#', '%23') ##wikiに載せるとき用URLで失敗するとこのままhttps://archive.ph/https://xxxxxxxxの形で返される | ||
res: Final[Response | None] = self._request(self.ARCHIVE_TODAY + | res: Final[Response | None] = self._request(self.ARCHIVE_TODAY + url.replace('#', '%23')) ##アクセス用URL使って結果を取得 | ||
if res is None : ##魚拓接続失敗時処理 | if res is None : ##魚拓接続失敗時処理 | ||
print(archive_url + 'にアクセス失敗ナリ。出力されるテキストにはそのまま記載されるナリ。') | print(archive_url + 'にアクセス失敗ナリ。出力されるテキストにはそのまま記載されるナリ。') | ||
435行目: | 470行目: | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
if sys.version_info.major < 3 or (sys.version_info.major == 3 and sys.version_info.minor < 10): | |||
print('Pythonのバージョンを3.10以上に上げて下さい', file=sys.stderr) | |||
exit(1) | |||
krsw: Final[bool] = len(sys.argv) > 1 and sys.argv[1] == 'krsw' ##コマンドライン引数があるかどうかのフラグ | krsw: Final[bool] = len(sys.argv) > 1 and sys.argv[1] == 'krsw' ##コマンドライン引数があるかどうかのフラグ | ||
twitter_archiver: TwitterArchiver = TwitterArchiver(krsw) | twitter_archiver: TwitterArchiver = TwitterArchiver(krsw) | ||
447行目: | 485行目: | ||
20件での実行例。 | 20件での実行例。 | ||
{|class="wikitable" style="text-align: left;" | {|class="wikitable" style="text-align: left;" | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563171863043325954|2=https://archive.ph/jkfiW}} | ||
|- | |||
| | |||
明日は明日の風が吹く!!!<br> | |||
{{Archive|1=https://twitter.com/rumaimai288/status/1563136444230926341|2=https://archive.ph/eA4bp|3=https://twitter.com/rumaimai288/status/1563136444230926341}} | |||
|- | |||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563179306477449216|2=https://archive.ph/7GnmJ}} | |||
|- | |- | ||
| | | | ||
そうなるよな。<br> | |||
{{Archive|1=https://twitter.com/itm_nlab/status/1563041010963296261|2=https://archive.ph/xPWIY|3=https://twitter.com/itm_nlab/status/1563041010963296261}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563184989369315329|2=https://archive.ph/J4P2z}} | ||
|- | |- | ||
| | | | ||
昔、渋谷の東宝の映画館で見たな。<br> | |||
{{Archive|1=https://twitter.com/kinro_ntv/status/1562741577184731136|2=https://archive.ph/o3p1C|3=https://twitter.com/kinro_ntv/status/1562741577184731136}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563406043119783936|2=https://archive.ph/e7Bcv}} | ||
|- | |- | ||
| | | | ||
これは良くない。<br> | |||
<br> | <br> | ||
日中、会社の車だろ。<br> | |||
{{Archive|1=https://twitter.com/pachipachisukki/status/1558433177408274432|2=https://archive.ph/r3Hzf|3=https://twitter.com/pachipachisukki/status/1558433177408274432}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563469935099011073|2=https://archive.ph/eon5H}} | ||
|- | |- | ||
| | | | ||
政権を担った全ての政党に責任。<br> | |||
<br> | |||
民主党だった人たちも含めてだ。<br> | |||
<br> | |||
放置してきたんだ。<br> | |||
解散総選挙をしよう。<br> | |||
<br> | <br> | ||
民意をもう一度問うために。<br> | |||
{{Archive|1=https://twitter.com/tbs_houtoku/status/1563429510682669058|2=https://archive.ph/WUk14|3=https://twitter.com/tbs_houtoku/status/1563429510682669058}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563471832316923904|2=https://archive.ph/ci34j}} | ||
|- | |- | ||
| | | | ||
立憲民主党はこの14人が議員辞職してみるくらいかっこいいことしてから追及してほしい。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563472582229209089|2=https://archive.ph/DhMyI}} | ||
|- | |- | ||
| | | | ||
二大政党制は期待できない。<br> | |||
<br> | |||
今は第三極が必要なんだ。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563477985893658624|2=https://archive.ph/pqsll}} | ||
|- | |- | ||
| | | | ||
{{Archive|1=https://www.iza.ne.jp/article/20220825-GBGV6NOE5BNWJHT3MSN47LXYCA/photo/E7XLVXDSQJJEXEG7AUTFABQ2GI/?utm_source=yahoo news feed&utm_medium=referral&utm_campaign=related_link|2=https://archive.ph/UKMYM|3=https://www.iza.ne.jp/article/20220825-GBGV6NOE5BNWJHT3MSN47LXYCA/photo/E7XLVXDSQJJEXEG7AUTFABQ2GI/?utm_source=yahoo news feed&utm_medium=referral&utm_campaign=related_link}}<br> | |||
<br> | |||
身の丈にあわないものを求めるとかっこ悪いっていう象徴。<br> | |||
<br> | |||
背景に写っている山の山頂は見えない。<br> | |||
<br> | |||
五里霧中。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563480030466154497|2=https://archive.ph/by77Y}} | ||
|- | |- | ||
| | | | ||
金を貯め込む人がいる。<br> | |||
<br> | <br> | ||
人のために使った方がいいよ。<br> | |||
<br> | <br> | ||
金を抱いて死ぬことはできないんだぜ。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563514805356756992|2=https://archive.ph/vAqUv}} | ||
|- | |- | ||
| | | | ||
弁護士唐澤貴洋への匿名のメッセージを募集中!<br> | |||
<br> | <nowiki>#</nowiki>マシュマロを投げ合おう<br> | ||
{{Archive|1=https://marshmallow-qa.com/apt/e52b0b30-c815-4fdb-8a9c-409a6b8a650b|2=https://archive.ph/O6g3k|3=https://marshmallow-qa.com/apt/e52b0b30-c815-4fdb-8a9c-409a6b8a650b}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563518352777445378|2=https://archive.ph/GPVPd}} | ||
|- | |- | ||
| | | | ||
コパノリッキーを獲得🏇<br> | |||
[[ファイル:FbK7jfiagAADYSm.jpg|240px]] | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563709530797527040|2=https://archive.ph/y7fte}} | ||
|- | |- | ||
| | | | ||
本当その通りだ。<br> | |||
<br> | <br> | ||
銀座に飲みに行ってみろ。<br> | |||
<br> | <br> | ||
そんな飲み方しているやつなんかみたことない。<br> | |||
<br> | <br> | ||
遊び方を知らない奴が、嫉妬妄想で仕方ないよねとか言ってるんだ。<br> | |||
<br> | <br> | ||
性的被害に遭うのは仕方がないとか、人権意識ゼロの発言。<br> | |||
<br> | <br> | ||
接待を伴う飲食業は、立派な仕事だ。<br> | |||
{{Archive|1=https://twitter.com/hone_hone_kotu/status/1562287607681146881|2=https://archive.ph/5I5HF|3=https://twitter.com/hone_hone_kotu/status/1562287607681146881}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563713254584553472|2=https://archive.ph/ZNeTh}} | ||
|- | |- | ||
| | | | ||
今回問題になった香川照之さんみたいな飲み方は、カッコ悪くて、そんなの真似してたら嘲笑、出禁、通報。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563822049453256705|2=https://archive.ph/1udCZ}} | ||
|- | |- | ||
| | | | ||
接待を伴う飲食店についての考え方だったり、店の中での振る舞いでわかる。<br> | |||
<br> | <br> | ||
お金を使うのが無駄っていう人は、単なるケチ、女性にお金を使ったら負けくらいの精神の持ち主、一緒にいても楽しくない。<br> | |||
<br> | <br> | ||
振る舞いが悪いのは、自己評価が過大な人間。<br> | |||
過大なので、更衣室のネタ。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563822588249272320|2=https://archive.ph/4CcE4}} | ||
|- | |- | ||
| | | | ||
接待を伴う飲食店の全ての痛客に向けて。<br> | |||
<br> | <br> | ||
{{Archive|1=https://note.com/takahirokarasawa/n/nd7f01ba99c74|2=https://archive.ph/Hte73|3=https://note.com/takahirokarasawa/n/nd7f01ba99c74}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563833420492316673|2=https://archive.ph/cOFo8}} | ||
|- | |- | ||
| | | | ||
ドンマイ川端!<br> | |||
{{Archive|1=https://twitter.com/KAWABATA1129/status/1563706260645871616|2=https://archive.ph/OFcSs|3=https://twitter.com/KAWABATA1129/status/1563706260645871616}} | |||
{{Archive|1=https:// | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563890352960204800|2=https://archive.ph/pUjWT}} | ||
|- | |- | ||
| | | | ||
{{Archive|1=https:// | {{Archive|1=https://marshmallow-qa.com/callinshow?utm_medium=url_text&utm_source=promotion|2=https://archive.ph/2BvG5|3=https://marshmallow-qa.com/callinshow?utm_medium=url_text&utm_source=promotion}}<br> | ||
<br> | <br> | ||
フォロワーの人で何か質問がある人待っています😊 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563891616901111808|2=https://archive.ph/QAjmW}} | ||
|- | |- | ||
| | | | ||
このツィートが意味がわからない人へ。<br> | |||
<br> | |||
川端さんが試合で負けたことに対して、<br> | |||
一ファンとして<br> | |||
<br> | |||
ドンマイ + 川端<br> | |||
<br> | |||
という意味でツイートしたものです。<br> | |||
{{Archive|1=https://twitter.com/CallinShow/status/1563833420492316673|2=https://archive.ph/cOFo8|3=https://twitter.com/CallinShow/status/1563833420492316673}} | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563913356511428608|2=https://archive.ph/u8HnK}} | ||
|- | |- | ||
| | | | ||
アーシュラ・K・ル・グィンの「オメラスから歩み去る人々」を読む。<br> | |||
<br> | |||
ネットの中で誹謗中傷する人たちは、理想郷とも思えるオメラスに住み、オメラスの地下牢にいる子どもを作ることで、安定を得ようとする。 | |||
|- | |- | ||
!{{CallinShowLink|1=https://twitter.com/CallinShow/status/ | !{{CallinShowLink|1=https://twitter.com/CallinShow/status/1563913838881554432|2=https://archive.ph/BgbEh}} | ||
|- | |- | ||
| | | | ||
現代社会においてオメラスは入れ子構造になっている。<br> | |||
<br> | |||
オメラスとされるところは、実は地下牢なんだと気付けるか。<br> | |||
<br> | |||
オメラスを去ることはできるのか。<br> | |||
{{Archive|1=https://twitter.com/CallinShow/status/1563913356511428608|2=https://archive.ph/u8HnK|3=https://twitter.com/CallinShow/status/1563913356511428608}} | |||
|- | |- | ||
|} | |} |