Skip to main content

Python Library for nostr.

Project description

pynostr

CI/CD codecov CircleCI
Package PyPI - Version PyPI - Downloads PyPI - Python Version

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

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()

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pynostr-0.1.0.tar.gz (33.5 kB view details)

Uploaded Source

Built Distribution

pynostr-0.1.0-py3-none-any.whl (22.3 kB view details)

Uploaded Python 3

File details

Details for the file pynostr-0.1.0.tar.gz.

File metadata

  • Download URL: pynostr-0.1.0.tar.gz
  • Upload date:
  • Size: 33.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for pynostr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4cf0a8dc5b0d389c262ec94f563f02b9b94e4c0999f35b27990806d28f40dd6f
MD5 3ccc354327cc87768ab261ff9d4a1bd5
BLAKE2b-256 600cd56ab85bc81d7d49e8247a164c203fd85ee8c8168618e9ba20e892ebea40

See more details on using hashes here.

File details

Details for the file pynostr-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: pynostr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for pynostr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 791966eb9281e5776bfce7f813434190c736f83292baf7a1a222ebeb17069850
MD5 f8353aedd6fd00ddef9bc9aab9d1e911
BLAKE2b-256 a59833409e7cd57776b4b02522ee0545e2022578b2da8b52840f2927839c5685

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page