giorgio-zamparelli
9/3/2017 - 6:46 PM

Some hacked scripts to download all Intercom users and delete those who have 0 conversations

Some hacked scripts to download all Intercom users and delete those who have 0 conversations

import request from 'request';

export function getConversations(waiterioUserId) {

	return new Promise((resolve, reject) => {

		request(`https://api.intercom.io/conversations?type=user&user_id=${waiterioUserId}`, {

			auth: { user: 'YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM' },
			headers: { Accept: 'application/json' },

		}, (error, response, body) => {

			if (error) {

				// console.error(error);
				reject(error);

			} else {

				// console.log(body);

				const bodyObject = body ? JSON.parse(body) : null;

				if (bodyObject.error) {

					bodyObject.error.status = bodyObject.error.code;

					reject(bodyObject.error);

				} else {

					resolve(bodyObject.conversations);

				}

			}

		});

	});

}

export function getUserByEmail(email) {

	return new Promise((resolve, reject) => {

		let url = `https://api.intercom.io/users?email=${email}`;

		request(url, {

			auth: { user: 'YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM' },
			headers: { Accept: 'application/json' },

		}, (error, response, body) => {

			if (error) {

				// console.error(error);
				reject(error);

			} else {

				// console.log(body);

				const bodyObject = body ? JSON.parse(body) : null;

				if (bodyObject.error) {

					bodyObject.error.status = bodyObject.error.code;

					reject(bodyObject.error);

				} else {

					const usersLength = bodyObject && bodyObject.users ? bodyObject.users.length : 0;

					console.log(`getUsersByEmail(${email}) returned ${JSON.stringify(bodyObject, null, 4)} user`);

					resolve(bodyObject);

				}

			}

		});

	});

}

export function getUsersByPage(page) {

	return new Promise((resolve, reject) => {

		let url = 'https://api.intercom.io/users?per_page=60&order=asc';

		if (page) {
			url += `&page=${page}`;
		}

		request(url, {

			auth: { user: 'YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM' },
			headers: { Accept: 'application/json' },

		}, (error, response, body) => {

			if (error) {

				// console.error(error);
				reject(error);

			} else {

				// console.log(body);

				const bodyObject = body ? JSON.parse(body) : null;

				if (bodyObject.error) {

					bodyObject.error.status = bodyObject.error.code;

					reject(bodyObject.error);

				} else {

					const usersLength = bodyObject && bodyObject.users ? bodyObject.users.length : 0;

					console.log(`getUsersByPage(${page}) returned ${usersLength} users`);

					// if (usersLength === 0) {
					// 	console.log(JSON.stringify(bodyObject, null, 4));
					// }


					resolve(bodyObject);

				}

			}

		});

	});

}

export function getUsers() {

	return getUsersByPage().then(response => {

		console.log(`${response.pages.total_pages} pages`);

		const promises = [];

		for (let i = 50; i <= 80;/* response.pages.total_pages*/ i += 1) {

			promises.push(getUsersByPage(i).then(response => response.users));

		}

		return Promise.all(promises).then(users => [].concat(...users));

	});

}

export function deleteUser(waiterioUserId) {

	return new Promise((resolve, reject) => {

		request(`https://api.intercom.io/users?user_id=${waiterioUserId}`, {

			method: 'DELETE',
			auth: { user: 'YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM' },
			headers: { Accept: 'application/json' },

		}, (error, response, body) => {

			if (error) {

				// console.error(error);
				reject(error);

			} else {

				// console.log(body);

				const bodyObject = body ? JSON.parse(body) : null;

				if (bodyObject.error) {

					bodyObject.error.status = bodyObject.error.code;

					reject(bodyObject.error);

				} else {

					resolve(bodyObject);

				}

			}

		});

	});

}
  1. Place all files in the same folder
  2. Replace YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM with the token you can get from the Intercom dashboard
  3. Download all Intercom users into intercom-users.json running node download-intercom-users-using-scroll.js
  4. Delete all users who do not have a conversation by running node delete-intercom-users-with-no-conversations.js
const intercomUsers = require('./intercom-users.json');
const Intercom = require('./Intercom');

console.log(`Found ${intercomUsers.length} intercom users`);

async function deleteIntercomUsersWithNoConversations () {

	for (var i = 0; i < intercomUsers.length; i++) {

		const userId = intercomUsers[i].user_id;
		let conversations = await Intercom.getConversations(userId);

		if (conversations) {

			if (conversations.length === 0) {
				await Intercom.deleteUser(userId);
				console.log(`${i+1} Deleted user ${userId} with no conversations`);
			} else {
				console.log(`${i+1} Skipping user ${userId} with ${conversations.length} conversations`);
			}

		}

	}

}

deleteIntercomUsersWithNoConversations().then(process.exit);

process.on('unhandledRejection', error => {
	console.error('process on unhandledRejection', error);
	process.exit(1);
});
const fs = require('fs');
const fetch = require('isomorphic-fetch');

const headers = {
	'Authorization': 'Bearer YOUR_AUTHENTICATION_TOKEN_FROM_INTERCOM',
	'Accept': 'application/json'
};

function getScroll (scroll_param) {

	let url = `https://api.intercom.io/users/scroll`;

	if (scroll_param) {
		url += `?scroll_param=${scroll_param}`
	}

	return fetch(url, { headers })
		.then(response => response.json())
		.then(response => {

			if (response.errors) {
				console.log(`error ${JSON.stringify(response.errors)}`);
			} else if (response.users) {
				console.log(`found ${response.users.length} users`);
			}

			return response;

		});

}

async function getUsers () {

	let scroll_param;
	let finished = false;
	let users = [];

	while (!finished) {
		let scroll = await getScroll(scroll_param);
		users = users.concat(scroll.users);

		if (scroll.scroll_param) {
			scroll_param = scroll.scroll_param;
		} else {
			finished = true;
		}

	}

	return users;

}

getUsers().then(users => {

	console.log(`${users.length} users`);

	fs.writeFile('intercom-users.json', JSON.stringify(users, null, 4), function (err) {

		if (err) return console.log(err);
		process.exit();

	});

});