| Телефон | Username | Дата | Текст поста | Медиа | Ссылки |
|---|
| Телефон | Username | Дата | Текст поста | Медиа | Ссылки |
|---|
ack) и которые старше срока хранения. Записи,
которые ещё не выгружали, не удаляются никогда. Дополнительно ротация освобождает
«зависшие» резервации (выгрузка началась, но ack не пришёл за
RESERVATION_TTL) — чтобы их можно было выгрузить заново.
SlutParser — сервис, который читает указанные Telegram-каналы/чаты, извлекает из сообщений телефоны и контакты и складывает их в базу данных.
Эта панель даёт: поиск/просмотр собранного (вкладка «Данные»), управление источниками (вкладка «Источники») и машинную выгрузку по API (для интеграций). Сбор идёт фоновым резидентным сервисом — он висит в памяти и дозабирает свежие сообщения.
irkutsk) — это отдельная таблица.Создайте API-ключ во вкладке «Настройки» → «API-ключ экспорта».
Выгрузка двухфазная: export отдаёт батч и резервирует записи, ack
подтверждает получение (после чего они помечаются и попадают под авторотацию).
# 0. Ваш ключ и адрес (ключ — из «Настройки»)
KEY="ВАШ_API_КЛЮЧ"
URL="https://sugar.lem-labs.ru:8443"
# 1. Запросить батч непомеченных записей.
# Сервер резервирует их (exported_at) и возвращает batch_id + items[].
RESP=$(curl -s -H "X-API-Key: $KEY" \
"$URL/api/export?table=slutparser&limit=500")
# 2. Сохранить батч в файл и достать batch_id из ответа.
echo "$RESP" > batch.json
BATCH=$(echo "$RESP" | grep -o '"batch_id":"[^"]*"' | cut -d'"' -f4)
# 3. Подтвердить получение → сервер ставит pulled_at для этого батча.
# Без ack записи останутся «зарезервированы» и через RESERVATION_TTL
# снова станут доступны для выгрузки (защита от потери при обрыве).
curl -s -X POST -H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d "{\"batch_id\":\"$BATCH\"}" \
"$URL/api/ack?table=slutparser"
# Повторяйте шаги 1–3, пока в ответе count > 0 — так выгребается всё.
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
const (
base = "https://sugar.lem-labs.ru:8443"
key = "ВАШ_API_КЛЮЧ"
table = "slutparser"
)
type exportResp struct {
BatchID string `json:"batch_id"`
Count int `json:"count"`
Items []map[string]any `json:"items"`
}
func main() {
c := &http.Client{}
for {
// 1. Запросить батч (сервер резервирует записи)
req, _ := http.NewRequest("GET", base+"/api/export?table="+table+"&limit=500", nil)
req.Header.Set("X-API-Key", key)
resp, err := c.Do(req)
if err != nil { panic(err) }
var d exportResp
json.NewDecoder(resp.Body).Decode(&d)
resp.Body.Close()
if d.Count == 0 { break } // данных больше нет
fmt.Printf("батч %s: %d записей\n", d.BatchID, d.Count)
// ... сохраните d.Items ...
// 2. Подтвердить → сервер ставит pulled_at
body, _ := json.Marshal(map[string]string{"batch_id": d.BatchID})
ar, _ := http.NewRequest("POST", base+"/api/ack?table="+table, bytes.NewReader(body))
ar.Header.Set("X-API-Key", key)
ar.Header.Set("Content-Type", "application/json")
ack, _ := c.Do(ar)
ack.Body.Close()
}
}
import requests
BASE = "https://sugar.lem-labs.ru:8443"
KEY = "ВАШ_API_КЛЮЧ"
TABLE = "slutparser"
H = {"X-API-Key": KEY}
while True:
# 1. Запросить батч (сервер резервирует записи)
r = requests.get(f"{BASE}/api/export", params={"table": TABLE, "limit": 500}, headers=H)
data = r.json()
if data["count"] == 0:
break # данных больше нет
print(f"батч {data['batch_id']}: {data['count']} записей")
# ... сохраните data["items"] ...
# 2. Подтвердить → сервер ставит pulled_at
requests.post(f"{BASE}/api/ack", params={"table": TABLE},
json={"batch_id": data["batch_id"]}, headers=H)
Готовый клиент slutpull делает этот цикл сам:
slutpull --url $URL --key $KEY --table slutparser --loop --out ./export —
export → сохранить → ack, пока есть данные.
В архиве: pull.sh, pull.py,
pull.go (только stdlib) и README — задайте KEY и запускайте.