namekrs/namekrs.py

115 lines
3.5 KiB
Python

import datetime
import json
import argparse
import logging
import requests
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
from timestamper import rpcurl_from_config
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s [%(levelname)s] %(message)s')
class NamecoinStore(object):
identity = None
def __init__(self, url='http://127.0.0.1:8336', identity=None):
self.client = AuthServiceProxy(url)
self.identity = identity
def set(self, key, value):
name = self.identity.format(key)
data = json.dumps(value)
reg_txid, nonce = self.client.name_new(name)
logging.debug('reg_txid, nonce: %r %r', reg_txid, nonce)
txid = self.client.name_firstupdate(name, nonce, reg_txid, data)
logging.debug('txid: %r', txid)
return txid
def get(self, key):
try:
hist = self.client.name_history(self.identity.format(key))
except JSONRPCException as exc:
# FIXME maybe?
if str(exc).split(': ')[0] == '-4':
logging.exception('No record found')
return None
raise
last_tx = self.client.gettransaction(hist[-1]['txid'])
return {
'history': hist,
'last_tx': last_tx
}
def bind_parser(p):
def deco(func):
p.set_defaults(func=func)
return func
return deco
parser = argparse.ArgumentParser()
parser.add_argument('--rpc', help='namecoind RPC URL (defaults to data obtained from ~/.namecoin.conf)')
sub = parser.add_subparsers()
verify_parser = sub.add_parser('verify', help='lookup KRS database')
verify_parser.add_argument('id', help='lookup ID')
@bind_parser(verify_parser)
def verify(args, store):
print(store.get(args.id))
publish_parser = sub.add_parser('publish', help='publish mojepanstwo.pl data')
publish_parser.add_argument('--limit', type=int, help='limit number of records', default=20)
publish_parser.add_argument('--page', type=int, help='start with specified page', default=1)
publish_parser.add_argument('--skip', type=int, help='skip first N records', default=0)
publish_parser.add_argument('--search', help='search query (example: krs_podmioty.nip=1234567)')
publish_parser.add_argument('-n', '--dry-run', action='store_true', help='only parse data')
@bind_parser(publish_parser)
def publish(args, store):
query = {
'limit': args.limit,
'page': args.page,
}
if args.search:
k, _, v = args.search.partition('=')
query['conditions[%s]' % k] = v
data = requests.get('https://api-v3.mojepanstwo.pl/dane/krs_podmioty.json', query).json()
logging.info('Total objects: %d, selected: %d', data['Count'], len(data['Dataobject']))
output = {}
for obj in data['Dataobject'][args.skip:]:
if obj['data']['krs_podmioty.nip'] == '0':
logging.info('Ignoring %s (no NIP/VATID)', obj['mp_url'])
continue
k = obj['data']['krs_podmioty.nip']
output[k] = obj['mp_url']
logging.info('%s => %r', k, output[k])
logging.info('Gathered %d records', len(output))
if args.dry_run:
logging.info('Dry run, not publishing')
return
for k, v in output.items():
logging.info('Publishing %s => %r', k, v)
store.set(k, v)
def main():
args = parser.parse_args()
store = NamecoinStore(
args.rpc or rpcurl_from_config('namecoin', ''),
'krs-test/{}')
args.func(args, store)
if __name__ == "__main__":
main()