baiduLinkSubmit.js (120 lines of code) (raw):
const http = require('http');
const fs = require('fs');
const readline = require('readline');
const https = require('https');
if (!process.env.BAIDU_LINK_SUBMIT_TOKEN) {
throw new Error('no baidu link submit token configured');
}
/**
* get old site.txt from official site
*/
const getOldSiteData = () => {
return new Promise((resolve, reject) => {
https
.get('https://seata.apache.org/site.txt', (res) => {
res.setEncoding('utf-8');
if (res.statusCode === 200) {
res.on('data', (data) => {
resolve(data.split('\n'));
});
} else {
res.on('data', function (chunk) {
reject(
`get old site.txt from official site error,statusCode: ${res.statusCode},body:${chunk}`
);
});
}
})
.on('error', (e) => {
reject(e);
});
});
};
/**
* get the new generated local site.txt
*/
const getNewData = () => {
return new Promise((resolve, reject) => {
const data = [];
try {
const rl = readline.createInterface({
input: fs.createReadStream('sitemaps/site.txt'),
crlfDelay: Infinity,
});
rl.on('line', (line) => {
data.push(line);
}).on('close', () => {
resolve(data);
});
} catch (err) {
reject(err);
}
});
};
/**
* compute added data
*/
const computeAddedData = (oldData, newData) => {
const addedData = [];
newData.forEach((element) => {
if (!oldData.includes(element)) {
addedData.push(element);
}
});
return addedData;
};
const submit = (data) => {
return new Promise((resolve, reject) => {
var options = {
host: 'data.zz.baidu.com',
port: 80,
path:
'/urls?site=https://seata.apache.org&token=' +
process.env.BAIDU_LINK_SUBMIT_TOKEN,
method: 'POST',
headers: {
'Content-Type': 'text/plain',
},
};
var req = http.request(options, function (res) {
if (res.statusCode == 200) {
res.on('data', function (chunk) {
resolve(chunk);
});
} else {
res.on('data', function (chunk) {
reject(
`baidu link submit error,statusCode: ${res.statusCode},body:${chunk}`
);
});
}
});
req.on('error', function (e) {
reject('baidu link submit request error: ' + e.message);
});
// write data to request body
data.forEach((item) => {
req.write(item + '\n');
});
req.end();
});
};
getOldSiteData()
.then((oldData) => {
getNewData()
.then(async (newData) => {
try {
const addedData = computeAddedData(oldData, newData);
// baidu limits up to 2,000 entries at a time
while (addedData.length > 2000) {
// delete and intercept
const data = addedData.splice(0, 2000);
const result = await submit(data);
console.log(result);
if (result.remain < addedData.length) {
throw new Error('baidu link submit over quota');
}
}
// submission of the remaining data of less than 2,000 entries
if (addedData.length > 0) {
const result = await submit(addedData);
console.log(result);
}
} catch (err) {
console.error(err);
}
})
.catch((err) => {
console.error(err);
});
})
.catch((err) => {
console.error(err);
});