import json
import platform
import random
import time
from concurrent.futures import ThreadPoolExecutor
from queue import Queue
import cloudscraper
q = Queue(maxsize=1)
class BlueChip:
def __init__(self):
self.pool = ThreadPoolExecutor(max_workers=70)
self.retry_count = 5
self.retry_sleep = 2
self.scraper = cloudscraper.create_scraper(
browser={'browser': 'firefox', 'platform': 'windows', 'mobile': False})
self.opensea_header = {
"Accept": "application/json",
"Content-Type": "application/json",
"X-API-KEY": ""
}
def get_proxies(self):
if platform.system() == 'Linux':
ip_list = ["代理ip:{}".format(i) for i in range(端口)]
ip = random.choice(ip_list)
proxies = {
"http": f"http://{ip}",
"https": f"http://{ip}",
}
else:
proxies = {}
return proxies
def bluechip_data(self):
while True:
contract_address = q.get(block=True, timeout=600)
print(contract_address)
try:
if contract_address:
self.get_retrieve_owners_data(contract_address)
except Exception as e:
print(e)
finally:
q.task_done()
def get_retrieve_owners_data(self, contract_address: str):
url = "https://api.opensea.io/api/v1/asset_contract/%s" % contract_address
for i in range(self.retry_count):
try:
r = self.scraper.get(url, proxies=self.get_proxies(), headers=self.opensea_header).json()
if r.get("detail") and "Request was throttled" in r.get("detail"):
time.sleep(self.retry_sleep)
continue
elif r.get("total_supply"):
self.retrieve_owners(contract_address, int(r.get("total_supply", 0)))
break
else:
break
except Exception as e:
print(e)
def retrieve_owners(self, contract_address: str, total_supply: int):
for token_id in range(1, total_supply + 1):
url = "https://api.opensea.io/api/v1/asset/%s/%d/owners" % (contract_address, token_id)
for i in range(self.retry_count):
try:
r = self.scraper.get(url, proxies=self.get_proxies(), headers=self.opensea_header).json()
if r.get("detail") and "Request was throttled" in r.get("detail"):
time.sleep(self.retry_sleep)
continue
elif r.get("owners"):
for own in r.get("owners"):
ow = own.get("owner")
if ow:
print({ow.get("address"): ow})
break
else:
break
except Exception as e:
print(e)
def run(self):
[self.pool.submit(self.bluechip_data) for i in range(10)]
self.pool.shutdown(wait=True)
if __name__ == '__main__':
# 获取总供应量
# "https://api.opensea.io/api/v1/asset_contract/0xe12e25b63f18664b5afe4187fe35ac5efb6c1a73?format=json",
# 获取每个token_id信息
# "https://api.opensea.io/api/v1/asset/0xe12e25b63f18664b5afe4187fe35ac5efb6c1a73/100/owners?limit=20&order_by=created_date&order_direction=desc",
# 测试用的queue
q.put("0xe12e25b63f18664b5afe4187fe35ac5efb6c1a73")
bl = BlueChip()
bl.run()
get_opensea_data
于 2022-12-22 21:08:39 首次发布