{"id":18005231,"url":"https://github.com/suissa/bot-telegram","last_synced_at":"2025-03-26T10:31:52.868Z","repository":{"id":140332656,"uuid":"88169827","full_name":"suissa/bot-telegram","owner":"suissa","description":"Exemplo de como criar um BOT para o melhor app de mensagens do mundo: Telegram.","archived":false,"fork":false,"pushed_at":"2017-05-02T16:08:53.000Z","size":57,"stargazers_count":63,"open_issues_count":2,"forks_count":16,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-21T15:12:33.014Z","etag":null,"topics":["bot","curso","nois","que","suissera","telegram","telegram-bot","telegram-bot-api","tutorial","veio","voa","webschool"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/suissa.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-13T13:49:41.000Z","updated_at":"2025-03-15T03:58:52.000Z","dependencies_parsed_at":null,"dependency_job_id":"d94f2906-b6a7-40e2-bac0-4233fccdea94","html_url":"https://github.com/suissa/bot-telegram","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suissa%2Fbot-telegram","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suissa%2Fbot-telegram/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suissa%2Fbot-telegram/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/suissa%2Fbot-telegram/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/suissa","download_url":"https://codeload.github.com/suissa/bot-telegram/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245636883,"owners_count":20648046,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","curso","nois","que","suissera","telegram","telegram-bot","telegram-bot-api","tutorial","veio","voa","webschool"],"created_at":"2024-10-30T00:18:31.023Z","updated_at":"2025-03-26T10:31:52.861Z","avatar_url":"https://github.com/suissa.png","language":"JavaScript","readme":"# Criando um BOT para Telegram\n\nUtilizaremos o módulo [node-telegram-bot-api](https://github.com/yagop/node-telegram-bot-api/) para essa tarefa.\n\nPrimeira coisa que precisamos fazer é instalar esse módulo:\n\n```\n\nnpm i -S node-telegram-bot-api\n\n```\n\nE depois iniciar um arquivo `index.js` com as seguintes linhas:\n\n```js\n\nconst TelegramBot = require( `node-telegram-bot-api` )\n\nconst TOKEN = `SEU TOKEN`\n\nconst bot = new TelegramBot( TOKEN, { polling: true } )\n\n```\n\n\u003e \n\u003e Mas onde pego esse `TOKEN` ?\n\u003e \n\nClick nesse manolo -\u003e [@BotFather](https://telegram.me/botfather) \u003c- para incicar o chat com o Bot gerenciador de Bots. \u003c3\n\n![@BotFather](http://i.imgur.com/vYqkBH2.png)\n\nBom como você deve ter percebido ele é auto-explicativo, entao vamos criar nosso bot.\n\nApós executar o comando `/newbot` siga suas instruções:\n\n![Escolhendo o nome do bot](http://i.imgur.com/tcTfVqo.png)\n\nDepois coloque o TOKEN no nosso código:\n\n```js\n\nconst TelegramBot = require( `node-telegram-bot-api` )\n\nconst TOKEN = `275399831:AAHvjSOiGLxgXmff9wgdECdrZXfMtvnKURw\n`\n\nconst bot = new TelegramBot( TOKEN, { polling: true } )\n\n```\n\n*ps: ñ precisa se preocupar pois jah revoguei o TOKEN antes de publicar*\n\nDepois disso precisamos entender o conceito de como esse BOT funcionara', para isso \nvamos ver o código mais simples possível que interaja com o BOT.\n\n```js\n\nbot.on( 'message', ( msg ) =\u003e console.log( 'msg', msg ) )\n\n```\n\n![](http://i.imgur.com/R8gKP06.png)\n\nEnviando essa mensagem para o BOT iremos ter o seguinte retorno no console:\n\n```js\n\n{ message_id: 2,\n  from: \n   { id: 77586615,\n     first_name: 'Suissa Refatoreitor',\n     last_name: 'Tabajara',\n     username: 'osuissa' },\n  chat: \n   { id: 77586615,\n     first_name: 'Suissa Refatoreitor',\n     last_name: 'Tabajara',\n     username: 'osuissa',\n     type: 'private' },\n  date: 1492093704,\n  text: 'oi' }\n}\n\n```\n\nLogo percebemos que além dos dados basicos:\n\n- message_id: identificador dessa mensagem\n- date: data no formato [timestamp]()\n- text: texto recebido pelo BOT\n\nTambém possuimos 2 outros objetos:\n\n- from: dados de quem enviou a mensagem\n- chat: dados do chat aberto entre você e o BOT\n\nFacilmente podemos inferir que o `chat.id` é igual ao `from.id`, logo o Telegram \ncria essa ligação entre você e chat que você abriu.\n\n\u003e \n\u003e Guarde bem essa informação pois sera muito útil no futuro.\n\u003e\n\nAnalisando esse retorno podemos montar o seguinte *Schema* para esse resultado:\n\n```js\nconst from = { \n  id: Number,\n  first_name: String,\n  last_name: String,\n  username: String \n}\n     \nconst chat = { \n  id: Number,\n  first_name: String,\n  last_name: String,\n  username: String,\n  type: String \n}\n\nconst Schema = { \n  message_id: Number,\n  from,\n  chat,\n  date: Number,\n  text: String\n}\n\n```\n\n*Logo mais voltaremos nesse assunto dos Schemas.*\n\nPara dar continuidade ao nosso BOT iremos utilizar eventos específicos para que \nele não pegue **TUDO** que vier, mas sim apenas o que desejemos.\n\nVejamos quais sao esses eventos:\n\n- `message`\n- `text`\n- `audio`\n- `document`\n- `photo`\n- `sticker`\n- `video`\n- `voice`\n- `contact`\n- `location`\n\nEsses serão os eventos que utilizaremos por hora, existem muitos outros como você \npode conferir na documentação, o link esta abaixo.\n\n*fonte: [Node.js Telegram Bot API - Usage - Events](https://github.com/yagop/node-telegram-bot-api/blob/master/doc/usage.md#events)*\n\n## onText\n\nComo você viu acima, possuímos o evento `text` e como **sabemos** a função `on` sempre \né utilizada para **ouvir** um evento, por isso o nome da função ja é `onText`.\n\nO melhor dela é que possamos passar, como primeiro parametro, uma *RegEx* para que \no BOT execute o *callback* apenas se o texto enviado pelo usuario *\"caiba\"* nessa *RegEx*.\n\nUtilizaremos o exemplo mais simples que encontramos por aí:\n\n```js\n\nbot.onText( /\\/echo (.*)/, ( msg, match ) =\u003e {\n  console.log( `echo msg: `, msg ) \n  console.log( `echo match: `, match ) \n})\n\n/**\necho msg:  { message_id: 7,\n  from: \n   { id: 77586615,\n     first_name: 'Suissa Refatoreitor',\n     last_name: 'Tabajara',\n     username: 'osuissa' },\n  chat: \n   { id: 77586615,\n     first_name: 'Suissa Refatoreitor',\n     last_name: 'Tabajara',\n     username: 'osuissa',\n     type: 'private' },\n  date: 1492101864,\n  text: '/echo blz mein?',\n  entities: [ { type: 'bot_command', offset: 0, length: 5 } ] }\n\necho match:  [ '/echo blz mein?',\n  'blz mein?',\n  index: 0,\n  input: '/echo blz mein?' ]\n\n\n*/\n\n```\n\nO retorno da `msg` jah conhecemos, porém ele possui uma propriedade nova: `entities`.\n\n**Não entrarei nesse escopo agora, entao vamos continuar com o `echo`.**\n\nO que nos interessa nesse retorno é o seguinte objeto: `match`.\n\n```js\n\n[ '/echo blz mein?',\n  'blz mein?',\n  index: 0,\n  input: '/echo blz mein?' ]\n\n```\n\nComo podemos ver ele é um *array* que contém o resultado do [match](https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/String/match) testando a mensagem que o BOT recebeu com a *RegEx* que você definiu no `onText`.\n\nCaso você não conheça essa funcao veja como ela funciona executando o seguinte código no Terminal, executando `node` antes.\n\n```js\n\n\u003e '/echo blz mein?'.match(/\\/echo (.*)/)\n[ '/echo blz mein?',\n  'blz mein?',\n  index: 0,\n  input: '/echo blz mein?' ]\n\n```\n\nLogo conseguimos entender que:\n\n- na posiçao 0: temos o valor total do texto\n- na posiçao 1: o texto sem a *RegEx*\n- na posiçao 2: o índice onde foi encontrada a *RegEx*\n- na posiçao 3: a entrada\n\nAgora vamos fazer o BOT enviar como mensagem o mesmo texto recebido no chat, \npara isso iremos utilizar a função `bot.sendMessage`.\n\nSua assinatura é bem simples:\n\n- primeiro: o ID do chat onde foi recebido o texto\n- segundo: o texto a ser enviado pelo BOT\n\n```js\n\nbot.sendMessage( id, text )\n\n```\n\nE essa função irah retornar uma *Promise*, entao sabemos o que fazer né?\n\n```js\n\nconst logErrorEcho = ( msg ) =\u003e ( err ) =\u003e \n  console.log( msg, err )\n\nconst logSuccessEcho = ( msg, match ) =\u003e ( data ) =\u003e \n  console.log( `Success: `, data )\n\nconst sendEcho = ( msg, match ) =\u003e \n  bot.sendMessage( msg.chat.id, match[ 1 ] )\n      .then( logSuccessEcho( msg, match ) )\n      .catch( logErrorEcho( `Error: ` ) )\n\nbot.onText( /\\/echo (.*)/, sendEcho )\n\n```\n\n![Exemplo do echo](http://i.imgur.com/4RVZjir.png)\n\n### Funcionalidades\n\n#### Funcionalidade  - Busca no Google\n\n![google it](https://s-media-cache-ak0.pinimg.com/236x/a8/4b/bf/a84bbf4e8b0d1fbdf31182b2b340680e.jpg)\n\nPara criarmos um comando para fazer uma busca usaremos o [axios](https://www.npmjs.com/package/axios), primeira vez que usarei ele, sempre usei request/[request-promise](https://github.com/suissa/request-promise-chains); com ele iremos fazer uma requisição `GET` em https://www.google.com.br/search?q=nomadev e parsear seu HTML, com [cheerio](https://www.npmjs.com/package/cheerio) para retirarmos as informaçoes necessarias.\n\n\u003e **Sim isso é um *crawler*!**\n\n\n![nomadev no Google](http://i.imgur.com/kyHRxu3.png)\n\nPorém quando requisitamos `nomadev` ao Google e pegamos o atributo `href`:\n\n![print screen](http://i.imgur.com/ksgH8Pj.png)\n\n```js\n\n  http.get( URL_BASE + match[ 1 ] )\n      .then( (response) =\u003e {\n\n        const $ = cheerio.load( response.data )\n        $( `.r a` ).each( ( i, elem ) =\u003e {\n          if ( i === 1 ) return false\n\n          const url = $( elem ).attr( `href` )\n          console.log(`url`, url)\n\n      })\n      .catch(function (error) {\n        console.log(error);\n      });\n\n```\n\n\u003cbr\u003e\n\nRecebemos o seguinte valor: `/url?q=http://nomadev.com.br/\u0026sa=U\u0026ved=0ahUKEwiC96G_xKbTAhVFhZAKHQKoALwQFggVMAA\u0026usg=AFQjCNFAoCxThw2mWS4Xvg-PlvnwG0EWdQ`\n\n\u003cbr\u003e\n\nDepois de analisar outras buscas percebi que a *url* desejada **sempre** vem adicionada de `/url?q=` e `\u0026sa=U\u0026ved=0ahUKEwiC96G_xKbTAhVFhZAKHQKoALwQFggVMAA\u0026usg=AFQjCNFAoCxThw2mWS4Xvg-PlvnwG0EWdQ` logo preciso executar um `replace` em cada parte para retirar o indesejado:\n\n\n```js\n\n  http.get( URL_BASE + match[ 1 ] )\n      .then( (response) =\u003e {\n\n        const $ = cheerio.load( response.data )\n        $( `.r a` ).each( ( i, elem ) =\u003e {\n          if ( i === 1 ) return false\n\n          const url = $( elem ).attr( `href` )\n                                .replace( `/url?q=`, `` )\n                                .replace( /\\\u0026sa(.*)/, `` )\n          console.log(`url`, url)\n\n      })\n      .catch(function (error) {\n        console.log(error);\n      });\n\n```\n\n\u003cbr\u003e\n\nProntinho! A possuimos a *url* desejada e podemos enviar ela como mensagem pelo BOT.\n\n```js\n\nconst TelegramBot = require( `node-telegram-bot-api` )\nconst http = require( `axios` )\nconst cheerio = require( `cheerio` )\n\nconst TOKENS = require( `./token` )\n\nconst bot = new TelegramBot( TOKENS.TELEGRAM, { polling: true } )\nconst URL_BASE = `https://www.google.com.br/search?q=`\n\nconst log = ( msg ) =\u003e ( result ) =\u003e \n  console.log( msg, result )\n\nconst sendGoogle = ( msg, match ) =\u003e {\n\n  http.get( `${URL_BASE}${match[ 1 ]}` )\n      .then( (response) =\u003e {\n\n        const $ = cheerio.load( response.data )\n        $( `.r a` ).each( ( i, elem ) =\u003e {\n          if ( i === 1 ) return false\n\n          const url = $( elem ).attr( `href` )\n                                .replace( `/url?q=`, `` )\n                                .replace( /\\\u0026sa(.*)/, `` )\n                                \n        bot.sendMessage( msg.chat.id, url, { parse_mode: 'Markdown' } )\n            .then( log( `${url} delivered!` ) )\n            .catch( log( `Error: ` ) )\n        });\n      })\n      .catch(function (error) {\n        console.log(error);\n      });\n}\n\nbot.onText( /\\/google (.*)/, sendGoogle )\n\n```\n\n\u003cbr\u003e\n\n**Resultado:**\n\n```\n\nhttp://nomadev.com.br/ delivered! { message_id: 52,\n  from: \n   { id: 275399831,\n     first_name: 'meu_exemplo_de_bot',\n     username: 'meu_exemplo_de_bot' },\n  chat: \n   { id: 77586615,\n     first_name: 'Suissa Refatoreitor',\n     last_name: 'Tabajara',\n     username: 'osuissa',\n     type: 'private' },\n  date: 1492262538,\n  text: 'http://nomadev.com.br/',\n  entities: [ { type: 'url', offset: 0, length: 22 } ] }\n\n```\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\n#### Refatorando Funcionalidade  - Busca no Google\n\n\u003cbr\u003e\n\n\u003e **Vamos refatorar para funções puras!**\n\n\u003cbr\u003e\n\n```js\n\nconst TelegramBot = require( `node-telegram-bot-api` )\nconst http = require( `axios` )\nconst cheerio = require( `cheerio` )\n\nconst TOKENS = require( `./token` )\n\nconst bot = new TelegramBot( TOKENS.TELEGRAM, { polling: true } )\nconst URL_BASE = `https://www.google.com.br/search?q=`\n\nconst log = ( msg ) =\u003e ( result ) =\u003e \n  console.log( msg, result )\n\nconst getURLFrom = ( elem, $ ) =\u003e \n  $( elem ).attr( `href` )\n            .replace( `/url?q=`, `` )\n            .replace( /\\\u0026sa(.*)/, `` )\n\nconst sendLinkFromGoogle = ( $, msg ) =\u003e ( i, a ) =\u003e\n  ( !i ) \n    ? bot.sendMessage( msg.chat.id, getURLFrom( a, $ ), { parse_mode: 'Markdown' } )\n          .then( log( `${getURLFrom( a, $ )} delivered!` ) )\n          .catch( log( `Error: ` ) )\n    : false\n\nconst sendLink = ( msg ) =\u003e ( response ) =\u003e {\n  const $ = cheerio.load( response.data )\n  \n  return $( `.r a` ).each( sendLinkFromGoogle( $, msg ) )\n}\n\nconst sendGoogle = ( msg, match ) =\u003e \n  http.get( `${URL_BASE}${match[ 1 ]}` )\n      .then( sendLink( msg ) )\n      .catch( log( `Error: `) )\n\n\nbot.onText( /\\/google (.*)/, sendGoogle )\n\n```\n\n\u003cbr\u003e\n\n**Bora testar o comando: `/google github suissa`**\n\n\u003cbr\u003e\n\n![github do suissa](http://i.imgur.com/LKrmTDm.png)\n\n\n### DESAFIO - Busca\n\nCaso você queira treinar e contribuir com esse projeto crie um bot para alguma das seguintes buscas:\n\n- Wikipedia\n- mdn.io\n- DuckDuckGo\n- redtube\n- npm\n- caniuse\n- http.cat\n\nE envie para a pasta `src/` o arquivo com o nome: `desafioBusca.${seu_github_user}.js`\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003e **Depois irei ensinar a mordularizar e utilizaremos todas as buscas no mesmo BOT!**\n\n\u003cbr\u003e\n\u003cbr\u003e\n\u003cbr\u003e\n\n\n**TERMINA AQUI POR HORA!!!!**\n\n\n// Logo + falar sobre os parse_mode MD e HTML { parse_mode: 'Markdown' }\n\n## Erros\n\n### 409 - onflict: terminated by other long poll or webhook\n\nEsse erro acontece qnd outro BOT com o mesmo TOKEN esta rodando.\n\n```js\n\nbody: \n    { ok: false,\n      error_code: 409,\n      description: 'Conflict: terminated by other long poll or webhook' }\n\n```\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuissa%2Fbot-telegram","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuissa%2Fbot-telegram","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuissa%2Fbot-telegram/lists"}