async function reactToPostsFromLatest() {
let currentPostId = 20247737;
console.debug(`Starting from post ID: ${currentPostId}`);
while (currentPostId > 0) {
const batch = [currentPostId, currentPostId - 1, currentPostId - 2];
console.debug(`Reacting to batch: ${batch.join(', ')}`);
await Promise.all(batch.map(postId => reactToPost(postId)));
await new Promise(resolve => setTimeout(resolve, 100));
currentPostId -= 3;
}
}
async function reactToPost(postId) {
const reactionUrl = `/posts/${postId}/react?reaction_id=13`;
console.debug(`Reacting to post at URL: ${reactionUrl}`);
let retries = 5;
let success = false;
const csrfToken = XF.config.csrf;
while (!success && retries > 0) {
try {
const response = await fetch(reactionUrl, {
method: 'POST',
credentials: 'include',
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "en-US,en;q=0.5",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
"Sec-GPC": "1",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"Priority": "u=0"
},
body: `_xfWithData=1&_xfToken=${encodeURIComponent(csrfToken)}&_xfResponseType=json`
});
if (response.status === 200) {
const data = await response.json();
if (data.reactionId === null) {
console.debug(`Reaction ID is null for post ID: ${postId}. Retrying...`);
retries--;
if (retries > 0) {
await new Promise(resolve => setTimeout(resolve, 1000));
} else {
console.error(`Max retries reached for post ID: ${postId}. Giving up.`);
}
} else {
console.debug(`Successfully reacted to post ID: ${postId}`);
success = true;
}
} else if (response.status === 403 || response.status === 404) {
console.debug(`Received ${response.status} for post ID: ${postId}. Skipping this post.`);
return false;
} else {
console.error(`Failed to react to post ID: ${postId}. Status: ${response.status}`);
retries--;
if (retries > 0) {
await new Promise(resolve => setTimeout(resolve, 1000));
} else {
console.error(`Max retries reached for post ID: ${postId}. Giving up.`);
}
}
} catch (error) {
console.error(`Error reacting to post ID: ${postId}`, error);
retries--;
if (retries > 0) {
await new Promise(resolve => setTimeout(resolve, 1000));
} else {
console.error(`Max retries reached for post ID: ${postId}. Giving up.`);
}
}
}
return success;
}
reactToPostsFromLatest();