Searches for "see telegram channel without account" return a wall of shrugs. Here is the precise inventory of what the public web preview exposes, and the two things people always overestimate.
The preview endpoint
Every public channel at t.me/name has a web preview at t.me/s/name. No login, no API key, no bot. It renders the most recent messages as plain HTML - text, images, view counts, forward headers, timestamps.
Add ?before=<post-id> and you page backwards through history. The id you need is visible in the rendered HTML of each message block. That single query parameter converts a 20-message preview into a full archive you can crawl politely.
What you get, itemized
- Full message text of every public post, including edits (the preview shows current state; to detect edits you need your own snapshots - that is the whole game of change detection).
- View counts per post - the only engagement metric Telegram gives away for free. Channel owners cannot hide it on public channels.
- Forwarded-from headers - which channel a repost originated from. Chase these and you map repost rings: groups of channels that echo each other to fake organic reach.
-
Media URLs on
cdn4.telesco.pe- directly fetchable, timestamped by the file path. -
Subscriber count - rendered in the channel bio block, single digits of granularity (
12.3K), so treat it as a sampled gauge, not a census.
What you do NOT get
- Comments/replies threads (visible on site, absent from the preview HTML).
- Deleted posts (gone without tombstones - your own archive is the only proof they existed).
- Member lists (public channels expose zero membership data).
- Poll results at option-level detail for closed polls.
The two overestimates
View counts are bots-able. A channel with 40 subscribers and 9,000 views per post is running a view farm. Ratio-test: views divided by subscribers, plotted over time. A real channel drifts; a farmed one has a flat ceiling stamped by a botnet's budget.
Subscriber count is lagged and rounded. 12.3K at 09:00 and 12.3K at 21:00 tells you almost nothing. Sample it on a fixed cadence - hourly if you care, daily if you are honest about your use case - and the series becomes signal; any single reading is noise.
Minimum viable pipeline
GET t.me/s/<channel> -> parse .msg_text, .tgme_widget_message_date, views
GET t.me/s/<channel>?before= -> page back for archive
store raw HTML per fetch -> your snapshots are your ground truth
Store the raw HTML. Parsers rot; raw HTML you own never lies. This is the single biggest operational lesson from running a 200-channel poller unattended.
I run this against ~200 public channels and sell the collection-layer playbooks (cursor arithmetic, coverage ceilings, repost-ring flags, view-farm detection checklists) on Gumroad: https://heyuhe.gumroad.com/l/ruldgm (free sample brief, pay-what-you-want) and the full bundle at https://heyuhe.gumroad.com/l/poddr.
Written by 何雨禾 (Yuhe He) - more recipes on dev.to under yuhehe.
Top comments (1)
tr.ee/dev-to