それは月が暗く風が強く、風雨が交じり、手を伸ばしても五本の指が見えないような暗い夜で、何かが起こるような気配がした。
"事故" が起こり、さらにパンデミックの影響で、私は一時的に "植物人間" になり、二次元に行くところだったが、幸運にも "救出" された。この数年、私を探してくれた人たちからの連絡も受け取れなかった。私を気にかけてくれた人たちに感謝します。ありがとうございます。
間違っているのは私ではなく、この運命づけられた世界です。
これらの数年間、私を探してくれた人や事柄について、私は全く知らない。QQ や WeChat のメッセージもあまりに古くて受け取れなかった。
私の何年も点灯していなかったアイコンが再び点灯したのを見て、多くの友人がどうしたのか尋ねてきました。
面識のないネットユーザーたちに感謝します。友達と呼ぶ方が親しみやすいかもしれません。あなたたちが私を気にかけてくれていることに感動しています。
探し続けて三年が経ちました。
世界中で私を探してくれています。
感動のあまりたまりません。
以下が本文です。
ブログについて#
ブログは 2016 年 6 月 9 日に初めて設立され、今ではほぼ 8 年が経ち、さまざまな災害の中でもたくましく生き延びてきました。
その間に多くの仲間と出会い、一緒に議論し、一緒に成長してきました。だから、私はブログを消したくありません。
ブログのデータは元々七牛クラウドに自動バックアップされていましたが、今まで知らなかったのですが、バックアップが何らかの理由で 2019 年 10 月頃に停止してしまいました。
インターネットには記憶があると言われています。「頭は断てど血は流れ、データは失われてはならない」という精神のもと、私は広大なネットの中で数日間探し続け、最終的にブログのウェブサイトのアーカイブを見つけました。ここをクリックして私のブログの歴史的バージョンを見てくださいarchive (海外の有名なウェブアーカイブプロジェクト)
それで、Python スクリプトを書いて記事とコメントデータをスクレイピングしました。
スクレイピングが終わった後、誰かがすでに私のためにバックアップを取ってくれていることに気づきました(私のブログは以前、他の人に 3 年間スポンサーされていました)。
ブログの移転#
ブログはブログ園に移転しましたが、実際にはやむを得ずそうなりました。
ブログの元のドメイン名(52ecy.cn, moeins.cn, moeins.com)は期限切れ後に他の人に取得され、コミュニケーションがうまくいかず、しばらくは取り戻せない状況です。
仕方がないので、ブログを一時的にブログ園に移転することにしました(その後、自分で構築するかどうかはまた考えます)。また、今は自分のシステムをいじる余裕があまりないので、ブログ園に置く方がむしろ安心で楽です。しかし、コメントは少し不便になり、ログインしないとコメントできません。もちろん、何か問題があれば直接グループで @私に連絡してください。
実は 18 年末にはテーマを変更したいと思っていました ->これで本当にダメになった (私は本当に引き延ばすことが得意で、自分に感心します)
残念ながら、以前の emlog システムには適切なものがなく、自分で移植するのが面倒だったので、ずっと先延ばしにしていました。
以前のテーマはずっと変えたかったのですが、あまり見栄えが良くなく、個性がなく、ただ規則正しいだけで、私の個性やスタイルには合いませんでした。
でも、私の美的感覚は素晴らしいですが、自分の美的感覚に合ったテーマを自分で作るのは少し難しいです。
その後、突然ブログ園のユーザー不忘编码のブログを見て、ブログ園がこのように自分で美化できることに気づきました。
「彼のブログがこれからも失われず、アクセスできなくなるのは嫌だ」という一言で、しばらくブログ園に移転することに決めました。
ずっとこのような二次元スタイルのテーマに変えたかったのです。
現在、このブログの美化スタイルは桜花荘の白猫の WordPress テーマ Sakura に基づいており、不忘编码が移植しましたが、バグや細かい問題が多く、私はさらに 2 日間最適化しましたが、多くのページは最適化されていません。後でゆっくりやります~~(明日できることをなぜ明日の私に任せないのか)~~
以前の emlog ブログは HTML の TinyMCE エディタを使用しており、しかも非常に古いバージョンだったため、生成された記事の HTML コードも非常に混乱していました。そのため、ブログ園に移転する際に多くのスタイルの互換性の問題が発生しましたが、私はできる限り修正しました。しかし、すべての記事が正常に表示されることは保証できませんので、見かけたらゆっくり修正していきます。
ブログ園は自分で構築したブログシステムのワンクリック移転機能をサポートしていないため、記事の公開日時やコメント情報を一緒に移転することはできませんが、私は元の味を保ちたいと思ったので、それを記事に書き込みました。プライベートコメントも隠されています。
(自分で構築したブログシステムの問題についてもブログ園のチームとコミュニケーションを取りました。後で開発に加えると言っていましたので、彼らを困らせることはありません。彼らも資金が足りないので、記事の公開には Cnblog の VScode プラグインを使用しました)
友達リンクも別のページを作って移転しましたが、多くの友達リンクのサイトもすでにアクセスできなくなっています。一部は友達リンクを削除しています。
今の私は独立したドメイン名ではなく、友達リンクを申請するのも恥ずかしいです.....
以前のブログのすべての画像は新浪に保存されており、いつか失われるのではないかと心配していたので、普段は七牛クラウドと新浪の両方に保存していましたが、今はすべてブログ園に移転しました。
なぜブログを書くのか?#
これらはそんなに重要だと思いますか?
時々、私は何かを言いたい、何かを書きたいと思うことがありますが、誰も言わず、書く場所もなく、そんな場所が必要です。
私はブログを作るのは、流量やお金のためではなく、自分の小さな天地を作り、自分の小さな圈子で気ままに過ごしたいからです。
おそらくこの愛情があるからこそ、私は徐々に続けることができたのでしょう。しかし、思い通りにはいかず、少しの事故が起こりました。
以前の多くのブログ仲間は、いなくなったり、更新しなくなったりして、本当に残念です。私は彼らに会う時間もありませんでした~~(特に月宅のあいつ)~~
@寒穹 あいつは私に言った:“阿珏、そんなに長い間、どうしてまだそんなに二次元なんだ?”
私は、これまでの年月の中で、変わらなかったのは私だけだと思います。
とても嬉しく、感謝しています。まだ多くの人が私を覚えていて、私に優しくしてくれることに感謝します。
こんなに多くの画像を投稿するべきではなかったようです。
失われたブログを記念して、永遠に私の 127 に生き続けます。
Python コード#
移転のための Python コードは、あまり役に立たないかもしれませんが、記録として残しておきます。必要な人が学べるように。
コードを見るにはクリックしてください
import os
import re
import time
import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs
# 指定ファイルパス
file_path = "C:\\Users\\Administrator\\Desktop\\blog\\content.txt"
save_folder = "C:\\Users\\Administrator\\Desktop\\blog\\content\\"
def save_to_file(data, file_name):
try:
file_path = os.path.join(save_folder, file_name + ".txt")
with open(file_path, 'a', encoding='utf-8') as file:
file.write(data)
print("データがファイルに正常に保存されました:", file_path)
except Exception as e:
print("ファイル保存中にエラーが発生しました:", e)
def remove_html_tags(text):
soup = BeautifulSoup(text, 'html.parser')
return soup.get_text()
def comment(html_content):
comment_matches = re.findall(r'<div class="comment (.*?)" id="comment-\d+">[\s\S]*?<img .*?inal=".*?202.*?/([^"]+)"/>[\s\S]*?<div ' +
'class="comment-content">(.*?)</div>[\s\S]*?itle=".*?">(.*?)</span>[\s\S]*?<span class="comment-time">(.*?)</span>',
html_content, re.DOTALL)
article_comments = ''
if comment_matches:
i = 0
for comment_match in comment_matches:
if 'comment-children' in comment_match[0]:
i += 1
is_reply_comment = '>' * i
else:
is_reply_comment = '>'
i = 1
# アバター 大きさを40に制御
# gravatarアバターとの互換性 https://secure.gravatar.com/avatar/
if 'gravatar.com' in comment_match[1]:
avatar_url = '![](' + str(re.sub(r'(\?|&)s=\d+', '\\1s=40', str(comment_match[1]))) + ') '
else:
parsed_url = urlparse(comment_match[1])
query_params = parse_qs(parsed_url.query)
dst_uin = query_params.get('dst_uin', ['1638211921'])
avatar_url = '![]('+'https://q1.qlogo.cn/g?b=qq&nk='+str(dst_uin[0])+'&s=40'+') '
comment_content = comment_match[2].strip()
nickname = comment_match[3].strip()
comment_time = comment_match[4].strip()
link_url = re.search(r'030.*?/(.*?)" .*? rel', nickname)
# コメントのMarkdown形式を構築
comment_content = is_reply_comment + comment_content.replace('\n', '>')
comment_content = comment_content.replace('##このコメントはプライベートコメントです##', '[#このコメントはプライベートコメントです#]')
# 絵文字画像を置き換え
soup = BeautifulSoup(comment_content, 'html.parser')
for img in soup.find_all('img'):
title_text = img.get('title', '')
img.replace_with('[#'+title_text+']')
comment_content = soup.get_text()
# コメントユーザーのURLアドレスを保存
if link_url:
nickname = '['+remove_html_tags(nickname)+']'
link_url = '(' + link_url[1] + ') '
else:
link_url = ''
nickname = remove_html_tags(nickname) + ' '
if i == 1:
article_comments += '\n'
article_comments += is_reply_comment + avatar_url + nickname + link_url + comment_time + '\n' + comment_content + '\n'
return article_comments
else:
return ''
def process_article(url):
print("現在実行中===="+url)
response = requests.get(url)
if response.status_code == 200:
html_content = response.text
soup = BeautifulSoup(html_content, 'html.parser')
article_title = soup.find('h1', class_='article-title')
article_mate = soup.find('div', class_='article-meta')
article_article = soup.find('article', class_='article-content')
soup_content = BeautifulSoup(article_article.prettify(), 'html.parser')
img_tags = soup_content.find_all('img')
pattern = r"https://web.*?_/"
for img_tag in img_tags:
if 'data-original' in img_tag.attrs:
original_url = img_tag['data-original']
else:
original_url = img_tag['src']
cleaned_url = re.sub(pattern, '', original_url)
new_url = 'https://image.baidu.com/search/down?url=' + cleaned_url
img_tag['src'] = new_url
del img_tag['data-original']
article_comment = soup.find('div', class_='article_comment_list')
data = "###### `このメッセージが表示されるとき、現在の記事は元のemlogブログシステムから移転されたもので、記事の公開日時は非常に古く、編成や内容が完全でない可能性がありますので、ご了承ください`\n\n" + '###' + article_title.text.strip()+'\n\n'+article_mate.text.strip().replace('\n', '').replace('\r', '').replace('\t', '')+'\n' + soup_content.prettify().replace('<article class="article-content">', '').replace('</article>', '')
save_to_file(data + '\nネットユーザーのコメント:\n\n', article_title.text.strip())
data = comment(html_content)
if not data:
return
save_to_file(data, article_title.text.strip())
if article_comment:
comment_links = re.findall(r'<a\s+href="(.*?)nts"', str(article_comment))
if comment_links:
print('ページ分けされたコメントデータがあります')
for link in comment_links:
url = link +"nts"
print(url)
response = requests.get(url)
if response.status_code == 200:
html_content = response.text
data = comment(html_content)
if not data:
return
save_to_file(data, article_title.text.strip())
print("ページ分けされたコメントデータを書き込んでいます")
else:
print("ウェブページの取得に失敗しました。")
def main():
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
segments = line.strip().split("----")
if len(segments) > 0:
url = segments[0]
process_article(url)
else:
print("行にURLが見つかりません。")
print('次の記事を開始します')
time.sleep(4)
if __name__ == "__main__":
main()