{"openapi":"3.1.0","info":{"title":"Ключи","version":"0.3.1","description":"Маленькие умные функции. Обычный HTTP — работает из любого языка без единой зависимости. С ключом доступа запросы не считаются вовсе. Без ключа — 20 запросов в минуту и 100 в сутки на адрес; ответы из кэша не считаются. Публичный ключ лежит открыто на /public-token."},"servers":[{"url":"https://monoblock.casa/keys"}],"paths":{"/k/alive":{"get":{"operationId":"alive","summary":"Жив ли канал","description":"Читает публичную превью-страницу t.me — ту самую, которую Telegram отдаёт мессенджерам для картинки ссылки. Отвечает, существует ли канал/группа/бот/аккаунт, и заодно отдаёт всё, что вообще есть на странице: название, описание, галочку верификации, число подписчиков или участников, сколько сейчас онлайн, аватарку и прямую ссылку в приложение. Мёртвые и заблокированные страницы отличаются от живых по разметке, а не по коду ответа: Telegram на удалённый канал возвращает 200 и заглушку.","tags":["telegram","проверка","без-аккаунта"],"parameters":[{"name":"link","in":"query","required":true,"description":"@username, ссылка t.me/... или приватный инвайт +hash","schema":{"type":"string"},"example":"durov"}],"responses":{"200":{"description":"результат","content":{"application/json":{"schema":{"type":"object","properties":{"is_alive":{"type":"boolean","description":"существует ли страница"},"kind":{"type":"string","description":"channel, group, bot, user или unknown; приватность типа не отменяет — она в поле is_private, а private_invite остаётся только когда вид по странице не определить"},"title":{"type":"string","description":"название"},"description":{"type":"string","description":"описание из шапки"},"members_count":{"type":"integer","description":"подписчиков, участников или пользователей бота за месяц"},"members_label":{"type":"string","description":"чего именно счётчик: subscribers, members, monthly users"},"online_count":{"type":"integer","description":"сколько участников группы сейчас онлайн"},"verified":{"type":"boolean","description":"стоит ли галочка Telegram"},"is_private":{"type":"boolean","description":"вход по приглашению +hash, страницы без ссылки не найти"},"needs_request":{"type":"boolean","description":"войти можно только по заявке, которую кто-то должен одобрить"},"restricted":{"type":"boolean","description":"заблокирован Telegram за нарушения"},"has_preview":{"type":"boolean","description":"у канала открыта публичная лента t.me/s/..."},"avatar_url":{"type":"string","description":"прямая ссылка на аватарку"},"deep_link":{"type":"string","description":"ссылка вида tg://resolve — открывает прямо в приложении"},"action":{"type":"string","description":"надпись на кнопке страницы: View in Telegram, Start Bot, Send Message"},"username":{"type":"string","description":"имя, приведённое к канону, без @ и без t.me"},"url":{"type":"string","description":"адрес проверенной страницы"},"error":{"type":"string","description":"почему не жив, если не жив"},"cached":{"type":"boolean","description":"ответ пришёл из кэша"}}}}}},"400":{"description":"не хватает параметров или мусор на входе"},"429":{"description":"превышена квота"},"502":{"description":"внешний сервис не ответил"}}}},"/k/answer":{"get":{"operationId":"answer","summary":"Ответ на вопрос","description":"Вопрос уходит параллельно в Википедию, Викиданные, Викисловарь, DuckDuckGo, на карту OpenStreetMap, в погоду, в курсы валют (166 штук, включая рубль), в научные базы, в каталог книг и в реестры пакетов. Каждый источник отвечает своим полем, отдельно называется лучший ответ и ссылки, которыми его можно проверить. Если sources не указать, ключ смотрит на сам вопрос и решает, кого спрашивать: про город — карту, про валюту — курсы, про пакет — реестры. Моделей тут нет намеренно: бесплатные упираются в лимиты, а их ответ нечем проверить. Выдача поисковиков не скребётся — берутся только источники с открытым интерфейсом, которые сами разрешают к себе ходить.","tags":["поиск","справка","много-источников","без-ключей"],"parameters":[{"name":"q","in":"query","required":true,"description":"сам вопрос, обычными словами","schema":{"type":"string"},"example":"кто такой Павел Дуров"},{"name":"sources","in":"query","required":false,"description":"через запятую: wiki, ddg, wikidata, wiktionary, osm, weather, rates, crossref, arxiv, books, pypi, npm, github; пусто — ключ выберет сам; all — все","schema":{"type":"string"},"example":"wiki,osm"},{"name":"lang","in":"query","required":false,"description":"ru или en","schema":{"type":"string"},"example":"ru"}],"responses":{"200":{"description":"результат","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","description":"нашлось ли хоть что-то"},"answer":{"type":"string","description":"лучший ответ из всех источников"},"source":{"type":"string","description":"чей это ответ"},"asked":{"type":"string","description":"кого спрашивали"},"found":{"type":"string","description":"кто ответил не пустым"},"links":{"type":"string","description":"ссылки, которыми ответ можно проверить"},"wiki":{"type":"string","description":"Википедия: сводка статьи"},"ddg":{"type":"string","description":"DuckDuckGo: краткая справка"},"wikidata":{"type":"string","description":"Викиданные: что это за сущность"},"wiktionary":{"type":"string","description":"Викисловарь: значение слова"},"osm":{"type":"string","description":"OpenStreetMap: место на карте"},"weather":{"type":"string","description":"погода в этом месте прямо сейчас"},"rates":{"type":"string","description":"курс и пересчёт суммы: 166 валют, включая рубль, гривну, тенге"},"crossref":{"type":"string","description":"научная статья по теме"},"arxiv":{"type":"string","description":"препринт по теме"},"books":{"type":"string","description":"книга из каталога Open Library"},"pypi":{"type":"string","description":"пакет Python"},"npm":{"type":"string","description":"пакет JavaScript"},"github":{"type":"string","description":"репозиторий на GitHub"},"error":{"type":"string","description":"что не так с вопросом, если не так"},"dict":{"type":"string","description":"толкование английского слова: значение, часть речи, транскрипция"},"sea":{"type":"string","description":"море рядом: высота волны, период, температура воды"},"history":{"type":"string","description":"какая погода была в указанный день (дату писать в вопросе)"},"flood":{"type":"string","description":"расход воды в ближайшей реке — грубый признак паводка"},"time":{"type":"string","description":"который час и часовой пояс в этом месте"},"country":{"type":"string","description":"страна: столица, население, валюта, площадь"},"steam":{"type":"string","description":"игра в Steam: цена, платформы"},"drug":{"type":"string","description":"лекарство по данным FDA: для чего, предупреждения"},"cached":{"type":"boolean","description":"ответ пришёл из кэша"}}}}}},"400":{"description":"не хватает параметров или мусор на входе"},"429":{"description":"превышена квота"},"502":{"description":"внешний сервис не ответил"}}}},"/k/crypto":{"get":{"operationId":"crypto","summary":"Цена монеты","description":"Отдельно от обычных курсов намеренно. У валюты курс — одно число от центробанка, меняется раз в день. У монеты есть цена сразу в нескольких валютах, движение за сутки, объём торгов и капитализация, и всё это меняется ежеминутно. Складывать их в один ответ значило бы сделать хуже обоим. Понимает и коды (BTC, ETH), и слова — «биткоин», «эфир», «курс тона в шекелях». Источник — CoinGecko, открытый и без ключа, знает больше десяти тысяч монет.","tags":["деньги","крипта"],"parameters":[{"name":"q","in":"query","required":true,"description":"монета словом или кодом; можно сразу указать валюту","schema":{"type":"string"},"example":"биткоин"},{"name":"vs","in":"query","required":false,"description":"в каких валютах показать цену, через запятую","schema":{"type":"string"},"example":"usd,ils"}],"responses":{"200":{"description":"результат","content":{"application/json":{"schema":{"type":"object","properties":{"coin":{"type":"string","description":"название монеты"},"symbol":{"type":"string","description":"биржевой код"},"id":{"type":"string","description":"имя монеты в CoinGecko"},"price":{"type":"string","description":"цена в запрошенных валютах"},"change_24h":{"type":"string","description":"изменение за сутки"},"market_cap":{"type":"string","description":"капитализация"},"volume_24h":{"type":"string","description":"объём торгов за сутки"},"rank":{"type":"integer","description":"место по капитализации"},"ok":{"type":"boolean","description":"нашлась ли монета"},"error":{"type":"string","description":"что не так, если не нашлась"},"cached":{"type":"boolean","description":"ответ пришёл из кэша"}}}}}},"400":{"description":"не хватает параметров или мусор на входе"},"429":{"description":"превышена квота"},"502":{"description":"внешний сервис не ответил"}}}},"/k/dev":{"get":{"operationId":"dev","summary":"Уязвимость, домен или адрес","description":"Три вещи, которые разработчик ищет чаще всего и каждый раз открывает разные сайты. Номер уязвимости — что за дыра, насколько опасна, что затронуто. Домен — кто владелец, когда истекает, куда указывает, есть ли копия в веб-архиве. IP-адрес — чей он, откуда и какой провайдер. Что именно вы дали, ключ понимает сам: номер, домен и адрес друг на друга не похожи. Источники открытые и без ключей: CIRCL (зеркало базы CVE), RDAP вместо устаревшего whois, DNS через Cloudflare, Веб-архив, ip-api.","tags":["разработка","безопасность","домены"],"parameters":[{"name":"q","in":"query","required":true,"description":"номер уязвимости, домен или IP-адрес","schema":{"type":"string"},"example":"CVE-2021-44228"}],"responses":{"200":{"description":"результат","content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","description":"что распознали: cve, domain или ip"},"subject":{"type":"string","description":"то же, приведённое к канону"},"severity":{"type":"string","description":"оценка опасности уязвимости по CVSS"},"published":{"type":"string","description":"когда уязвимость опубликовали"},"description":{"type":"string","description":"в чём суть уязвимости"},"affected":{"type":"string","description":"чьи продукты затронуты"},"registrar":{"type":"string","description":"через кого зарегистрирован домен"},"created":{"type":"string","description":"когда домен зарегистрировали"},"expires":{"type":"string","description":"когда регистрация истекает"},"nameservers":{"type":"string","description":"чьи DNS-серверы обслуживают домен"},"status":{"type":"string","description":"состояние регистрации"},"ips":{"type":"string","description":"адреса, на которые указывает домен"},"mx":{"type":"string","description":"куда идёт почта домена"},"archived":{"type":"string","description":"дата последней копии в веб-архиве"},"country":{"type":"string","description":"страна адреса"},"city":{"type":"string","description":"город адреса"},"isp":{"type":"string","description":"провайдер"},"org":{"type":"string","description":"организация, которой выделен адрес"},"asn":{"type":"string","description":"автономная система"},"reverse":{"type":"string","description":"обратное имя адреса"},"ok":{"type":"boolean","description":"получилось ли что-то узнать"},"error":{"type":"string","description":"что не так, если не получилось"},"cached":{"type":"boolean","description":"ответ пришёл из кэша"}}}}}},"400":{"description":"не хватает параметров или мусор на входе"},"429":{"description":"превышена квота"},"502":{"description":"внешний сервис не ответил"}}}}}}