情報の自由な流通と共有はインターネットの最大の魅力の一つです。
より自由でオープンなインターネットへの憧れから、私はフラグメント化された情報配信プラットフォームを導入することを決めました。これには Nostr(Notes and Other Stuff Transmitted by Relays)が含まれます。Nostr は電子メールプロトコルに似たプロトコルであり、Damus のような Nostr クライアントは分散型の Twitter のようなものと考えることができます。
この記事では Nostr プロトコルと Python を使用して Nostr Post 情報を公開する方法について説明します。
この記事の著者に関心がある場合は、こちらのページにアクセスしてください。
Nostr の紹介#
- プロトコルの概要:nostr-protocol/nostr: a truly censorship-resistant alternative to Twitter that has a chance of working
- プロトコルの詳細:nostr-protocol/nips: Nostr Implementation Possibilities
通信プロセス#
- このプロトコルには、クライアントとリレーの 2 つの要素があります。クライアントはユーザーのソーシャルクライアントであり、リレーは転送サーバーです。
- ユーザーは登録する必要はありません。ユーザーは公開鍵と秘密鍵のペアを持っているだけで、送信する情報に署名し、一連のリレーに送信するだけです。
- その後、フォロワーはこれらのリレーからあなたの情報を購読することができます(公開鍵を入力することで)。
技術的な詳細の要約#
-
技術的な実装では、Nostr は websocket + JSON の方式を使用しています。主なコマンドは次のとおりです。
-
クライアントからリレーへの主なコマンド:
EVENT
。イベントを送信します。これにより、情報の送信、削除、移行、チャネルの作成など、さまざまなアクションを拡張することができます。非常に柔軟です。REQ
。イベントのリクエストと更新の購読に使用されます。REQ
メッセージを受け取ると、リレーは内部データベースをクエリし、フィルタに一致するイベントを返し、そのフィルタを保存し、将来のすべてのイベントを同じ websocket に再送信します(websocket が閉じられるまで)。CLOSE
。REQ
で要求された購読を停止するために使用されます。
-
リレーからクライアントへの主なコマンド:
EVENT
。クライアントのリクエストイベントを送信するために使用されます。NOTICE
。クライアントに対して人間が読めるエラーメッセージやその他の情報を送信するために使用されます。
-
-
EVENT
に関する以下はいくつかの一般的な基本イベントです:0
:set_metadata
:ユーザー名、ユーザーアバター、ユーザープロフィールなどのメタデータです。1
:text_note
:ユーザーが送信するテキスト情報2
:recommend_server
:フォロワーに推奨する Relay の URL(例:wss://somerelay.com
)
Python で Nostr 情報を公開する#
目標#
- 要件:プライベートキーとテキスト文字列を提供し、Python を使用して Nostr の純粋なテキスト Post 情報を公開する
- できるだけ多くのプラットフォームをサポートする
ソリューション#
ライブラリを使用します。
jeffthibault/python-nostr: A Python library for Nostr は、実際の操作で secp256k1 に依存しており、Windows システムでは使いづらいため、除外しました。
比較した結果、次のものを使用しました:
holgern/pynostr: Python library for nostr
pip install pynostr[websocket-client]
完全なコード#
发布 Nostr Post 信息.py・GitHub、内容:
import json
import ssl
import time
import uuid
from pynostr.event import Event
from pynostr.relay_manager import RelayManager
from pynostr.filters import FiltersList, Filters
from pynostr.message_type import ClientMessageType
from pynostr.key import PrivateKey
relay_manager = RelayManager(timeout=6)
relay_manager.add_relay("wss://nostr-pub.wellorder.net")
relay_manager.add_relay("wss://relay.damus.io")
private_key = PrivateKey.from_nsec("あなたの秘密鍵")
filters = FiltersList([Filters(authors=[private_key.public_key.hex()], limit=100)])
subscription_id = uuid.uuid1().hex
relay_manager.add_subscription_on_all_relays(subscription_id, filters)
event = Event("文字列メッセージ")
event.sign(private_key.hex())
relay_manager.publish_event(event)
relay_manager.run_sync()
time.sleep(5)
while relay_manager.message_pool.has_ok_notices():
ok_msg = relay_manager.message_pool.get_ok_notice()
print(ok_msg)
while relay_manager.message_pool.has_events():
event_msg = relay_manager.message_pool.get_event()
print(event_msg.event.to_dict())
参考#
聊聊 nostr 和 审查 | 酷 壳 - CoolShell
および記事内のリンク。