<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Monkey.D.Scraping</title>
    <description>The latest articles on DEV Community by Monkey.D.Scraping (@monkeydscraping).</description>
    <link>https://dev.to/monkeydscraping</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4235863%2F52fdc04d-6c8e-4080-be8a-2729c589ba54.png</url>
      <title>DEV Community: Monkey.D.Scraping</title>
      <link>https://dev.to/monkeydscraping</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/monkeydscraping"/>
    <language>en</language>
    <item>
      <title>What are people actually saying under that post? Facebook &amp; Instagram comment sentiment with Python</title>
      <dc:creator>Monkey.D.Scraping</dc:creator>
      <pubDate>Mon, 09 Nov 2026 21:17:52 +0000</pubDate>
      <link>https://dev.to/monkeydscraping/what-are-people-actually-saying-under-that-post-facebook-instagram-comment-sentiment-with-python-2977</link>
      <guid>https://dev.to/monkeydscraping/what-are-people-actually-saying-under-that-post-facebook-instagram-comment-sentiment-with-python-2977</guid>
      <description>&lt;p&gt;You launched something. The post has 400 comments. Your boss asks "so, how did it go?" and the honest answer is "the vibes are mixed".&lt;/p&gt;

&lt;p&gt;We can do better than vibes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure up front:&lt;/strong&gt; I built the comment scrapers and the repo used below. They're pay-per-result tools on Apify, and a test run costs a couple of cents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The plan
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pull every public comment from a Facebook or Instagram post (no login).&lt;/li&gt;
&lt;li&gt;Give each comment a sentiment and a short topic.&lt;/li&gt;
&lt;li&gt;Get a CSV plus a one-screen summary per post.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All the code is in &lt;a href="https://github.com/Monkeydscraping/social-comments-sentiment" rel="noopener noreferrer"&gt;social-comments-sentiment&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: get the comments
&lt;/h2&gt;

&lt;p&gt;The comments come from two Apify Actors, one per platform: &lt;a href="https://apify.com/monkey.d.scraping/instagram-comments-scraper" rel="noopener noreferrer"&gt;Instagram Comments Scraper&lt;/a&gt; and &lt;a href="https://apify.com/monkey.d.scraping/facebook-comments-scraper" rel="noopener noreferrer"&gt;Facebook Comments Scraper&lt;/a&gt;. From Python it's one call (&lt;code&gt;pip install apify-client&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;apify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monkey.d.scraping/instagram-comments-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;startUrls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.instagram.com/p/DDIJAfeyemG/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxComments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;max_total_charge_usd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_dataset_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has the text, author, date, likes and a link to the comment. Facebook works the same way with &lt;code&gt;facebook-comments-scraper&lt;/code&gt;, and also gives you replies.&lt;/p&gt;

&lt;p&gt;While writing this I ran it with 10 comments: done in 3 seconds, cost $0.0018.&lt;/p&gt;

&lt;p&gt;Price check, because it matters at scale: &lt;strong&gt;$0.18 per 1,000 comments&lt;/strong&gt; on the Free plan, less on paid plans. The most used Instagram comment scraper on the Store charges $2.60 per 1,000 on the same plan. Same comments, about 14× less.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: sentiment that understands emoji (and Spanish)
&lt;/h2&gt;

&lt;p&gt;First try: VADER, the classic free sentiment library. On a real Instagram post it found 9 positive comments out of 29. It read "❤️🙌🔥" as negative and had no idea what to do with Spanish. Fine for English tweets in 2014, not great for comment sections in 2026.&lt;/p&gt;

&lt;p&gt;Second try: send the comments to Claude, 50 at a time, and ask for structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"i"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"topic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"heart emojis"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same post: 19 positive, 8 neutral, 1 negative, 1 mixed. It gets emoji, other languages and sarcasm, and the topics are actually useful: "emoji reaction", "love for instagram", "ai generated content". Cost: roughly half a dollar per 1,000 comments with the default model, less with a smaller one.&lt;/p&gt;

