Przejdź do treści głównej

Telegram::GroupScraper - Scraper publicznych kanałów i grup Telegram

Telegram

Przegląd scrapera

Scraper zbiera wszystkie posty i wiadomości z publicznych kanałów i grup Telegram.

Logika działania różni się od pozostałych scraperów: on automatycznie iteruje po wiadomościach w kanale lub grupie. Z tego powodu nie można używać go razem z innymi scraperami w jednym zadaniu.

Kolejność wierszy w wyniku nie jest gwarantowana według numeru posta (zależy od wątków). Metadane czatu/kanału są ładowane raz na kanał i duplikowane w każdym wierszu posta.

Zapisywanie wyników jest możliwe w dowolnej formie i strukturze, której potrzebujesz, dzięki wbudowanemu potężnemu silnikowi szablonów Template Toolkit, który pozwala na stosowanie dodatkowej logiki do wyników i wyprowadzanie danych w różnych formatach, w tym JSON, SQL i CSV.

Przypadki użycia scrapera

Zbierane dane

Działa z publicznymi kanałami i grupami.

Wiadomość

  • Link do posta (url)
  • ID posta (post_id)
  • Nazwa użytkownika kanału/grupy bez @ (channel)
  • Tekst posta z HTML (message_text)
  • Ten sam tekst bez HTML (message_text_plain) — dla filtrów, wyszukiwania i wyjścia
  • Data w formacie ISO (message_date)
  • Wyświetlenia (views) — jak w Telegramie: 15.5K, 1.2M itd.; tylko dla kanałów, dla grup — puste
  • Powiadomienie o wideo (message_video_notice) — jeśli w poście jest wideo, ale w tablicy message_videos nie ma URL, a to pole jest wypełnione: film można obejrzeć tylko w Telegramie po zalogowaniu na własne konto (wymagana autoryzacja), brak bezpośredniego linku do pliku. Nie jest to błąd scrapowania — Telegram nie udostępnia takich filmów bez zalogowania się na konto

Autor posta

  • Link do profilu (user_link)
  • Imię (user_name)
  • URL awatara (user_avatar)

Przesłanie (forward)

  • Skąd przesłano (forward_from)
  • Link do źródła (forward_from_url) — URL oryginału, jeśli jest dostępny
  • Wyjaśnienie w przypadku braku linku (forward_from_notice) — wypełniane, jeśli forward_from_url jest pusty (np. „Source link not available in embed”): brak bezpośredniego linku, oryginał mógł zostać usunięty, ukryty lub jest niedostępny z innego powodu. Nie jest to błąd scrapera

Odpowiedź (reply)

  • URL wiadomości, na którą udzielono odpowiedzi (reply_to_url)
  • ID posta z URL (reply_to_post_id)
  • Autor oryginalnej wiadomości (reply_to_author)
  • Tekst oryginalnej wiadomości, plain (reply_to_text)

Reakcje

  • Suma wszystkich reakcji (reactions_total) — liczba jako ciąg znaków; K/M/B są przeliczane

Metadane czatu/kanału

Ładowane raz na kanał, powielane w każdym wierszu posta.

  • Nazwa (chat_title)
  • Liczba subskrybentów/uczestników (chat_members)
  • Online (chat_online) — tylko dla grup; liczba użytkowników online w momencie rozpoczęcia zbierania danych z kanału, nie jest aktualizowana w trakcie scrapowania. Dla kanałów — puste
  • Opis, plain text (chat_description)
  • Liczniki mediów i linków (chat_photos, chat_videos, chat_files, chat_links) — tylko dla kanałów

Tablice

reactions — pola emoji, count (jak w Telegramie: 16, 1.2K). Kto postawił reakcję — nie jest zbierane: dostępne są tylko typ emoji i łączna liczba

message_photos — pole url; album — kilka wierszy.

message_videos — pole url. Jeśli nie ma URL, a w poście jest wideo — sprawdź message_video_notice (widok tylko po zalogowaniu do Telegrama)

links — pole url; linki zewnętrzne z tekstu posta. Linki typu t.me/username bez ścieżki (path) nie trafiają tutaj (są to wzmianki/mentions).

mentions — pole username (@username); z linków t.me/username oraz tekstu @username w tagach <a>.

Możliwości

  • Elastyczna normalizacja zapytań (zobacz Zapytania)
  • Filtry według daty (dateFrom, dateTo) i przesłanych wiadomości (skipForwards)
  • Albumy zdjęć i wideo — kilka adresów URL w jednym poście

Warianty użycia

  • Zbieranie zawartości postów z kanału lub grupy
  • Monitorowanie reakcji, wyświetleń i przesłań dalej

Zapytania

Obsługiwane są publiczne kanały i grupy. Wszystkie formaty są sprowadzane do https://t.me/{username}:

ZapytanieZachowanie
@usernamekanał lub grupa, start od Start message number
usernameto samo
https://t.me/usernameto samo
t.me/usernameto samo
https://t.me/s/usernameto samo
https://t.me/username/123kanał lub grupa, start od posta #123 (Start message number jest ignorowany)

