|
@@ -403,11 +403,15 @@ export default class {
|
|
|
this.mode,
|
|
|
() => this.webshotCookies,
|
|
|
doOnNewPage => {
|
|
|
- this.queryUserMedia = ((userName, targetId) => {
|
|
|
+ this.queryUserMedia = ((username, targetId) => {
|
|
|
let page: Page;
|
|
|
- let url = linkBuilder({userName}) + '?__a=1';
|
|
|
- logger.debug(`pulling ${targetId !== '0' ? `feed ${url} up to ${targetId}` : `top of feed ${url}`}...`);
|
|
|
- return doOnNewPage(newPage => {
|
|
|
+ let url: string;
|
|
|
+ return (
|
|
|
+ username.includes(':') ? Promise.resolve(username) : this.queryUser(username)
|
|
|
+ ).then(userNameId => doOnNewPage(newPage => {
|
|
|
+ const [userName, userId] = userNameId.split(':');
|
|
|
+ url = graphqlLinkBuilder({userId});
|
|
|
+ logger.debug(`pulling ${targetId !== '0' ? `feed ${url} up to ${targetId}` : `top of feed ${url}`}...`);
|
|
|
page = newPage;
|
|
|
let timeout = this.webshotDelay / 2;
|
|
|
const startTime = new Date().getTime();
|
|
@@ -463,7 +467,7 @@ export default class {
|
|
|
if (!pageInfo?.has_next_page) return itemIds;
|
|
|
// else, fetch next page using end_cursor
|
|
|
logger.info('unable to find a smaller id than target, trying on next page...');
|
|
|
- url = graphqlLinkBuilder({userId: user.id, after: pageInfo.end_cursor});
|
|
|
+ url = graphqlLinkBuilder({userId, after: pageInfo.end_cursor});
|
|
|
const nextPageDelay = this.webshotDelay * (0.4 + Math.random() * 0.1);
|
|
|
timeout += nextPageDelay;
|
|
|
return promisify(setTimeout)(nextPageDelay)
|
|
@@ -472,17 +476,18 @@ export default class {
|
|
|
.then(({data}: {data: {user: IgGraphQLUser}}) => jsonHandler(data));
|
|
|
};
|
|
|
return responseHandler(response)
|
|
|
- .then(({graphql}: {graphql: {user: IgGraphQLUser}}) => jsonHandler(graphql));
|
|
|
+ .then(({data}: {data: {user: IgGraphQLUser}}) => jsonHandler(data));
|
|
|
}).catch((err: Error) => {
|
|
|
- if (err.name !== 'TimeoutError' && err.name !== 'ResponseError') throw err;
|
|
|
- if (err.name === 'ResponseError') {
|
|
|
- logger.warn(`error while fetching posts by @${userName}: ${err.message}`);
|
|
|
- } else logger.warn(`navigation timed out at ${getTimerTime()} ms`);
|
|
|
+ if (err.name === 'ResponseError' || err.name === 'TypeError') {
|
|
|
+ logger.warn(`error while fetching posts by @${userName}: ${err}`);
|
|
|
+ } else if (err.name === 'TimeoutError') {
|
|
|
+ logger.warn(`navigation timed out at ${getTimerTime()} ms`);
|
|
|
+ } else throw err;
|
|
|
return [] as string[];
|
|
|
}).then(itemIds => promisify(setTimeout)(getTimeout()).then(() =>
|
|
|
itemIds.map(id => this.lazyGetMediaById(id))
|
|
|
));
|
|
|
- }).finally(() => { page.close(); });
|
|
|
+ })).finally(() => { page.close(); });
|
|
|
});
|
|
|
setTimeout(this.work, this.workInterval * 1000 / this.lock.feed.length);
|
|
|
}
|
|
@@ -547,7 +552,8 @@ export default class {
|
|
|
logger.error(`current feed "${feed}" is invalid, please remove this feed manually`);
|
|
|
return resolve([]);
|
|
|
}
|
|
|
- return resolve(this.queryUserMedia(match[1], this.lock.threads[feed].offset)
|
|
|
+ const userNameId = `${match[1]}:${this.lock.threads[feed].id}`;
|
|
|
+ return resolve(this.queryUserMedia(userNameId, this.lock.threads[feed].offset)
|
|
|
.catch((error: Error) => {
|
|
|
logger.error(`error scraping media off profile page of ${match[1]}, error: ${error}`);
|
|
|
return [];
|