Skip to content

Dollchan API

Sthephan Shi edited this page Oct 17, 2017 · 17 revisions

[Read in English]

Скрипт имеет API для работы с внешними скриптами и приложениями.
Для регистрации API необходимо добавить в Ваш скрипт следующий код:

function getDollchanAPI() {
	return new Promise((resolve, reject) => {
		const dw = document.defaultView;
		const onmessage = ({ data, ports }) => {
			if(ports && ports.length === 1 && data === 'de-answer-api-message') {
				clearTimeout(to);
				dw.removeEventListener('message', onmessage);
				resolve(ports[0]);
			}
		};
		dw.addEventListener('message', onmessage);
		dw.postMessage('de-request-api-message', '*');
		const to = setTimeout(() => {
			dw.removeEventListener('message', onmessage);
			reject();
		}, 5e3);
	});
}

function runAPI() {
	getDollchanAPI().then(port => {
		port.onmessage = ({ data }) => {
			const result = data.data;
			switch(data.name) {
			case 'registerapi':
				for(let key in result) {
					console.log(`API ${ key } ${
						result[key] ? 'зарегистрирован' : 'недоступен' }.`);
				}
				break;
			case 'newpost':
				console.log('Новые посты: ', result);
				break;
			/* case '...': */
			}
		};
		port.postMessage({ name: 'registerapi', data: ['newpost'] });
		/* port.postMessage({ name: 'registerapi', data: ['...'] }); */
	}).catch(() => console.log('Dollchan API не обнаружен!'));
}

setTimeout(runAPI, 0);

Событие onmessage в функции runAPI будет возвращать объект data со следующими полями:

  • data.name — имя события,
  • data.data — данные, переданные событием.

Если у вас стоит куклоскрипт, то при запуске вы увидите в консоли список поддерживаемых API. Например,

API newpost зарегистрирован.

Если у вас стоит куклоскрипт старой версии, либо он отключен, то в консоли вы увидите:

Dollchan API не обнаружен!

Вы можете ознакомиться с работой API, скачав и установив тестовый скрипт: DollchanAPI_Test.user.js

Список API

1. newpost — новые посты

Событие с этим именем позволит вашему приложению отслеживать появление новых постов, которые добавляет на страницу куклоскрипт. API возвратит поле data с массивом номеров новых постов. Пример:

	const result = data.data;
	switch(data.name) {
	case 'newpost':
		console.log('Новые посты: ', result);
		/* ваш код */
		break;

При появлении новых постов в консоли будет выводиться сообщение вида:

Новые посты:  Array [ 18649619, 18649619 ]

Вместо console.log добавьте Ваш код, который будет обрабатывать массив data.data.

2. expandmedia — раскрытие картинок/webm

Это событие отслеживает момент разворачивания jpg/png/gif/webm/mp4 по центру или в посте. API возвратит поле data с атрибутом src картинки/видео. Пример:

	const result = data.data;
	switch(data.name) {
	case 'expandmedia':
		const src = data.data;
		const ext = src.split('.').pop();
		console.log(ext + ' открыт:', src);
		/* ваш код */
		break;

При раскрытии картинок/webm'ок в консоли будет выводиться сообщение вида:

jpg открыт: /b/src/146459420/14869184607150.jpg
png открыт: /b/src/146574543/14869060587720.png
webm открыт: /b/src/146584803/14869150047100.webm

Ваш код может обрабатывать только определенный контент, анализируя расширение файла, например:

	if(ext === 'webm') {
		const webmEl = document.querySelector(`video[src="${ src }"]`);
		/* обработка webm-файла */
	}

3. submitform — попытка отправить пост или создать тред

Это событие отслеживает результат отправки поста или попытки создания треда. API возвратит поле data с объектом, содержащим результат отправки. Объект может содержать поля:

  • successtrue в случае успешной отправки или false в случае неудачи,
  • num — номер поста при успешной отправке, если имиджборд поддерживает идентификацию своих постов,
  • error — текст ошибки при неудачной попытке отправить пост.

Пример:

	const result = data.data;
	switch(data.name) {
	case 'submitform':
		console.log(result);
		/* ваш код */
		break;

Возможные варианты результатов:

Object { success: true, num: 22098360 }
Object { success: true, num: null }
Object { success: false, error: "Ошибка: Капча невалидна." }
Object { success: false, error: "Ошибка: Пустое поле сообщения." }

4. filechange — добавление/изменение файлов, прикрепленных к форме отправки

Событие отслеживает момент, когда пользователь прикрепляет файл к форме создания поста или треда, либо очищает его, либо прикрепляет другой файл. API возвратит поле data с массивом всех объектов File. Пример:

	const result = data.data;
	switch(data.name) {
	case 'filechange':
		console.log('Files changed:', result);
		/* ваш код */
		break;

Варианты результатов:

Files changed: Array [ File ]
Files changed: Array [ File, File ]
Files changed: Array [ File, File, File ]
Files changed: Array [ File, <1 пустой элемент>, File ]

В данном случае к форме было добавлено три файла, потом удалён второй по счёту.