DEV Community

agenthustler
agenthustler

Posted on

Telegram Channel Data Export: Messages, Members, and Analytics

Telegram channels are hubs for crypto signals, news, communities, and marketing. Exporting channel data — messages, member counts, and engagement metrics — enables market research, content analysis, and community monitoring.

What Telegram Data Can You Export?

  • Public channel messages and media metadata
  • Member counts and growth trends
  • Message engagement (views, forwards, reactions)
  • Channel descriptions and metadata
  • Message timestamps and posting frequency

Using Telethon for Channel Data

from telethon import TelegramClient
from telethon.tl.functions.channels import GetFullChannelRequest
import pandas as pd
from datetime import datetime, timedelta
import asyncio

# You need API credentials from https://my.telegram.org
API_ID = 'your_api_id'
API_HASH = 'your_api_hash'

class TelegramExporter:
    def __init__(self, api_id, api_hash, session_name='exporter'):
        self.client = TelegramClient(session_name, api_id, api_hash)

    async def connect(self):
        await self.client.start()

    async def get_channel_info(self, channel_username):
        """Get channel metadata and stats."""
        entity = await self.client.get_entity(channel_username)
        full = await self.client(GetFullChannelRequest(entity))

        return {
            'title': entity.title,
            'username': entity.username,
            'member_count': full.full_chat.participants_count,
            'description': full.full_chat.about,
            'created': entity.date.isoformat() if entity.date else '',
        }

    async def export_messages(self, channel_username, limit=500):
        """Export recent messages from a public channel."""
        messages = []
        async for message in self.client.iter_messages(channel_username, limit=limit):
            messages.append({
                'id': message.id,
                'date': message.date.isoformat(),
                'text': message.text or '',
                'views': message.views or 0,
                'forwards': message.forwards or 0,
                'replies': message.replies.replies if message.replies else 0,
                'has_media': message.media is not None,
            })
        return messages

    async def track_growth(self, channel_username, check_interval_hours=24):
        """Track channel member growth over time."""
        info = await self.get_channel_info(channel_username)
        record = {
            'timestamp': datetime.now().isoformat(),
            'channel': channel_username,
            'members': info['member_count'],
        }
        return record
Enter fullscreen mode Exit fullscreen mode

Running the Exporter

async def main():
    exporter = TelegramExporter(API_ID, API_HASH)
    await exporter.connect()

    # Get channel info
    info = await exporter.get_channel_info('duaborgnux')
    print(f"Channel: {info['title']}")
    print(f"Members: {info['member_count']:,}")

    # Export messages
    messages = await exporter.export_messages('duaborgnux', limit=200)
    df = pd.DataFrame(messages)
    print(f"\nExported {len(df)} messages")
    print(f"Average views: {df['views'].mean():.0f}")
    print(f"Average forwards: {df['forwards'].mean():.0f}")

    # Save to CSV
    df.to_csv('telegram_export.csv', index=False)

# Run it
asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Engagement Analysis

def analyze_engagement(messages_df):
    """Analyze posting patterns and engagement."""
    df = messages_df.copy()
    df['date'] = pd.to_datetime(df['date'])
    df['hour'] = df['date'].dt.hour
    df['day_of_week'] = df['date'].dt.day_name()

    # Best posting times
    hourly_engagement = df.groupby('hour')['views'].mean()
    best_hour = hourly_engagement.idxmax()
    print(f"Best posting hour: {best_hour}:00 (avg {hourly_engagement[best_hour]:.0f} views)")

    # Day-of-week analysis
    daily_engagement = df.groupby('day_of_week')['views'].mean()
    print(f"\nViews by day of week:")
    for day, views in daily_engagement.sort_values(ascending=False).items():
        print(f"  {day}: {views:.0f} avg views")

    # Content type performance
    media_views = df[df['has_media']]['views'].mean()
    text_views = df[~df['has_media']]['views'].mean()
    print(f"\nMedia posts avg views: {media_views:.0f}")
    print(f"Text-only posts avg views: {text_views:.0f}")

    return {
        'best_hour': best_hour,
        'hourly_engagement': hourly_engagement,
        'daily_engagement': daily_engagement,
    }
Enter fullscreen mode Exit fullscreen mode

Monitoring Multiple Channels

async def monitor_channels(exporter, channels, output='channel_monitor.jsonl'):
    """Monitor multiple channels for competitive analysis."""
    import json

    results = []
    for channel in channels:
        try:
            info = await exporter.get_channel_info(channel)
            messages = await exporter.export_messages(channel, limit=50)

            recent_views = sum(m['views'] for m in messages[:10])
            avg_views = recent_views / min(10, len(messages)) if messages else 0

            result = {
                'timestamp': datetime.now().isoformat(),
                'channel': channel,
                'members': info['member_count'],
                'avg_recent_views': avg_views,
                'posts_per_day': len(messages) / 7 if messages else 0,
            }
            results.append(result)
            print(f"  {channel}: {info['member_count']:,} members, {avg_views:.0f} avg views")

        except Exception as e:
            print(f"  {channel}: Error - {e}")

    with open(output, 'a') as f:
        for r in results:
            f.write(json.dumps(r) + '\n')

    return results
Enter fullscreen mode Exit fullscreen mode

Scaling with Cloud Solutions

For ongoing monitoring of multiple channels without maintaining your own Telegram client sessions, the Telegram Channel Scraper on Apify handles authentication, rate limits, and data export automatically.

When running data collection at scale across multiple platforms, ThorData provides the proxy infrastructure to prevent IP-based restrictions.

Conclusion

Telegram channel data is invaluable for market research, community monitoring, and content strategy. The Telethon library makes it straightforward to build custom export and analysis tools. Start with single-channel exports, build up to multi-channel monitoring, and use engagement analytics to understand what content resonates with your audience.

Top comments (0)