unisat 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/Manifest.txt +7 -0
- data/README.md +33 -0
- data/Rakefile +31 -0
- data/lib/unisat/cache.rb +108 -0
- data/lib/unisat/version.rb +21 -0
- data/lib/unisat.rb +116 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 67fa8182506bbe32a101682e64ba4660f0b558789d876f2dafd3628dafc257be
|
4
|
+
data.tar.gz: 64dbb1c6e34b9b84a8df7bebbea5b08bac283cd3aaaadf1ec91051e3884fc89b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a503beaab753968070d54cf00be80a733dcb27fcd3e7d581e93ae920eb35a4615f20b9e1757976502f2c4d41700a75be810692baf1cd7d17a6a862deeb00c35d
|
7
|
+
data.tar.gz: 9757e1a741d451cc155e017ec694764019e17b138171a0fc57d54876ce508bda2455f87a536cd703006166f15dc1dec0c8b1b21730aaec4bb457fe464d8ccdf6
|
data/CHANGELOG.md
ADDED
data/Manifest.txt
ADDED
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# UniSat.io Lite Helpers for Full-Text Search in Bitcoin Ordinal Inscriptions
|
2
|
+
|
3
|
+
unisat - lite helpers for full-text search in bitcoin ordinal inscriptions powered by unisat.io
|
4
|
+
|
5
|
+
* home :: [github.com/ordbase/unisat](https://github.com/ordbase/unisat)
|
6
|
+
* bugs :: [github.com/ordbase/unisat/issues](https://github.com/ordbase/unisat/issues)
|
7
|
+
* gem :: [rubygems.org/gems/unisat](https://rubygems.org/gems/unisat)
|
8
|
+
* rdoc :: [rubydoc.info/gems/unisat](http://rubydoc.info/gems/unisat)
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
To be done
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
## License
|
22
|
+
|
23
|
+
The scripts are dedicated to the public domain.
|
24
|
+
Use it as you please with no restrictions whatsoever.
|
25
|
+
|
26
|
+
|
27
|
+
## Questions? Comments?
|
28
|
+
|
29
|
+
Join us in the [Ordgen / ORC-721 discord (chat server)](https://discord.gg/dDhvHKjm2t). Yes you can.
|
30
|
+
Your questions and commetary welcome.
|
31
|
+
|
32
|
+
|
33
|
+
Or post them over at the [Help & Support](https://github.com/geraldb/help) page. Thanks.
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/unisat/version.rb'
|
3
|
+
|
4
|
+
Hoe.spec 'unisat' do
|
5
|
+
|
6
|
+
self.version = Unisat::VERSION
|
7
|
+
|
8
|
+
self.summary = "unisat - lite helpers for full-text search in bitcoin ordinal inscriptions powered by unisat.io"
|
9
|
+
self.description = summary
|
10
|
+
|
11
|
+
self.urls = { home: 'https://github.com/ordbase/ordbase' }
|
12
|
+
|
13
|
+
self.author = 'Gerald Bauer'
|
14
|
+
self.email = 'gerald.bauer@gmail.com'
|
15
|
+
|
16
|
+
# switch extension to .markdown for gihub formatting
|
17
|
+
self.readme_file = 'README.md'
|
18
|
+
self.history_file = 'CHANGELOG.md'
|
19
|
+
|
20
|
+
self.extra_deps = [
|
21
|
+
['cocos'],
|
22
|
+
['puppeteer-ruby'],
|
23
|
+
['nokogiri'],
|
24
|
+
]
|
25
|
+
|
26
|
+
self.licenses = ['Public Domain']
|
27
|
+
|
28
|
+
self.spec_extras = {
|
29
|
+
required_ruby_version: '>= 2.3'
|
30
|
+
}
|
31
|
+
end
|
data/lib/unisat/cache.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
module Unisat
|
2
|
+
###
|
3
|
+
## todo: use a config block in the future - why? why not?
|
4
|
+
def self.cache_dir=( dir ) @cache = Cache.new( dir ); end
|
5
|
+
def self.cache() @cache ||= Cache.new( './unisat' ); end
|
6
|
+
|
7
|
+
|
8
|
+
def self.parse_page( html )
|
9
|
+
doc = Nokogiri::HTML( html )
|
10
|
+
|
11
|
+
items = []
|
12
|
+
|
13
|
+
sats = doc.css( '.item-container' )
|
14
|
+
sats.each_with_index do |el,i|
|
15
|
+
puts "==> sat ##{i+1}/#{sats.size}..."
|
16
|
+
|
17
|
+
h = {}
|
18
|
+
# <a href="https://ordinals.com/inscription/
|
19
|
+
# 9613d44f53a1245bf34f43820163bb3064a5715c19f0d6c767a14d1b49f46614i0"
|
20
|
+
# target="_blank" rel="noreferrer" class="sats-item ">
|
21
|
+
a = el.at( 'a.sats-item' )
|
22
|
+
h['href'] = a['href']
|
23
|
+
|
24
|
+
name = el.at( '.name' )
|
25
|
+
h['name'] = name.text
|
26
|
+
|
27
|
+
num = el.at( '.num' )
|
28
|
+
h['num'] = num.text
|
29
|
+
|
30
|
+
address = el.at( '.address' )
|
31
|
+
h['address'] = address.text
|
32
|
+
|
33
|
+
date = el.at( '.date' )
|
34
|
+
h['date'] = date.text
|
35
|
+
##pp h
|
36
|
+
|
37
|
+
items << h
|
38
|
+
end
|
39
|
+
items
|
40
|
+
end # method _parse_page
|
41
|
+
|
42
|
+
|
43
|
+
class Cache
|
44
|
+
def initialize( dir )
|
45
|
+
@dir = dir
|
46
|
+
end
|
47
|
+
|
48
|
+
## todo:
|
49
|
+
## - add offset: nil, limit: nil - why? why not?
|
50
|
+
def read( key )
|
51
|
+
recs = []
|
52
|
+
|
53
|
+
paths = Dir.glob( "#{@dir}/#{key}/*.json" )
|
54
|
+
puts " #{paths.size} page(s) in cache"
|
55
|
+
|
56
|
+
paths.each_with_index do |path,i|
|
57
|
+
results = read_json( path )
|
58
|
+
puts "==> #{i+1}/#{paths.size} - #{results.size} inscribe(s) in >#{path}<..."
|
59
|
+
|
60
|
+
results.each do |h|
|
61
|
+
date = h['date'] # note: might include unconfirmed!!!
|
62
|
+
## always "auto-magically" filter out unconfirmed for now
|
63
|
+
if date == 'unconfirmed'
|
64
|
+
puts " !! INFO - skipping unconfirmed inscribe"
|
65
|
+
next
|
66
|
+
end
|
67
|
+
|
68
|
+
## todo/fix:
|
69
|
+
## reformat date here/parse
|
70
|
+
## and change to iso e.g. 2023-12-24 17:18 or such - why? why not!!!!
|
71
|
+
|
72
|
+
|
73
|
+
## id -- split href by / and get last part (is id)
|
74
|
+
id = h['href'].split( '/')[-1]
|
75
|
+
## num -- remove/ strip leadingnumber sign (#)
|
76
|
+
num = h['num'].sub( '#', '' )
|
77
|
+
recs << {
|
78
|
+
'id' => id,
|
79
|
+
'num' => num,
|
80
|
+
'date' => date,
|
81
|
+
'address' => h['address'],
|
82
|
+
'text' => h['name'], ## change name to text
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
puts " #{recs.size} inscribe(s) - total"
|
87
|
+
recs
|
88
|
+
end # method read
|
89
|
+
|
90
|
+
|
91
|
+
def exist?( key, offset: )
|
92
|
+
outpath = "#{@dir}/#{key}/#{offset}.json"
|
93
|
+
File.exist?( outpath )
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_page( page, key, offset: )
|
97
|
+
data = Unisat.parse_page( page )
|
98
|
+
|
99
|
+
## note: only write if results > 0
|
100
|
+
if data.size > 0
|
101
|
+
outpath = "#{@dir}/#{key}/#{offset}.json"
|
102
|
+
write_json( outpath, data )
|
103
|
+
else
|
104
|
+
puts "!! WARN - no results found in page #{offset} for key >#{key}<"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end # class Cache
|
108
|
+
end # module Unisat
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
module Unisat
|
3
|
+
|
4
|
+
# sync version w/ sport.db n friends - why? why not?
|
5
|
+
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
6
|
+
MINOR = 0
|
7
|
+
PATCH = 1
|
8
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
9
|
+
|
10
|
+
def self.version
|
11
|
+
VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.banner
|
15
|
+
"unisat/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in >#{root}<"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.root
|
19
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
|
20
|
+
end
|
21
|
+
end
|
data/lib/unisat.rb
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'cocos'
|
2
|
+
|
3
|
+
require 'puppeteer-ruby'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
6
|
+
|
7
|
+
# our own code
|
8
|
+
require_relative 'unisat/version' # always goes first
|
9
|
+
require_relative 'unisat/cache'
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
module Unisat
|
15
|
+
module Puppeteer
|
16
|
+
|
17
|
+
###
|
18
|
+
## todo: use a config block in the future - why? why not?
|
19
|
+
def self.chrome_path=( path )
|
20
|
+
if File.exist?( path )
|
21
|
+
puts "** bingo! found chrome executable @ path >#{path}<"
|
22
|
+
else
|
23
|
+
puts "*** ERROR - sorry; cannot find chrome executable @ path >#{path}<"
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
@chrome_path = path
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.chrome_path() @chrome_path; end
|
31
|
+
|
32
|
+
## use/rename to wait_in_secs - why? why not?
|
33
|
+
def self.wait_in_s=( s ) @wait_in_s = s; end
|
34
|
+
def self.wait_in_s() @wait_in_s ||= 10; end
|
35
|
+
|
36
|
+
## shortcut helper
|
37
|
+
def self.cache() Unisat.cache; end
|
38
|
+
|
39
|
+
|
40
|
+
###
|
41
|
+
# search
|
42
|
+
def self.search( q, offset: 1,
|
43
|
+
limit: 1,
|
44
|
+
force: false )
|
45
|
+
|
46
|
+
opts = {}
|
47
|
+
opts[:headless] = false
|
48
|
+
opts[:executable_path] = chrome_path if chrome_path ## add only if set (default is nil)
|
49
|
+
|
50
|
+
|
51
|
+
::Puppeteer.launch( **opts ) do |browser|
|
52
|
+
|
53
|
+
page = browser.new_page
|
54
|
+
|
55
|
+
limit.times do |i|
|
56
|
+
count = offset+i
|
57
|
+
|
58
|
+
page_url = "https://unisat.io/search?q=#{q}&type=text&p=#{count}"
|
59
|
+
print page_url
|
60
|
+
|
61
|
+
## check if already in cache
|
62
|
+
if force == false && cache.exist?( q, offset: count )
|
63
|
+
print "...in cache\n"
|
64
|
+
next
|
65
|
+
end
|
66
|
+
|
67
|
+
print "... goto page ...\n"
|
68
|
+
response = page.goto( page_url )
|
69
|
+
pp response.headers
|
70
|
+
|
71
|
+
puts "sleeping #{wait_in_s} sec(s)..."
|
72
|
+
sleep( wait_in_s )
|
73
|
+
|
74
|
+
## print search result summary / counts
|
75
|
+
page.wait_for_selector('div.result-notice')
|
76
|
+
el = page.query_selector("div.result-notice")
|
77
|
+
puts
|
78
|
+
puts el.evaluate("el => el.innerText")
|
79
|
+
#=> Searched for "biixel" among 3252336 records, found 1105 results.
|
80
|
+
|
81
|
+
|
82
|
+
## print pagination
|
83
|
+
page.wait_for_selector('ul.ant-pagination')
|
84
|
+
el = page.query_selector("ul.ant-pagination")
|
85
|
+
puts
|
86
|
+
puts el.evaluate("el => el.innerText")
|
87
|
+
#=> 1 ••• 32 33 34 35
|
88
|
+
|
89
|
+
|
90
|
+
## get search results (32 inscribes per page)
|
91
|
+
page.wait_for_selector('div.sats-list')
|
92
|
+
el = page.query_selector("div.sats-list")
|
93
|
+
|
94
|
+
html = el.evaluate("el => el.innerHTML")
|
95
|
+
# puts
|
96
|
+
# puts html
|
97
|
+
|
98
|
+
cache.add_page( html, q,
|
99
|
+
offset: count )
|
100
|
+
end
|
101
|
+
|
102
|
+
puts "sleeping 2 secs before shutdown..."
|
103
|
+
sleep( 2 )
|
104
|
+
end
|
105
|
+
end # method search
|
106
|
+
end # module Puppeteer
|
107
|
+
end # module Unisat
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
## add alternate name alias - why? why not?
|
112
|
+
UniSat = Unisat
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
puts Unisat.banner
|
metadata
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: unisat
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gerald Bauer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-08-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cocos
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: puppeteer-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: nokogiri
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rdoc
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4.0'
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '7'
|
65
|
+
type: :development
|
66
|
+
prerelease: false
|
67
|
+
version_requirements: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '4.0'
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '7'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: hoe
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '4.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '4.0'
|
89
|
+
description: unisat - lite helpers for full-text search in bitcoin ordinal inscriptions
|
90
|
+
powered by unisat.io
|
91
|
+
email: gerald.bauer@gmail.com
|
92
|
+
executables: []
|
93
|
+
extensions: []
|
94
|
+
extra_rdoc_files:
|
95
|
+
- CHANGELOG.md
|
96
|
+
- Manifest.txt
|
97
|
+
- README.md
|
98
|
+
files:
|
99
|
+
- CHANGELOG.md
|
100
|
+
- Manifest.txt
|
101
|
+
- README.md
|
102
|
+
- Rakefile
|
103
|
+
- lib/unisat.rb
|
104
|
+
- lib/unisat/cache.rb
|
105
|
+
- lib/unisat/version.rb
|
106
|
+
homepage: https://github.com/ordbase/ordbase
|
107
|
+
licenses:
|
108
|
+
- Public Domain
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options:
|
112
|
+
- "--main"
|
113
|
+
- README.md
|
114
|
+
require_paths:
|
115
|
+
- lib
|
116
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '2.3'
|
121
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - ">="
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
requirements: []
|
127
|
+
rubygems_version: 3.4.10
|
128
|
+
signing_key:
|
129
|
+
specification_version: 4
|
130
|
+
summary: unisat - lite helpers for full-text search in bitcoin ordinal inscriptions
|
131
|
+
powered by unisat.io
|
132
|
+
test_files: []
|