阿甘 on Nostr: import json import hashlib import hmac import time import random import websocket ...
import json
import hashlib
import hmac
import time
import random
import websocket
import chardet
import logging
# 设置日志级别和格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s')
# Nostr公钥
nostr_pubkey = ""
# Nostr私钥
nostr_privkey = ""
# JLPT N1文法列表
n1_grammar = [
"こんにちは",
"美味しい",
"おはよう御座います",
"サヨナラ",
# 添加更多JLPT N1文法...
]
# 事件标签
tags = []
# 事件类型
kind = 1
# Nostr Relay网址列表
relays = [
"wss://relay.damus.io",
"wss://nos.lol",
"wss://nostr.mom",
"wss://relay.coinos.io/",
"wss://offchain.pub/"
]
def send_nostr_message():
try:
# 选择随机的JLPT N1文法
content = random.choice(n1_grammar)
# 生成事件创建时间
created_at = int(time.time())
# 生成事件数据
event_data = [
0,
nostr_pubkey,
created_at,
kind,
tags,
content
]
# 序列化事件数据
event_json = json.dumps(event_data, separators=(',', ':'))
# 计算事件ID
event_id = hashlib.sha256(event_json.encode('utf-8')).hexdigest()
# 计算事件签名
event_sig = hmac.new(nostr_privkey.encode(), event_json.encode('utf-8'), hashlib.sha256).hexdigest()
# 生成Nostr事件
event = {
"id": event_id,
"pubkey": nostr_pubkey,
"created_at": created_at,
"kind": kind,
"tags": tags,
"content": content,
"sig": event_sig
}
# 以JSON格式显示发送的内容
logging.info("发送的内容:")
logging.info(json.dumps(event, indent=4, ensure_ascii=False))
# 发送事件到多个Relays
for relay in relays:
try:
ws = websocket.create_connection(relay)
logging.info(f"成功连接到 {relay}")
ws.send(json.dumps(event))
logging.info(f"成功发送事件到 {relay}")
ws.close()
except websocket.WebSocketException as e:
logging.error(f"连接到 {relay} 失败:{e}")
except Exception as e:
logging.error(f"发送事件失败:{e}")
# 每小时运行一次send_nostr_message函数
while True:
try:
send_nostr_message()
time.sleep(3600)
except KeyboardInterrupt:
logging.info("程序终止")
break
except Exception as e:
logging.error(f"程序运行失败:{e}")
Published at
2025-03-06 12:05:22Event JSON
{
"id": "9ffb15de6c75bc100fad9517590b14105f8ed249e4aabc9f08087a85483decd9",
"pubkey": "8888888890493e0c6a6e4a24ae3319a0d7fc595ca3d8e5cae19954e1139008d3",
"created_at": 1741262722,
"kind": 1,
"tags": [
[
"e",
"df78f4e3ac95dbc2c4529e5f2128fa672946d5e3ca1f8e41dbd42260c9a28291",
"wss://nos.lol/",
"root"
],
[
"e",
"fe772c724444df46d6e5e2651c307be56f5ee658ceb98caef1ab13c5382150a3",
"wss://nostr.mom/"
],
[
"e",
"b66f2bb361f6859b00c65c3609892ab71a081333a5ca5d9c50d9485f3947e3e3",
"wss://nos.lol/"
],
[
"e",
"3b072b85cea12c0ef87a8c0269fb6fbfc346528a4108b31ff8b7777116ef1289",
"wss://nostr.mom/",
"reply"
],
[
"p",
"92837eab1708de086e4a4e9de3c54f7f03df35809cfa36f9932fceb61f5bf2dc"
]
],
"content": "import json\nimport hashlib\nimport hmac\nimport time\nimport random\nimport websocket\nimport chardet\nimport logging\n\n# 设置日志级别和格式\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s')\n\n# Nostr公钥\nnostr_pubkey = \"\"\n\n# Nostr私钥\nnostr_privkey = \"\"\n\n# JLPT N1文法列表\nn1_grammar = [\n \"こんにちは\",\n \"美味しい\",\n \"おはよう御座います\",\n \"サヨナラ\",\n # 添加更多JLPT N1文法...\n]\n\n# 事件标签\ntags = []\n\n# 事件类型\nkind = 1\n\n# Nostr Relay网址列表\nrelays = [\n \"wss://relay.damus.io\",\n \"wss://nos.lol\",\n \"wss://nostr.mom\",\n \"wss://relay.coinos.io/\",\n \"wss://offchain.pub/\"\n]\n\ndef send_nostr_message():\n try:\n # 选择随机的JLPT N1文法\n content = random.choice(n1_grammar)\n\n # 生成事件创建时间\n created_at = int(time.time())\n\n # 生成事件数据\n event_data = [\n 0,\n nostr_pubkey,\n created_at,\n kind,\n tags,\n content\n ]\n\n # 序列化事件数据\n event_json = json.dumps(event_data, separators=(',', ':'))\n\n # 计算事件ID\n event_id = hashlib.sha256(event_json.encode('utf-8')).hexdigest()\n\n # 计算事件签名\n event_sig = hmac.new(nostr_privkey.encode(), event_json.encode('utf-8'), hashlib.sha256).hexdigest()\n\n # 生成Nostr事件\n event = {\n \"id\": event_id,\n \"pubkey\": nostr_pubkey,\n \"created_at\": created_at,\n \"kind\": kind,\n \"tags\": tags,\n \"content\": content,\n \"sig\": event_sig\n }\n\n # 以JSON格式显示发送的内容\n logging.info(\"发送的内容:\")\n logging.info(json.dumps(event, indent=4, ensure_ascii=False))\n\n # 发送事件到多个Relays\n for relay in relays:\n try:\n ws = websocket.create_connection(relay)\n logging.info(f\"成功连接到 {relay}\")\n ws.send(json.dumps(event))\n logging.info(f\"成功发送事件到 {relay}\")\n ws.close()\n except websocket.WebSocketException as e:\n logging.error(f\"连接到 {relay} 失败:{e}\")\n except Exception as e:\n logging.error(f\"发送事件失败:{e}\")\n\n# 每小时运行一次send_nostr_message函数\nwhile True:\n try:\n send_nostr_message()\n time.sleep(3600)\n except KeyboardInterrupt:\n logging.info(\"程序终止\")\n break\n except Exception as e:\n logging.error(f\"程序运行失败:{e}\")",
"sig": "e392d1b7be2e9472fee83a62f79795d8bd91c9f6a7ae8218d3559f912d63ad9b3cdddb474f6174897a85d3d6046238dac0d7e6ce8c49954790fc3fb79a9f60af"
}