Решение Exercism
Разбирайте страницу одного опубликованного решения Exercism в структурированный JSON с его треком, упражнением, автором, языком, историей итераций и полным исходным кодом.
Использование API
Добавьте &scraper=exercism-solution к запросу Crawling API. URL-кодируйте целевой URL в параметре url.
curl 'https://api.crawlbase.com/?token=YOUR_TOKEN' \
--data-urlencode 'url=https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop' \
--data-urlencode 'scraper=exercism-solution' -Gfrom crawlbase import CrawlingAPI
api = CrawlingAPI({'token': 'YOUR_TOKEN'})
res = api.get(
'https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop',
{'scraper': 'exercism-solution'}
)
import json
data = json.loads(res['body'])const { CrawlingAPI } = require('crawlbase');
const api = new CrawlingAPI({ token: 'YOUR_TOKEN' });
const res = await api.get(
'https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop',
{ scraper: 'exercism-solution' }
);
const data = JSON.parse(res.body);require 'crawlbase'
api = Crawlbase::API.new(token: 'YOUR_TOKEN')
res = api.get('https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop', scraper: 'exercism-solution')
data = JSON.parse(res.body)Пример входного URL
В параметре url работает любая страница одного опубликованного решения Exercism - страница по адресу /tracks/<track>/exercises/<slug>/solutions/<handle>. Например:
https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop
https://exercism.org/tracks/go/exercises/hello-world/solutions/erikschierboomСтруктура ответа
Тело ответа в формате JSON. Типы полей могут быть null, если исходная страница не содержит значения.
URL страницы решения, которая была обработана.
Трек, к которому относится решение.
Слаг трека (например,
ruby).Отображаемый заголовок трека (например,
Ruby).URL иконки трека.
Упражнение, к которому относится решение.
Слаг упражнения (например,
two-fer).Тип упражнения (например,
practice или concept).Отображаемый заголовок упражнения.
URL иконки упражнения.
Метка сложности (например,
easy, medium, hard).Краткое описание упражнения.
Автор решения.
Хэндл автора (имя пользователя Exercism).
Язык программирования решения.
Размер отступа в редакторе, который использовал автор, или null, если не указано.
Количество звёзд у решения.
Количество итераций в массиве
iterations.True, если решение устарело относительно текущего упражнения.
Индекс (
idx) опубликованной итерации, или null, если отсутствует.Время публикации решения (ISO 8601), или null, если отсутствует.
История итераций решения, сначала самые старые.
Индекс итерации (начиная с 1).
Статус анализа итерации (например,
no_automated_feedback).Статус прогона тестов итерации (например,
passed).Способ отправки итерации (например,
cli или api).Время создания итерации (ISO 8601), или null, если отсутствует.
True, если эта итерация является опубликованной.
True, если эта итерация самая последняя.
Полный исходный код опубликованного решения, или null, если отсутствует.
Пример ответа
{
"url": "https://exercism.org/tracks/ruby/exercises/two-fer/solutions/neilnorthrop",
"track": {
"slug": "ruby",
"title": "Ruby",
"iconUrl": "https://assets.exercism.org/tracks/ruby.svg"
},
"exercise": {
"slug": "two-fer",
"type": "practice",
"title": "Two Fer",
"iconUrl": "https://assets.exercism.org/exercises/two-fer.svg",
"difficulty": "easy",
"blurb": "Create a sentence of the form \"One for X, one for me.\""
},
"author": {
"handle": "neilnorthrop"
},
"language": "ruby",
"indentSize": 2,
"numStars": 42,
"numIterations": 2,
"isOutOfDate": false,
"publishedIterationIdx": 2,
"publishedAt": "2026-05-18T14:03:27Z",
"iterations": [
{
"idx": 1,
"status": "no_automated_feedback",
"testsStatus": "passed",
"submissionMethod": "cli",
"createdAt": "2026-05-17T22:41:03Z",
"isPublished": false,
"isLatest": false
},
{
"idx": 2,
"status": "no_automated_feedback",
"testsStatus": "passed",
"submissionMethod": "cli",
"createdAt": "2026-05-18T14:03:27Z",
"isPublished": true,
"isLatest": true
}
],
"code": "def two_fer(name = \"you\")\n \"One for #{name}, one for me.\"\nend"
}