<oembed><type>rich</type><version>1.0</version><title>gan wrote</title><author_name>gan (npub13z…l2rce)</author_name><author_url>https://yabu.me/npub13zyg3zysfylqc6nwfgj2uvce5rtlck2u50vwtjhpn92wzyusprfsdl2rce</author_url><provider_name>njump</provider_name><provider_url>https://yabu.me</provider_url><html>import json&#xA;import hashlib&#xA;import hmac&#xA;import time&#xA;import random&#xA;import websocket&#xA;import chardet&#xA;import logging&#xA;&#xA;# 设置日志级别和格式&#xA;logging.basicConfig(level=logging.INFO, format=&#39;%(asctime)s [%(levelname)s] %(message)s&#39;)&#xA;&#xA;# Nostr公钥&#xA;nostr_pubkey = &#34;&#34;&#xA;&#xA;# Nostr私钥&#xA;nostr_privkey = &#34;&#34;&#xA;&#xA;# JLPT N1文法列表&#xA;n1_grammar = [&#xA;    &#34;こんにちは&#34;,&#xA;    &#34;美味しい&#34;,&#xA;    &#34;おはよう御座います&#34;,&#xA;    &#34;サヨナラ&#34;,&#xA;    # 添加更多JLPT N1文法...&#xA;]&#xA;&#xA;# 事件标签&#xA;tags = []&#xA;&#xA;# 事件类型&#xA;kind = 1&#xA;&#xA;# Nostr Relay网址列表&#xA;relays = [&#xA;    &#34;wss://relay.damus.io&#34;,&#xA;    &#34;wss://nos.lol&#34;,&#xA;    &#34;wss://nostr.mom&#34;,&#xA;    &#34;wss://relay.coinos.io/&#34;,&#xA;    &#34;wss://offchain.pub/&#34;&#xA;]&#xA;&#xA;def send_nostr_message():&#xA;    try:&#xA;        # 选择随机的JLPT N1文法&#xA;        content = random.choice(n1_grammar)&#xA;&#xA;        # 生成事件创建时间&#xA;        created_at = int(time.time())&#xA;&#xA;        # 生成事件数据&#xA;        event_data = [&#xA;            0,&#xA;            nostr_pubkey,&#xA;            created_at,&#xA;            kind,&#xA;            tags,&#xA;            content&#xA;        ]&#xA;&#xA;        # 序列化事件数据&#xA;        event_json = json.dumps(event_data, separators=(&#39;,&#39;, &#39;:&#39;))&#xA;&#xA;        # 计算事件ID&#xA;        event_id = hashlib.sha256(event_json.encode(&#39;utf-8&#39;)).hexdigest()&#xA;&#xA;        # 计算事件签名&#xA;        event_sig = hmac.new(nostr_privkey.encode(), event_json.encode(&#39;utf-8&#39;), hashlib.sha256).hexdigest()&#xA;&#xA;        # 生成Nostr事件&#xA;        event = {&#xA;            &#34;id&#34;: event_id,&#xA;            &#34;pubkey&#34;: nostr_pubkey,&#xA;            &#34;created_at&#34;: created_at,&#xA;            &#34;kind&#34;: kind,&#xA;            &#34;tags&#34;: tags,&#xA;            &#34;content&#34;: content,&#xA;            &#34;sig&#34;: event_sig&#xA;        }&#xA;&#xA;        # 以JSON格式显示发送的内容&#xA;        logging.info(&#34;发送的内容：&#34;)&#xA;        logging.info(json.dumps(event, indent=4, ensure_ascii=False))&#xA;&#xA;        # 发送事件到多个Relays&#xA;        for relay in relays:&#xA;            try:&#xA;                ws = websocket.create_connection(relay)&#xA;                logging.info(f&#34;成功连接到 {relay}&#34;)&#xA;                ws.send(json.dumps(event))&#xA;                logging.info(f&#34;成功发送事件到 {relay}&#34;)&#xA;                ws.close()&#xA;            except websocket.WebSocketException as e:&#xA;                logging.error(f&#34;连接到 {relay} 失败：{e}&#34;)&#xA;    except Exception as e:&#xA;        logging.error(f&#34;发送事件失败：{e}&#34;)&#xA;&#xA;# 每小时运行一次send_nostr_message函数&#xA;while True:&#xA;    try:&#xA;        send_nostr_message()&#xA;        time.sleep(3600)&#xA;    except KeyboardInterrupt:&#xA;        logging.info(&#34;程序终止&#34;)&#xA;        break&#xA;    except Exception as e:&#xA;        logging.error(f&#34;程序运行失败：{e}&#34;)</html></oembed>