<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Copilot CLI - Tag - kepa.eu.org</title>
        <link>https://kepa.eu.org/tags/copilot-cli/</link>
        <description>Copilot CLI - Tag - kepa.eu.org</description>
        <generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>devnull@kepa.eu.org (Mateusz (Mati) Kępa)</managingEditor>
            <webMaster>devnull@kepa.eu.org (Mateusz (Mati) Kępa)</webMaster><copyright>© 2024-2026 Mati Kepa</copyright><lastBuildDate>Wed, 01 Jul 2026 00:00:00 &#43;0000</lastBuildDate><atom:link href="https://kepa.eu.org/tags/copilot-cli/" rel="self" type="application/rss+xml" /><item>
    <title>Build a simple LinkedIn bot for random post ideas</title>
    <link>https://kepa.eu.org/post015-linkedin-automated-bot/</link>
    <pubDate>Wed, 01 Jul 2026 00:00:00 &#43;0000</pubDate>
    <author>devnull@kepa.eu.org (Mateusz (Mati) Kępa)</author>
    <guid>https://kepa.eu.org/post015-linkedin-automated-bot/</guid>
    <description><![CDATA[<h2 id="preface">Preface</h2>
<hr>
<p>In modern social media, consistency is key. But posting regularly can be a chore.
Many people posting on social media failing to deliver anything but noise. So let me show you how to do it right.</p>
<p>You can automate LinkedIn posting, but do it the smart way: use the official API,
keep a small posting schedule, and review content before publishing to have at least some quality control.</p>
<p>In this post we build a minimal bot that:</p>
<ol>
<li>picks a random message from a local list,</li>
<li>can generate new post ideas with Copilot CLI (GPT-5.4-Mini),</li>
<li>publishes to LinkedIn through the official UGC API.</li>
</ol>
<hr>
<h2 id="step-by-step-linkedin-random-post-bot">Step-by-step: LinkedIn random post bot</h2>
<h3 id="1-create-a-linkedin-app-and-get-credentials">1. Create a LinkedIn app and get credentials</h3>
<ol>
<li>Go to <a href="https://www.linkedin.com/developers/" target="_blank" rel="noopener noreffer ">LinkedIn Developers</a> and create an app.</li>
<li>In your app, enable products/scopes needed for posting (<code>w_member_social</code>).</li>
<li>Generate an access token (OAuth flow).</li>
<li>Get your person URN (<code>urn:li:person:...</code>).</li>
</ol>
<p>You will use these two values in code:</p>
<ul>
<li><code>LINKEDIN_ACCESS_TOKEN</code></li>
<li><code>LINKEDIN_PERSON_URN</code></li>
</ul>
<h3 id="2-create-project-files">2. Create project files</h3>
<p>Create a new folder anywhere and add:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir linkedin-bot <span class="o">&amp;&amp;</span> <span class="nb">cd</span> linkedin-bot
</span></span><span class="line"><span class="cl">python3 -m venv .venv
</span></span><span class="line"><span class="cl"><span class="nb">source</span> .venv/bin/activate
</span></span><span class="line"><span class="cl">pip3 install requests python-dotenv</span></span></code></pre></div></div>
<p>Create <code>.env</code>:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-env">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-env" data-lang="env"><span class="line"><span class="cl"><span class="nv">LINKEDIN_ACCESS_TOKEN</span><span class="o">=</span>your_linkedin_access_token
</span></span><span class="line"><span class="cl"><span class="nv">LINKEDIN_PERSON_URN</span><span class="o">=</span>urn:li:person:your_person_urn</span></span></code></pre></div></div>
<p>Create <code>posts.txt</code> (one post per line):
It should act like a small queue of pre-approved posts you can add to over time.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-text">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Small systems beat big plans. Ship one useful thing today.
</span></span><span class="line"><span class="cl">Automate boring tasks first. Your future self will thank you.
</span></span><span class="line"><span class="cl">If your deploy takes 30 minutes, your feedback loop is broken.
</span></span><span class="line"><span class="cl">Write docs like the next on-call person is you at 3 AM.
</span></span><span class="line"><span class="cl">Watever you think about funny about AI slop to engage people attention. # (just don&#39;t do it. It&#39;s not worth it).</span></span></code></pre></div></div>
<p>This can be also automated with Copilot CLI, see next section.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">NEW_POST</span><span class="o">=</span><span class="s2">&#34;</span><span class="k">$(</span>copilot --model gpt-5.4-mini --allow-all-tools --prompt <span class="s1">&#39;Generate 10 short LinkedIn posts for DevOps engineers. Tone: practical, no buzzwords, max 220 chars each.&#39;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;%s\n&#34;</span> <span class="s2">&#34;</span><span class="nv">$NEW_POST</span><span class="s2">&#34;</span> &gt;&gt; posts.txt</span></span></code></pre></div></div>
<h3 id="3-add-the-bot-script">3. Add the bot script</h3>
<p>Create <code>linkedinbot.py</code>:</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="ch">#!/usr/bin/env python3</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">os</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">random</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">requests</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">dotenv</span> <span class="kn">import</span> <span class="n">load_dotenv</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">LINKEDIN_API_URL</span> <span class="o">=</span> <span class="s2">&#34;https://api.linkedin.com/v2/ugcPosts&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">load_posts</span><span class="p">(</span><span class="n">file_path</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl">  <span class="n">path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">    <span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Missing posts file: </span><span class="si">{</span><span class="n">file_path</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">posts</span> <span class="o">=</span> <span class="p">[</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">path</span><span class="o">.</span><span class="n">read_text</span><span class="p">(</span><span class="n">encoding</span><span class="o">=</span><span class="s2">&#34;utf-8&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()]</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="ow">not</span> <span class="n">posts</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&#34;posts.txt is empty&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="n">posts</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">post_to_linkedin</span><span class="p">(</span><span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">person_urn</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">text</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">headers</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;Authorization&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;Bearer </span><span class="si">{</span><span class="n">token</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;X-Restli-Protocol-Version&#34;</span><span class="p">:</span> <span class="s2">&#34;2.0.0&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;Content-Type&#34;</span><span class="p">:</span> <span class="s2">&#34;application/json&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">payload</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;author&#34;</span><span class="p">:</span> <span class="n">person_urn</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;lifecycleState&#34;</span><span class="p">:</span> <span class="s2">&#34;PUBLISHED&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;specificContent&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;com.linkedin.ugc.ShareContent&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;shareCommentary&#34;</span><span class="p">:</span> <span class="p">{</span><span class="s2">&#34;text&#34;</span><span class="p">:</span> <span class="n">text</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;shareMediaCategory&#34;</span><span class="p">:</span> <span class="s2">&#34;NONE&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;visibility&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="s2">&#34;com.linkedin.ugc.MemberNetworkVisibility&#34;</span><span class="p">:</span> <span class="s2">&#34;PUBLIC&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="n">LINKEDIN_API_URL</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">headers</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">status_code</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">201</span><span class="p">):</span>
</span></span><span class="line"><span class="cl">    <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;LinkedIn API error </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">status_code</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Post published successfully&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">text</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">main</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">load_dotenv</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">token</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s2">&#34;LINKEDIN_ACCESS_TOKEN&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">person_urn</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s2">&#34;LINKEDIN_PERSON_URN&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="ow">not</span> <span class="n">token</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">person_urn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    <span class="k">raise</span> <span class="ne">EnvironmentError</span><span class="p">(</span><span class="s2">&#34;Missing LINKEDIN_ACCESS_TOKEN or LINKEDIN_PERSON_URN&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="n">posts</span> <span class="o">=</span> <span class="n">load_posts</span><span class="p">(</span><span class="s2">&#34;posts.txt&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">selected</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">choice</span><span class="p">(</span><span class="n">posts</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Selected post:&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="n">selected</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="n">post_to_linkedin</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">person_urn</span><span class="p">,</span> <span class="n">selected</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&#34;__main__&#34;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">main</span><span class="p">()</span></span></span></code></pre></div></div>
<p>Run it:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python linkedinbot.py</span></span></code></pre></div></div>
<h3 id="4-optional-schedule-it">4. Optional: schedule it</h3>
<p>Use cron if you want automatic posting at fixed times.</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">crontab -e</span></span></code></pre></div></div>
<p>Example (Mon/Wed/Fri at 20:30):</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-cron">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">30 20 * * 1,3,5 cd /path/to/linkedin-bot &amp;&amp; /path/to/linkedin-bot/.venv/bin/python linkedinbot.py &gt;&gt; linkedinbot.log 2&gt;&amp;1</span></span></code></pre></div></div>
<p>Keep frequency low and content useful.</p>
<hr>
<h2 id="generate-post-ideas-with-copilot-cli-gpt-54-mini">Generate post ideas with Copilot CLI (GPT-5.4-Mini)</h2>
<p>I use Copilot CLI to generate a batch of short drafts, then I keep only the best ones.</p>
<p>Example prompt in Copilot CLI:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">copilot --model gpt-5.4-mini --prompt <span class="se">\
</span></span></span><span class="line"><span class="cl">  <span class="s2">&#34;Write one LinkedIn post for DevOps engineers, practical tone, max 220 chars, no hashtags&#34;</span></span></span></code></pre></div></div>
<p>Quick workflow:</p>
<ol>
<li>Generate 20 candidates with Copilot CLI.</li>
<li>Pick 5 that sound like you.</li>
<li>Save them to <code>posts.txt</code>.</li>
<li>Let the bot pick one randomly.</li>
</ol>
<hr>
<h2 id="small-hardening-tips">Small hardening tips</h2>
<p>Before you fully trust automation, add these:</p>
<ol>
<li><strong>Dry run mode</strong>: print post text without publishing.</li>
<li><strong>Minimum interval</strong>: prevent posting too often.</li>
<li><strong>Content filter</strong>: skip too-short or duplicate posts.</li>
<li><strong>Manual approval mode</strong>: require Enter before publish.</li>
</ol>
<p>Simple dry run toggle:</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="Copy to clipboard"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="n">DRY_RUN</span> <span class="o">=</span> <span class="kc">True</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">DRY_RUN</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="s2">&#34;DRY RUN - not publishing&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="nb">print</span><span class="p">(</span><span class="n">selected</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">  <span class="n">post_to_linkedin</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">person_urn</span><span class="p">,</span> <span class="n">selected</span><span class="p">)</span></span></span></code></pre></div></div>
<hr>
<h2 id="summary">Summary</h2>
<p>This setup gives you a clean, minimal LinkedIn bot:</p>
<ul>
<li>official API,</li>
<li>random post selection,</li>
<li>optional Copilot CLI draft generation,</li>
<li>easy scheduling.</li>
</ul>
<p>Start small, keep quality high, and automate only what you would be happy to post manually.</p>
]]></description>
</item>
</channel>
</rss>