&lt;p&gt;The repo does both: Claude if you have an Anthropic key, VADER if you don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: the summary
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python sentiment.py https://www.instagram.com/p/DDIJAfeyemG/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## https://www.instagram.com/p/DDIJAfeyemG/
29 comments: positive 19 (65%), neutral 8 (27%), negative 1 (3%), mixed 1 (3%)
Top topics: emoji reaction (5), laughing emojis (3), heart emojis (2), applause emojis (2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You also get the most liked negative comments per post. That's usually where the real feedback is hiding.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Comparing how two launches landed, with numbers instead of vibes.&lt;/li&gt;
&lt;li&gt;Reading a competitor's comments: what do their customers complain about?&lt;/li&gt;
&lt;li&gt;Feeding a weekly report, or an n8n workflow that writes to Google Sheets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Public comments only, no login, no browser on your side.&lt;/li&gt;
&lt;li&gt;A few cents per post with Claude, free with VADER.&lt;/li&gt;
&lt;li&gt;Everything is in the repo: &lt;a href="https://github.com/Monkeydscraping/social-comments-sentiment" rel="noopener noreferrer"&gt;social-comments-sentiment&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions, or a platform you want next? Comments are open. I read them, obviously.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with some help from an AI assistant. Code, prices and the test runs were checked by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>socialmedia</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I monitor brand mentions on Telegram (no account, no phone number)</title>
      <dc:creator>Monkey.D.Scraping</dc:creator>
      <pubDate>Mon, 09 Nov 2026 21:04:04 +0000</pubDate>
      <link>https://dev.to/monkeydscraping/how-i-monitor-brand-mentions-on-telegram-no-account-no-phone-number-3jln</link>
      <guid>https://dev.to/monkeydscraping/how-i-monitor-brand-mentions-on-telegram-no-account-no-phone-number-3jln</guid>
      <description>&lt;p&gt;A lot of stuff hits Telegram before it hits X or the news: crypto launches, leaks, product complaints, regional news. If you do OSINT, PR or brand monitoring, you want to know when a name shows up in public channels.&lt;/p&gt;

&lt;p&gt;Two problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Telegram has no public "search all channels" page.&lt;/li&gt;
&lt;li&gt;The official API wants a phone number and an account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built a tool for it: &lt;a href="https://apify.com/monkey.d.scraping/telegram-keyword-search-channel-scraper" rel="noopener noreferrer"&gt;Telegram Keyword Search&lt;/a&gt;. &lt;strong&gt;Disclosure up front:&lt;/strong&gt; it's mine, it runs on Apify and it's pay-per-result. A first test costs about one cent.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we want
&lt;/h2&gt;

&lt;p&gt;For a keyword (your brand, a product, a competitor), a table with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;post text&lt;/li&gt;
&lt;li&gt;publication date&lt;/li&gt;
&lt;li&gt;channel name&lt;/li&gt;
&lt;li&gt;a direct link to the original post&lt;/li&gt;
&lt;li&gt;views, reactions and media when the channel shows them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…as CSV or JSON, without logging in to Telegram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: run a tiny search
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://apify.com/monkey.d.scraping/telegram-keyword-search-channel-scraper/examples/search-bitcoin-posts-telegram-keyword-starter" rel="noopener noreferrer"&gt;five-post starter&lt;/a&gt; of Telegram Keyword Search, swap &lt;code&gt;bitcoin&lt;/code&gt; for your brand and hit Start. (Or open the &lt;a href="https://apify.com/monkey.d.scraping/telegram-keyword-search-channel-scraper" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt; and start from the prefilled input.)&lt;/p&gt;

&lt;p&gt;Price, no surprises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.001 per saved post&lt;/li&gt;
&lt;li&gt;$0.005 per search page checked&lt;/li&gt;
&lt;li&gt;$0.00005 start fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One search page + five posts = &lt;strong&gt;$0.01005&lt;/strong&gt;. A search that finds nothing costs only the start fee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: write a query that isn't dumb
&lt;/h2&gt;

&lt;p&gt;One line = one topic. Inside a line you can combine terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nike AND sneakers OR shoes NOT giveaway
"air max" -resale
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A post matches only if the terms are literally in the post text. So you don't get random posts from a channel that just happens to have your brand in its name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: filter the noise
&lt;/h2&gt;

&lt;p&gt;Under &lt;strong&gt;Quality filters&lt;/strong&gt; you can keep only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;posts with at least N views (&lt;code&gt;minViews&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;channels with at least N subscribers (&lt;code&gt;minSubscribers&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;original posts, no forwards (&lt;code&gt;excludeForwards&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;given languages (&lt;code&gt;postLanguages&lt;/code&gt;, e.g. &lt;code&gt;en&lt;/code&gt;, &lt;code&gt;ru&lt;/code&gt;, &lt;code&gt;zh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;posts with or without media (&lt;code&gt;mediaFilter&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also set &lt;strong&gt;Maximum cost per run&lt;/strong&gt; in the run options. The run stops there whatever happens. Boring, but it's the setting that lets you sleep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: get the data
&lt;/h2&gt;

&lt;p&gt;Each row looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"channelUsername"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bitcoinnews"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messageUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://t.me/bitcoinnews/16412"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publishedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-09T19:03:02.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"views"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"36"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matchedKeywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"bitcoin"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download CSV, Excel or JSON from the run page, or do it from Python (&lt;code&gt;pip install apify-client&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monkey.d.scraping/telegram-keyword-search-channel-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keywords&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your brand&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxResults&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;afterDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7 days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;max_total_charge_usd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_dataset_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publishedAt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;channelUsername&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messageUrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I ran the same input with &lt;code&gt;bitcoin&lt;/code&gt; and 3 posts while writing this: done in 8 seconds, all three posts from the same day, total cost $0.00805.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: make it a monitor
&lt;/h2&gt;

&lt;p&gt;Once you know which channels talk about you, watch those instead of all of Telegram. Fresher results, no search fee, and only posts you haven't seen yet.&lt;/p&gt;

&lt;p&gt;I put the whole thing in a small open repo, &lt;a href="https://github.com/Monkeydscraping/telegram-brand-monitor" rel="noopener noreferrer"&gt;telegram-brand-monitor&lt;/a&gt;. It remembers what it already reported, runs every day for free on GitHub Actions and can ping Slack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python monitor.py &lt;span class="s2"&gt;"your brand"&lt;/span&gt; &lt;span class="nt"&gt;--channels&lt;/span&gt; channel_one,channel_two &lt;span class="nt"&gt;--days&lt;/span&gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watching 30 new mentions a day costs about 3 cents. Days with nothing new cost basically nothing.&lt;/p&gt;

&lt;p&gt;Prefer no code? &lt;a href="https://apify.com/monkey.d.scraping/telegram-new-posts-monitor-channel-discovery" rel="noopener noreferrer"&gt;Telegram New Posts Monitor&lt;/a&gt; does the same on a schedule inside Apify, and n8n, Make or Zapier can forward the results wherever you want.&lt;/p&gt;

&lt;p&gt;Already know the channels and want their full history? That's &lt;a href="https://apify.com/monkey.d.scraping/telegram-channel-scraper" rel="noopener noreferrer"&gt;Telegram Channel Scraper&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No Telegram account, no phone number.&lt;/li&gt;
&lt;li&gt;Literal matches, with a link to every original post.&lt;/li&gt;
&lt;li&gt;Pay per result. First test ≈ one cent.&lt;/li&gt;
&lt;li&gt;Public channels only: private groups are out of scope, on purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Got a use case I didn't cover, or something broke? Tell me in the comments, I actually read them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with some help from an AI assistant. Code, prices and the test run were checked by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>osint</category>
      <category>telegram</category>
      <category>python</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
