Python Library for nostr.
Project description
pynostr
CI/CD | |
Package |
Python library for for Nostr.
This library is using coincurve instead of secp256k1, so pynostr can be used on windows and is a fork from python-nostr.
This library works with python >= 3.7
Installation
pip install pynostr
with tornado support
pip install pynostr[tornado]
The necessary coincurve can be installed on android inside termux:
pkg update
pkg install build-essential
pkg install binutils
pkg install python-cryptography
pip install coincurve --no-binary all
Usage
Generate a key
from pynostr.key import PrivateKey
private_key = PrivateKey()
public_key = private_key.public_key
print(f"Private key: {private_key.bech32()}")
print(f"Public key: {public_key.bech32()}")
Connect to relays
from pynostr.relay_manager import RelayManager
from pynostr.filters import FiltersList, Filters
from pynostr.event import EventKind
import time
import uuid
relay_manager = RelayManager()
relay_manager.add_relay("wss://nostr-pub.wellorder.net")
relay_manager.add_relay("wss://relay.damus.io")
filters = FiltersList([Filters(kinds=[EventKind.TEXT_NOTE], limit=100)])
subscription_id = uuid.uuid1().hex
relay_manager.add_subscription_on_all_relays(subscription_id, filters)
time.sleep(1.25)
while relay_manager.message_pool.has_notices():
notice_msg = relay_manager.message_pool.get_notice()
print(notice_msg.content)
while relay_manager.message_pool.has_events():
event_msg = relay_manager.message_pool.get_event()
print(event_msg.event.content)
relay_manager.close_all_relay_connections()
Connect to relays using tornado
from pynostr.tornado_relay import TornadoRelay
from pynostr.filters import FiltersList, Filters
from pynostr.event import EventKind
from pynostr.base_relay import RelayPolicy
from pynostr.message_pool import MessagePool
import tornado.ioloop
import time
import uuid
message_pool = MessagePool(first_response_only=False)
policy = RelayPolicy()
io_loop = tornado.ioloop.IOLoop.current()
r = TornadoRelay(
"wss://nostr-pub.wellorder.net",
message_pool,
io_loop,
policy
)
filters = FiltersList([Filters(kinds=[EventKind.TEXT_NOTE], limit=100)])
subscription_id = uuid.uuid1().hex
r.add_subscription(subscription_id, filters)
io_loop.add_callback(r.start)
io_loop.start()
time.sleep(1.25)
while message_pool.has_notices():
notice_msg = message_pool.get_notice()
print(notice_msg.content)
while message_pool.has_events():
event_msg = message_pool.get_event()
print(event_msg.event.content)
Publish to relays
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()
relay_manager.add_relay("wss://nostr-pub.wellorder.net")
relay_manager.add_relay("wss://relay.damus.io")
time.sleep(1.25) # allow the connections to open
private_key = PrivateKey()
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("Hello Nostr")
event.sign(private_key.hex())
relay_manager.publish_event(event)
time.sleep(1) # allow the messages to send
while relay_manager.message_pool.has_events():
event_msg = relay_manager.message_pool.get_event()
print(event_msg.event.to_dict())
relay_manager.close_all_relay_connections()
Reply to a note
from pynostr.event import Event
reply = Event(
content="Sounds good!",
)
# create 'e' tag reference to the note you're replying to
reply.add_event_ref(original_note_id)
# create 'p' tag reference to the pubkey you're replying to
reply.add_pubkey_ref(original_note_author_pubkey)
reply.sign(private_key.hex())
Send a DM
from pynostr.event import Event, EventKind
dm = Event(kind=EventKind.ENCRYPTED_DIRECT_MESSAGE)
dm.encrypt_dm(private_key.hex()
recipient_pubkey=recipient_pubkey,
cleartext_content="Secret message!"
)
dm.sign(private_key.hex())
Test Suite
Set up the test environment
Install the test-runner dependencies:
pip3 install -r test-requirements.txt
Then make the pynostr
python module visible/importable to the tests by installing the local dev dir as an editable module:
# from the repo root
pip3 install -e .
Running the test suite
Run the whole test suite:
# from the repo root
pytest
Run a specific test file:
pytest test/test_this_file.py
Run a specific test:
pytest test/test_this_file.py::test_this_specific_test
Running tests with tox
Install tox
pip install tox
Run tests
tox
Pre-commit-config
Installation
$ pip install pre-commit
Using homebrew:
$ brew install pre-commit
$ pre-commit --version
pre-commit 2.10.0
Install the git hook scripts
$ pre-commit install
Run against all the files
pre-commit run --all-files
pre-commit run --show-diff-on-failure --color=always --all-files
Update package rev in pre-commit yaml
pre-commit autoupdate
pre-commit run --show-diff-on-failure --color=always --all-files
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pynostr-0.2.1.tar.gz
.
File metadata
- Download URL: pynostr-0.2.1.tar.gz
- Upload date:
- Size: 36.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.16
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9b837b8c4f18148c7da6f60a1818e7acaf0547b381f6a12728f43a564807aed9 |
|
MD5 | d4561f65b5200b9dc1d5051466bba55a |
|
BLAKE2b-256 | 8ab0156f27aebdd3437e13a907b6979a10d7c87a9a8877db1b3f6783abd6bac4 |
File details
Details for the file pynostr-0.2.1-py3-none-any.whl
.
File metadata
- Download URL: pynostr-0.2.1-py3-none-any.whl
- Upload date:
- Size: 24.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.16
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7cdae6f1105008fc636f9562dc35ae94093a0cb1c69cde7a9ac0e07c4a15b8ae |
|
MD5 | 44d1a798c628f48d411ecb9a6f629598 |
|
BLAKE2b-256 | 43e2d43d6fbd2f86e9143d036bf6c7117a2df905f9793ee5e6852a1f707175b4 |