-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontent.js
137 lines (116 loc) · 4.98 KB
/
content.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
136
137
"use strict";
(async function () {
await new Promise(resolve => setTimeout(resolve, 3000)); // let page load
let i = 0;
while (!document.querySelector(".css-1c2u65d")) {
console.log("Unable to find parent element, trying again in 1 second.");
await new Promise(resolve => setTimeout(resolve, 1000));
if (i >= 10) {
console.log("Timed out. Please try refreshing the page.")
return;
}
i++;
}
const ids = [];
let s = document.getElementById("__NEXT_DATA__");
let m = s.text.match('Repl:([^\"]+)\"');
let t = s.text.match('\"title\":\"([^\"]+)\"');
let replitId = m[1];
let replitTitle = t[1];
let forkButton = document.createElement("button");
forkButton.id = "forkBtn";
forkButton.disabled = true;
forkButton.textContent = "Fork";
forkButton.addEventListener("click", () => fork(replitId));
let numForks = document.createElement("input");
numForks.type = "number";
numForks.placeholder = "number of forks";
numForks.id = "numb";
numForks.addEventListener("change", () => forkButton.disabled = false);
let urlButton = document.createElement("button");
urlButton.disabled = true;
urlButton.textContent = "Get shareable URLs";
urlButton.id = "getlinks";
urlButton.addEventListener("click", getLink);
let historyButton = document.querySelector(".css-1c2u65d");
historyButton.after(numForks);
numForks.after(forkButton);
forkButton.after(urlButton);
async function fork(replitId) {
ids.length = 0;
document.getElementById("forkBtn").disabled = true;
const numForks = document.getElementById("numb").value;
for (let i = 0; i < numForks; i++) {
if (i > 0 && i % 5 == 0) {
console.log("waiting 30s to avoid rate limiting...")
await new Promise(resolve => setTimeout(resolve, 30000)); // avoid server error
}
try {
let res = await fetch("https://replit.com/graphql", {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9,sv;q=0.8",
"content-type": "application/json",
"sec-ch-ua": "Replit Auto Forker",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest"
},
"body": "[{\"operationName\":\"ForkReplCreateRepl\",\"variables\":{\"input\":{\"originId\":\"" + replitId + "\",\"teamId\":null,\"title\":\"" + replitTitle + "\",\"forkToPersonal\":true}},\"query\":\"mutation ForkReplCreateRepl($input: CreateReplInput!) {\\n createRepl(input: $input) {\\n ... on Repl {\\n id\\n url\\n isPrivate\\n language\\n origin {\\n id\\n isOwner\\n __typename\\n }\\n source {\\n release {\\n id\\n repl {\\n id\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n ... on UserError {\\n message\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}]",
"method": "POST",
"mode": "cors",
"credentials": "include",
});
await statusCheck(res);
res = await res.json();
const id = res[0].data.createRepl.id;
ids.push(id);
} catch (err) {
handleError(err);
}
}
document.getElementById("getlinks").disabled = false;
}
async function statusCheck(res) {
if (!res.ok) {
throw new Error(await res.text());
}
return res;
}
function handleError() {
console.error("ERROR couldn't fork replits or couldn't get invite links");
}
async function getLink() {
document.getElementById("getlinks").disabled = true;
const urls = [];
for (let id of ids) {
let res = await fetch("https://replit.com/graphql", {
"headers": {
"accept": "*/*",
"content-type": "application/json",
"sec-ch-ua": "Replit Auto Forker",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest"
},
"body": "[{\"operationName\":\"MultiplayerRefreshInviteUrl\",\"variables\":{\"replId\":\"" + id + "\"},\"query\":\"mutation MultiplayerRefreshInviteUrl($replId: String!) {\\n refreshMultiplayerInviteLink(replId: $replId) {\\n id\\n ... on Repl {\\n id\\n inviteUrl\\n __typename\\n }\\n __typename\\n }\\n}\\n\"}]",
"method": "POST",
"mode": "cors",
"credentials": "include",
});
await statusCheck(res);
res = await res.json();
const url = res[0].data.refreshMultiplayerInviteLink.inviteUrl;
urls.push("https://replit.com" + url);
await new Promise(resolve => setTimeout(resolve, 1000)); // avoid server error
}
let string = "";
for (let i = 0; i < urls.length; i++) {
console.log(urls[i]);
string += urls[i] + "\n";
}
await window.navigator.clipboard.writeText(string);
}
})();