-
Notifications
You must be signed in to change notification settings - Fork 8
/
nftUploader.js
135 lines (109 loc) · 9.21 KB
/
nftUploader.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// script to automatically upload and sell any number of NFTs completely for free on Opensea. Works with only metamask wallets
const chromeLauncher = require('chrome-launcher');
const axios = require('axios');
const puppeteer = require('puppeteer');
const path = require("path");
const fs = require("fs");
// Get array containing URL paths to NFT images
const arr = require("path_to_array");
const extension_path = "extension/path"
const collection_name = "nakahana"
// Set to true to check if NFT has already been uploaded
const searchBeforeUpload = false;
(async () => {
try {
// Load metamask extension, replace path with your own
const pathToExtension = require('path').join(__dirname, extension_path);
const newFlags = chromeLauncher.Launcher.defaultFlags().filter(flag => flag !== '--disable-extensions' && flag !== '--mute-audio');
newFlags.push(`--start-maximized`,
`--load-extension=${pathToExtension}`)
// Launch chrome
const chrome = await chromeLauncher.launch({
ignoreDefaultFlags: true,
chromeFlags: newFlags,
});
const response = await axios.get(`http://localhost:${chrome.port}/json/version`);
const { webSocketDebuggerUrl } = response.data;
// Copy this log somewhere after initial script run
console.log(webSocketDebuggerUrl);
// Connecting the instance using `browserWSEndpoint`
// Replace "webSocketDebuggerUrl" with what you copied before second run to connect
// to same chrome instance where you've already logged into opensea with metamask
const browser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl, defaultViewport: null });
const page = await browser.newPage();
page.setDefaultTimeout(10000);
// create errors stream
const stream = fs.createWriteStream(path.join(__dirname, "errors.log"), { flags: "a" })
// Begin upload
for (let i = 0; i < arr.length; i++) {
let uploaded = false
try {
if (searchBeforeUpload) {
await page.goto(`https://opensea.io/collection/${collection_name}`);
await page.waitForSelector('input[placeholder=Search]')
await page.type('input[placeholder=Search]', arr[i]);
await page.keyboard.press('Enter');
try {
// select listing
await page.waitForSelector("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > div:nth-child(4) > div > div > div > div.AssetSearchView--results.collection--results > div.Blockreact__Block-sc-1xf18x6-0.dBFmez.AssetsSearchView--assets > div.fresnel-container.fresnel-greaterThanOrEqual-sm > div > div > div > article > a > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.SpaceBetweenreact__SpaceBetween-sc-jjxyhg-0.AssetCardFooterreact__StyledContainer-sc-nedjig-0.bFcjdD.jYqxGr.gJwgfT.cBTfDg")
await page.click("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > div:nth-child(4) > div > div > div > div.AssetSearchView--results.collection--results > div.Blockreact__Block-sc-1xf18x6-0.dBFmez.AssetsSearchView--assets > div.fresnel-container.fresnel-greaterThanOrEqual-sm > div > div > div > article > a > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.SpaceBetweenreact__SpaceBetween-sc-jjxyhg-0.AssetCardFooterreact__StyledContainer-sc-nedjig-0.bFcjdD.jYqxGr.gJwgfT.cBTfDg")
uploaded = true
} catch (error) {
if (error == "TimeoutError: waiting for selector `#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > div:nth-child(4) > div > div > div > div.AssetSearchView--results.collection--results > div.Blockreact__Block-sc-1xf18x6-0.dBFmez.AssetsSearchView--assets > div.fresnel-container.fresnel-greaterThanOrEqual-sm > div > div > div > article > a > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.SpaceBetweenreact__SpaceBetween-sc-jjxyhg-0.AssetCardFooterreact__StyledContainer-sc-nedjig-0.bFcjdD.jYqxGr.gJwgfT.cBTfDg` failed: timeout 10000ms exceeded") {
uploaded = false
}
}
}
if (uploaded) {
continue
}
await page.goto(`https://opensea.io/collection/${collection_name}/assets/create`);
// select nft for upload
await page.waitForSelector('input[type=file]');
const inputUploadHandle = await page.$('input[type=file]');
// Replace with your path
let fileToUpload = `C:/nft/images/${arr[i]}.png`;
inputUploadHandle.uploadFile(fileToUpload);
// Enter data about the NFT
await page.waitForSelector("#name")
await page.type('#name', arr[i]);
await page.type('#description', 'This word has no meaning.');
// create button
await page.waitForSelector("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > section > div.CollectionManager--container.CollectionManager--container-with-margins.CollectionManager--container-with-topbar.CollectionManager--narrow-container > form > div.AssetForm--submit > div.AssetForm--action > span > button")
await page.click("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > section > div.CollectionManager--container.CollectionManager--container-with-margins.CollectionManager--container-with-topbar.CollectionManager--narrow-container > form > div.AssetForm--submit > div.AssetForm--action > span > button")
// cancel dialog
await page.waitForSelector("div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.gWXeYL.jYqxGr > button")
await page.click("div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.gWXeYL.jYqxGr > button")
// sell button
await page.waitForSelector("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > div.OrderManagerreact__DivContainer-sc-rw3i3h-0.gpKFGZ > div > span:nth-child(2) > a")
await page.click("#__next > div.Blockreact__Block-sc-1xf18x6-0.Flexreact__Flex-sc-1twd32i-0.FlexColumnreact__FlexColumn-sc-1wwz3hp-0.OpenSeaPagereact__DivContainer-sc-65pnmt-0.dBFmez.jYqxGr.ksFzlZ.fiudwD.App > main > div > div > div.OrderManagerreact__DivContainer-sc-rw3i3h-0.gpKFGZ > div > span:nth-child(2) > a")
// Change 0.001 to your desired listing price
await page.waitForSelector('input[name=price]')
await page.type('input[name=price]', '0.001');
await page.waitForSelector('button[type=submit]')
await page.click('button[type=submit]');
// Sign sell transaction on opensea
await page.waitForXPath("/html/body/div[4]/div/div/div/section/div/div/section/div/div/div/div/div/div/div/button")
const [signbtn] = await page.$x("/html/body/div[4]/div/div/div/section/div/div/section/div/div/div/div/div/div/div/button")
await signbtn.click()
// Open metamask and sign sell transaction
browser.on('targetcreated', async (target) => { //
const newpage = await target.page();
await newpage.waitForSelector("#app-content > div > div.main-container-wrapper > div > div.request-signature__footer > button.button.btn-secondary.btn--large.request-signature__footer__sign-button")
await newpage.click("#app-content > div > div.main-container-wrapper > div > div.request-signature__footer > button.button.btn-secondary.btn--large.request-signature__footer__sign-button")
});
// wait for confirmation
await page.waitForFunction(() => !!document.querySelector("div.AssetSuccessModalContentreact__DivContainer-sc-1vt1rp8-1.gtISVn"))
} catch (error) {
// write any errors to error log
stream.write(arr[i] + " " + '(' + error + ')' + "\n")
console.log(error);
continue
}
}
await browser.close();
await chrome.kill();
} catch (error) {
console.log(error);
}
})();