Nieprawidłowe zapytanie → wiersz w logu Unknown query, wynik pusty.

Przykłady:

https://t.me/a_parser
@a_parser
https://t.me/a_parser/100

Warianty wyprowadzania wyników

A-Parser obsługuje elastyczne formatowanie wyników dzięki wbudowanemu silnikowi szablonów Template Toolkit, co pozwala mu na wyprowadzanie wyników w dowolnej formie, a także w formie strukturalnej, na przykład CSV lub JSON

Wynik domyślny

Format wyniku:

$channel/$post_id: $message_text_plain ($views views, $reactions_total reactions)

Przykład wyniku:

a_parser/1234: to są filtry) ( views, 0 reactions)
a_parser/85962: Google wypuścił coś nowego w kwestii ochrony) ( views, 2 reactions)

Wynik w tabeli CSV

Format wyniku:

[% tools.CSVline(channel, post_id, message_text_plain, views, reactions_total) %]

Przykład wyniku:

a_parser,1234,"to są filtry)",,0
a_parser,85962,"Google wypuścił coś nowego w kwestii ochrony)",,2

Filtrowanie i pomijanie postów

Wiersz nie trafia do wyniku, jeśli:

  1. Data jest poza zakresem Date from / Date to
  2. Włączona jest opcja Skip forwards i post jest przesłany dalej

Przy filtrowaniu według daty lub forward post jest uznawany za znaleziony, a przeglądanie kanału jest kontynuowane.

Przeglądanie kanału zatrzymuje się, gdy:

  • po ostatnim znalezionym poście sprawdzono pod rząd Max empty posts ID bez nowych znalezisk;
  • lub wystąpi seria pustych postów od początku (jeśli nie znaleziono jeszcze żadnego posta).

Przetwarzanie wyników

A-Parser pozwala przetwarzać wyniki bezpośrednio podczas scrapowania, w tej sekcji przedstawiliśmy najpopularniejsze przypadki dla scrapera Telegram

Filtrowanie wyników według występowania słów w wiadomości

Przykład

Należy dodać filtr i wybrać z listy rozwijanej $message_text - Message text. Wybrać typ RegEx match. W polu dla regexa wpisać wyrażenie regularne z potrzebnymi słowami:

\bscraper\b|\bGoogle\b|\byandex\b|\bscraper\b|\bProxy\b|\bDorki\b

\b - granica słowa

| - LUB

is - flaga regexa

Pobierz przykład

Jak zaimportować przykład do A-Parser

eJyVVN1v2jAQ/18sHjaJ8qFSacobRaLaxEpX6BOg6oovqVfH9myHgTL+952dkMC6
PewhVu53v/v2uWQe3Jt7sOjQO5asSmbiP0uYR4mZhfyK6+0V7iE3ElmXGbAObeCu
2LKmJMmd1YVZbC0YtETimEIhPeuWzB8MkrdUSB9V5D5oEpajc5Dhs8c9EWvCsmJb
zMFvXwnegSwCsl6/rIvB6DqN5yCco+ocRuSmRtYvv+i70zqTWAsHUBz3tfAfToIw
TFvSNcYTzgw+nVNHLak2gIZElWjjhVZUinDsuNmcOuGm2lKxhHfMsFd3v1EuYIdL
XfUPW3hK0j3koTEdDh6DtpdGRx8+9nxsKHAuQkSQVYQwsjbqkxI/YmOVJi79WoFu
anUeJx8dBPBwym7FOlFm5KKItt8qG5akIB12maNUp0CJ8D81ggYLXtt57ADhJdNq
LOUMdyhbWvR/WwjJ6X6NUzL6XBv+nTJ/5+PYlHceaof2p6UcGi9Rup1/ba24numM
KudhUFLkwpPsJrpQYTADAt8QTdOz+9CzXFtswnhbYBOc1smg4kRsJzY2LXRRxcVU
LsGtVqnI5pS/FRxPzEItaWfnaqLDRoayVCElTcXhY3s7xq6eQhCayt8ZT2KIUPlp
Y5nXWroviypVYwXdvpuQYE6NPI9au9yClE+Ps3MNa28UCa/eG5f0+76XYx+eq/eD
BUOPmaYbRWUdN83D0rxF5b+el6Q80si+u4fKIBQY6IRRp1zcseHxN9yRrow=

Możliwe ustawienia

ParametrWartość domyślnaOpis
Max empty posts1000Ile pustych ID z rzędu sprawdzać po ostatnim znalezionym poście przed zatrzymaniem skanowania kanału. To nie jest limit zapisanych postów
Start message number1Numer posta, od którego należy zacząć skanowanie (jeśli w zapytaniu nie ma /123)
Skip forwardsNie zapisuj wiadomości przekazanych dalej
Date fromData od, włącznie. Format YYYY-MM-DD
Date toData do, bez daty końcowej. Format YYYY-MM-DD