Adición inteligente de grupos musicales a Google Sheets a través de VK API, Tampermonkey y Telegram bot

¿Cómo organizo el almacenamiento de música en Google Sheets con soporte de múltiples programas?


Dado : Cuentas en Google, VK, Telegram.
Tarea : Crear un repositorio de grupos de música con la posibilidad de reposición conveniente.
Herramientas : Google Apps Script (GAS), VK API, Tampermonkey, Telegram Bot API.

Crear hojas de Google


Crea una nueva hoja de cálculo de Google.

Hacemos un encabezado fijo (entonces todos los ciclos de enumerar celdas, debido a esto, comenzarán no desde 0, sino desde 1).

En principio, nuestra plantilla está lista.

Lo único es que no me uní a las columnas a través de los nombres (no quería usar bucles), por lo que a lo largo de la secuencia de comandos me referiré al número de columna cableado.

Haga clic en "Herramientas - Editor de secuencias de comandos".



2 Cree una secuencia de comandos: Kod.gs y Bot.gs .

Code.gs
access_token = '1111111111' // VK token
ss = SpreadsheetApp.getActiveSpreadsheet() // 
sheet = ss.getSheets()[getNumSheet('')] // 
data = sheet.getDataRange().getValues() //  
numRows = sheet.getLastRow()+1 //  
faveTag = '.' //    

//   get 
function doGet(e) {
try {
    var link = e.parameters['link']
    /*
      A - 
      B - English
      C - 
      D - 
      E - 
      F - 
      G - 
    */
    var n = searchExists(link)
    if (n != false) return ContentService.createTextOutput(' '+n+'  !')
    //   API VK https://vk.com/dev/groups.getById
    var html = UrlFetchApp.fetch('https://api.vk.com/method/groups.getById.json?group_id='+link+'&fields=city,description&access_token='+access_token+'&v=5.107')
    //   json   response
    var json = JSON.parse(html).response[0]
    addInTableFromArray(json, link)
    sort()
    return ContentService.createTextOutput('')
  } catch (e) {
     return ContentService.createTextOutput('   doGet! '+e)
  }
}

//  /     
function searchGenre(txt) {
  var t = txt.match(/(?:(?:[||||]|genre|[|||]?)[\s:-]+){1}([a-z-\/-]+)/i)
  if(txt != '' && t) return t[1]
}

//     
function isRus(txt) {
  return txt.search(/[^A-Za-z0-9\/.:_]+/i)
}

// 
function sort(){
  //         
  var tableRange = "A2:G"+numRows
  var editedCell = sheet.getActiveCell()
  var range = sheet.getRange(tableRange)
  //     .    0,   1
  range.sort([{ 
    column : 4,
    ascending: true
  },{
    column: 1,
    ascending: true
  },{
    column: 2,
    ascending: true
  }])
}

//   
function searchExists(t) {
  for (var i = 1; i < data.length; i++) {
    if (t == data[i][2] || 'club'+t == data[i][2]){
      return data[i][0]+data[i][1]
    }
  }
  return false
}

//      
function addInfo(isBot = false) {
  var arr = []
  var j = 0
  var part = 1000 // - ,      . -      UrlFetchApp.fetch
  arr[j] = new Array()
  for (var i = 1; i < data.length; i++) {
    var txt = data[i][2].replace('https://vk.com/','').replace('vk.com/','').replace('^club','')
    if (txt != '' && data[i][0] == '' && data[i][1] == '' && data[i][3] == '' && data[i][4] == '' && data[i][5] == '' && data[i][6] == ''){
      arr[j].push(txt)
      if (arr[j].toString().length > part){
        j++
        arr[j] = new Array()
      }
    }
  }
  if (arr[0].length == 0){
    if (isBot) return false
    else{
      SpreadsheetApp.getUi().alert(' ,   ')
      return false
    }
  }
  //   
  for (var t = 0; t < Math.ceil(arr.toString().length/part); t++) {
    var html = UrlFetchApp.fetch('https://api.vk.com/method/groups.getById.json?group_ids='+arr[t].toString()+'&fields=city,description&access_token='+access_token+'&v=5.107')
    var json = JSON.parse(html).response
    if(json){
      for (var i = 0; i < json.length; i++) {
        var id = json[i].id
        var link = json[i].screen_name
        var name = json[i].name
        var description = (json[i].description)?json[i].description:''
        var city = (json[i].city)?json[i].city.title:''
        var rus = (isRus(name) != -1)?"A":"B"    
        //         arr
        for (var j = 1; j < data.length; j++) {
          var nameCell = data[j][2].replace('https://vk.com/','').replace('vk.com/','').replace('^club','')
          if (nameCell == link || nameCell == id){
            var num = j+1
            break
          }
        }
        sheet.getRange(rus+num).setValue(name.replace('=',''))
        sheet.getRange("C"+num).setValue('=HYPERLINK("https://vk.com/'+link+'";"'+link+'")')
        sheet.getRange("D"+num).setValue(city)
        sheet.getRange("E"+num).setValue(searchGenre(description))
        sheet.getRange("F"+num).setValue(description)
      }
    }
  }
  sort()
  return true
}

//     
function getVkFave(isBot = false) {
  var idTag
  var getTags = UrlFetchApp.fetch('https://api.vk.com/method/fave.getTags.json?access_token='+access_token+'&v=5.107')
  var res = JSON.parse(getTags).response
  var iTag = res.items
  for (var i = 0; i < iTag.length; i++) {
    if (iTag[i].name == faveTag) idTag = iTag[i].id
  }
  
  // 
  if (!isBot){
    var ui = SpreadsheetApp.getUi()
    var resp = ui.alert('     "'+faveTag+'"     . ?', ui.ButtonSet.YES_NO)
  }
  var inside = function (){
    var getPages = UrlFetchApp.fetch('https://api.vk.com/method/fave.getPages.json?tag_id='+idTag+'&fields=city,description&access_token='+access_token+'&v=5.107')
    var iPage = JSON.parse(getPages).response.items
    //    .   ,   
    for (var j = 0; j < iPage.length; j++) {
      var gr = iPage[j].group
      addInTableFromArray(gr)
      numRows++
        UrlFetchApp.fetch('https://api.vk.com/method/fave.removePage?group_id='+gr.id+'&access_token='+access_token+'&v=5.107')
        Utilities.sleep(1000) // 
    }
    sort()
  }
  if (isBot) { // ,      ui
    inside()
  }else if(resp == ui.Button.YES) {
    inside()
  }
}

//    
function addInTableFromArray(arr, linkIn) {
  if (linkIn){
    var link = linkIn
  }else{
    var link = arr.screen_name
    if (searchExists(link) != false) return false
  }
  var name = arr.name // 
  var description = (arr.description)?arr.description:'' //
  var city = (arr.city)?arr.city.title:'' // 
  //      ,      "English"
  var rus = (isRus(name) != -1)?"A":"B"
  //    
  sheet.getRange(rus+numRows).setValue(name.replace('=',''))
  sheet.getRange("C"+numRows).setValue('=HYPERLINK("https://vk.com/'+link+'";"'+link+'")')
  sheet.getRange("D"+numRows).setValue(city)
  sheet.getRange("E"+numRows).setValue(searchGenre(description))
  sheet.getRange("F"+numRows).setValue(description)
}
//  . .
function checkActualLink(){
  for (var i = 1; i < data.length; i++) {
    try {
      var num = i+1
      UrlFetchApp.fetch("https://vk.com/"+data[i][2])
      sheet.getRange('C'+num).setBackgroundColor('')
    }catch(err) {
      var num = i+1
      sheet.getRange('C'+num).setBackgroundColor('red')
    }
  }
}
//  URL  .     
function getStatusUrl(url){
   var options = {
     'muteHttpExceptions': true,
     'followRedirects': false
   }
   var response = UrlFetchApp.fetch(url.trim(), options)
   return response.getResponseCode()
}
//    
function getNumSheet(nameList){
  var s = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameList)
  if (s != null) {
    return s.getIndex()-1
  }else{
    return false
  }
}
// 
function escapeHtml(text) {
  return text
      .replace(/&/g, "")
      .replace(/</g, "")
      .replace(/>/g, "");
}
// 
function onOpen() {
  SpreadsheetApp.getUi()
  .createMenu(' ')
  .addItem('', 'sort')
  .addItem('   ', 'getVkFave')
  .addItem(' ', 'addInfo')
  .addToUi();
}

//   
function ll(t){
  return Logger.log(t)
}


Bot.gs
var botApi = 'https://api.telegram.org/bot1123123:AAA/' //  Telegram  
/* :
 /start -   
 /sort - 
 /getvkfave -     
 /addinfo -  
 /getall -   
*/
function doPost(e){
  var inp = JSON.parse(e.postData.contents)
  // 
  var sheet2 = ss.getSheets()[getNumSheet('')]
  sheet2.getRange('A1').setValue(inp)
  
  var inpTxt = inp.message.text
  var chatId = inp.message.chat.id
  
  var link = inpTxt.replace('https://vk.com/','').replace('vk.com/','').replace('^club','')
  //  
  // start
  if (inpTxt == '/start' || inpTxt == ' '){
    sendText(chatId, '      Google .\n'+
                    '/start -   \n'+
                    '/sort - \n'+
                    '/getvkfave -    \n'+
                    '/addinfo -  \n'+
                    '/getall -   ')
    return true
  }
  // sort
  if (inpTxt == '/sort' || inpTxt == ''){
    sort()
    sendText(chatId, '')
    return true
  }
  // getvkfave
  if (inpTxt == '/getvkfave' || inpTxt == '   '){
    getVkFave(true)
    sendText(chatId, '')
    return true
  }
  // addinfo
  if (inpTxt == '/addinfo' || inpTxt == ' '){
    if (addInfo(true)) sendText(chatId, '')
    else sendText(chatId, ' ,   ')
    return true
  }
  // getall
  if (inpTxt == '/getall' || inpTxt == '  '){
    var arr = [[],[],[],[],[],[],[],[],[],[],[' ']] // TODO 
    var repeat = ''
    var n = 0
    var j = 0
    for (var i = 1; i < data.length; i++) {
      if (j == 4){ //    
        n++
        j = 0
      }
      if (repeat != data[i][3]){
        arr[n][j] = data[i][3]
        if (data[i][3] == '') arr[n][j] = '---'
        j++
      }
      repeat = data[i][3]
    }
    var key = JSON.stringify({keyboard: 
                              arr,
                              resize_keyboard:true,
                              one_time_keyboard:true
                            });
    sendText(chatId, ' ', key)
    return true
  }
  
  // 
  if (isRus(link) != -1) {
    var name = (inpTxt == '---')?' ':inpTxt
    for (var j = 1; j < data.length; j++) {
      if (data[j][3] == inpTxt || inpTxt == '---') {
        var str = ' '+name+'\n\n'
        for (var i = 1; i < data.length; i++) {
          if ((data[j][3] == data[i][3]) || (data[i][3] == '' && inpTxt == '---')) {
            if (str.length >= 4000) { //   -    Telegram 
              sendText(chatId, str)
              str = ''
            }
            str = str + '<a href="https://vk.com/' + data[i][2] + '">' + escapeHtml(data[i][0] + data[i][1]) + '</a> \n'
          }
        }
        if (str != '') sendText(chatId, str)
        return true
      }
    }
    sendText(chatId, inpTxt + ' -   .    ')
    return true
  }
  //   
  if (getStatusUrl('https://vk.com/'+link) != 200 && getStatusUrl('https://vk.com/club'+link) != 200){
    sendText(chatId, inpTxt+' -  ')
    return true
  }
  
  var name = searchExists(link)
  if (name != false){
    sendText(chatId, ' '+name+'  ')
    return true
  }else{
    var html = UrlFetchApp.fetch('https://api.vk.com/method/groups.getById.json?group_id='+link+'&fields=city,description&access_token='+access_token+'&v=5.103')
    var json = JSON.parse(html).response[0]
    addInTableFromArray(json, link)
    sort()
    sendText(chatId, ' '+json.name+' ')
    return true
  }
}
//  
function sendText(chatId, text, key = ''){
  var payload = {
    'method': 'sendMessage',
    'chat_id': String(chatId),
    'text': text,
    'parse_mode': 'HTML',
    'reply_markup': key,
    'disable_web_page_preview': true,
    'one_time_keyboard':true
  }     
  var data = {
    "method": "post",
    "payload": payload
  }
  //    UrlFetchApp.fetch   ll(text)
  UrlFetchApp.fetch(botApi, data)
}


Más detalles a continuación.

Haga clic en " Publicar - Implementar como una aplicación web ".



Ahora tenemos un enlace del formulario script.google.com/macros/s/AAA/exec , sustituyéndolo por el parámetro "enlace", podemos agregar el grupo VK a Google Table.

Guiones de usuario en el navegador


¡La primera y principal forma de ingresar datos!

Abra el navegador Google Chrome o Mozilla Firefox e instale el complemento de script de usuario Tampermonkey.

Enlaces para Chrome , para Mozilla .

Originalmente utilizaba Greasemonkey, pero tuvo que cambiar a Tampermonkey debido a la compatibilidad entre navegadores.

¿Quién tendrá preguntas por qué los parámetros del script de usuario comienzan con el prefijo GM_ y no TM_ ? La idea no es mía, vaya a la documentación .


Insertamos el script vkGroupToGS haciendo clic en la primera pestaña con un signo más.

vkGroupToGS
// ==UserScript==
// @name         vkGroupToGS
// @namespace    https://vk.com/*
// @version      0.1
// @author       You
// @match        https://vk.com/*
// @grant        GM_xmlhttpRequest
// ==/UserScript==
    var url_first = 'https://script.google.com/macros/s/AAA/exec'
    var url_short = document.location.href.replace("https://vk.com/", "")
    var d = document.createElement('div')
    var head = document.querySelector('.left_menu_nav_wrap')
    d.setAttribute('id', 'send_group')
    d.style.display = 'inline-block'
    d.style.position = 'relative'
    d.style.fontSize = '50pt'
    d.style.cursor = 'pointer'
    d.innerHTML = '+'
    head.parentNode.appendChild(d)
    d.onclick = function() {
    setTimeout(function() {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url_first + '?link=' + url_short,
            headers: {
                'Accept': 'application/atom+xml,application/xml,text/xml'
            },
            onload: function(x) {
                console.log(x.responseText)
                if (//.test(x.responseText)) document.querySelector('#send_group').style.color = 'red'
                else document.querySelector('#send_group').style.color = 'green'
            }
        })
    }, 0)
};


"Archivo - Guardar".


Como puede ver, nuestro script dibuja un signo más (que fue suficiente para la imaginación) en el bloque izquierdo left_menu_nav_wrap .


Al hacer clic en el signo más, GM_xmlhttpRequest de vkGroupToGS se ejecuta en nuestro script Code.gs usando el enlace de Google Sheets adjunto arriba (url_first).

Tampermonkey nos pedirá que asociemos estos 2 scripts con derechos, haga clic en " Permitir siempre " o " Permitir siempre dominio " para " script.google.com ". Repita según sea necesario para " script.googleusercontent.com ".


Tan pronto como la solicitud se vaya con éxito , la devolución de llamada de GM_xmlhttpRequest llegará y colorea nuestro botón de verde después de una adición exitosa o rojo si el error regresa.

Además, Tampermonkey : almacenamiento de scripts en Google basado en la nube (anteriormente no) en presencia de su fertilidad y su imaginación.

Volver a las Hojas de cálculo de Google.

Antes de comenzar a analizar nuestro Code.gs, quiero compartir la documentación para el desarrollo en VK - vk.com/dev

Token VK


Obtener una clave de acceso.
Hacer solicitudes a la API de VKontakte.

Hasta ahora he aprendido una sola forma de obtener un token: a través de aplicaciones autoescritas.

Hemos venido aquí .
Plataforma - " Aplicación independiente ".
Después de crear, todo lo que necesitamos es una ID de aplicación (ahora de siete dígitos), que sea 1234567.
Pero necesitamos un token.
Muy bien sobre el token está escrito en Meet the VK API .

Si no queremos leer, simplemente abra el enlace insertando su ID de aplicación en client_id . Somos redirigidos a una página con la inscripción:


No copie los datos de la barra de direcciones de sitios de terceros. Por lo tanto, puede perder el acceso a su cuenta.

Y así es, ¡ten mucho cuidado con el token! Copiamos

el token de la barra de direcciones después de access_token .

Compartiré de inmediato que con este token puede consultar como vk.com/dev/groups.search?params%5Bq%5D=%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0¶ms % 5Btype% 5D = page & params% 5Bcountry_id% 5D = 1 & params% 5Bcity_id% 5D = 1 & params% 5Bmarket% 5D = 0 & params% 5Boffset% 5D = 0 & params% 5Bcount7D 5% = 5 & params% 5Bcount% 5D = 5

se puede convertir de forma segura en enlaces api.vk.com/method/groups.search?q=%D0%BC%D1%83%D0%B7%D1%8B%D0%BA%D0%B0&type=page&country_id=1&city_id=1&future= 0 & market = 0 & offset = 0 & count = 10 & access_token = 1111111111111 & v = 5.107 y recibe información en cualquier aplicación.



Abrí una pequeña caja de Pandora, tal vez esto no sea noticia, pero de esta manera puedes obtener muchas cosas útiles de VK, automatizar muchos procesos y hacer muchas cosas convenientes.

Por supuesto, con ciertas limitaciones , digamos no más de 999 entidades en la respuesta o 20 solicitudes por segundo, etc.

Además, alguien estará interesado en jugar con los archivos almacenados: en nuestra aplicación, la pestaña " Procedimientos almacenados ".

Tiene sus propias reglas para extraer información, lo cual es muy conveniente para consultas secuenciales, a fin de no hacer muchos bucles en su código.

Sigue las versiones!

Con sus cambios, la funcionalidad de los métodos puede cambiar. Ahora estoy aplicando ejemplos para la versión 5.107 .

Entonces, tenemos el token, vaya a ...

Code.gs

doGet (e) - Aceptamos solicitudes entrantes de bot, VK y solo desde el navegador.
Los parámetros de entrada se analizan , como e.parameters ['INPUT_Parameter']
. Llega un enlace, verifique si hay una tabla. De lo contrario, solicite información detallada a través de groups.getById , parsim , add.

! ¡Atención! El guión es simple, por lo que se tragará todos los enlaces entrantes, así que tenga cuidado incluso al ingresar 123 al verificar el guión.

searchGenre : una búsqueda inteligente del estilo / género del grupo, por lo que puse la etiqueta "expresiones regulares" en el artículo.

Las mejoras son posibles.

Si bien solo funciona para buscar la cadena de palabras posterior a través de una barra o guión después de las palabras "estilo o género o género ".

isRus es una regularidad simple que excluye las letras rusas.
ordenar - ordenar. Establecí el valor predeterminado en 1. ciudad, 2. nombre.
searchExists - búsqueda simple de grupos existentes a través de un bucle.
addInfo - hice un script para mí, lo dejé aquí , como un bono. Es necesario si tiene una lista de enlaces, pero no hay datos sobre ellos.

Inserte la lista en la columna "Enlace", haga clic en " Recargar vacío " en el menú principal y las columnas restantes se reponen de VK.

Debido a restricciones en el número de caracteres en UrlFetchApp .fetch y en la cantidad de enlaces colocados en la barra de direcciones tuvieron que hacer un ciclo de 1000 caracteres.

getVkFave- Otra ventaja que se me ocurrió al escribir un artículo y que yo mismo comencé a usar.

La conclusión es que ingresamos a la aplicación VC desde el teléfono, nos topamos con el grupo que queremos guardar, lo guardamos en marcadores con la etiqueta de " grupo de música " agregada de antemano ( etiqueta global variable faveTag ).

Cómo se acumulan, vaya a nuestra tabla de Google, abra el menú, haga clic en " Recuperar marcadores de VK ".

El script con el token se arrastra a api.vk.com/method/fave.getTags , analiza, agrega a la tabla, habiendo advertido previamente sobre la eliminación del VC (aquí, más exactamente con las pruebas, todo se elimina completamente de los marcadores con esta etiqueta ).

getStatusUrl y checkActualLink- un experimento que resultó en 2 guiones.
La conclusión es verificar la validez y el acceso a los enlaces.

Porque a lo largo de los años de acumulación de grupos musicales, me enfrenté al hecho de que los registros públicos se eliminan o cambian de nombre.

¿Quién usará mi comodidad? Aconsejo algunos TODO , que no solo eliminarán enlaces no válidos, sino que también verificarán la presencia en VK a través de groups.search por nombre.

checkActualLink : una vez verifica la validez coloreando inválido en rojo.

  • Menos: baja velocidad.
  • Además, puedes hacerlo cuando quieras.

getStatusUrl : llamado en la celda a través de un script

=getStatusUrl(CONCAT("https://vk.com/";C2))

Tomó la base de aquí .

  • Menos: se ejecuta para todas las celdas cada vez que se abre la página.
  • — , , checkActualLink.

Luego viene la conveniencia de los scripts de google:

addInTableFromArray : agrega una fila a la tabla. Ya sea del ciclo o de una sola vez.
getNumSheet : busca el número de hoja por nombre. Honestamente, no encontré una forma más simple en Internet que esta. Es necesario debido al cambio de números de hoja al agregar nuevos. Tomó la base de aquí .
escapeHtml - Eliminar caracteres especiales
ll - hizo Logger.log corto para sí mismo , reduce el tiempo, aconsejo.
onOpen : una característica familiar para dibujar menús en Hojas de cálculo de Google.

Entonces, nuestro Code.gs captura enlaces desde VK a través de Tampermonkey y agrega grupos a Google Table.

Enciende la pereza


  • Estamos sentados en la computadora.
  • Estamos sentados al teléfono.

Desde una computadora, aprendimos cómo agregar grupos a través del " signo más " en VK y a través de marcadores.
A través del teléfono, solo a través de marcadores en la aplicación VK.

Veamos dos opciones más para hacer grupos.

USI


Guiones de usuario en un navegador móvil.

Para algunos, parecerá anticuado e innecesario, pero habrá personas que le quitarán los beneficios.

Al buscar en Internet hasta ahora solo se encontró un complemento de este tipo .
Funciona solo en Firefox (probado solo en Android).

Una gran ventaja: puede usar el script Tampermonkey.

Debido a las diferencias en el diseño entre vk.com y m.vk.com , y también debido a la apertura de la ventana por defecto en m.vk.com, yo no me dibujo un signo más , pero hice un script sencillo VK_event_to_list_mvk que funciona cuando se abre la ventana (me queman en el infierno para setTimeout , lo sé).

Code.gs
// ==UserScript==
// @name         VK_event_to_list_mvk
// @namespace    https://m.vk.com/*
// @match        https://m.vk.com/*
// @grant    GM_xmlhttpRequest
// ==/UserScript==
setTimeout(function() {
    var url_first = 'https://script.google.com/macros/s/111/exec';
    var url_short = document.location.href.replace("https://m.vk.com/", "");
    GM_xmlhttpRequest({
        method: 'GET',
        url: url_first + '?link=' + url_short,
        headers: {
            'Accept': 'application/atom+xml,application/xml,text/xml'
        },
        onload: function(x) {
            alert(x.responseText);
        }
    });
}, 2000);



Telegram Bot


Creamos un bot de acuerdo con las instrucciones .
Necesitamos un token, que sea 123123.

Cree un script Bot.gs , inserte nuestro 123123 en la variable botApi , enmarcándolo con comillas y el enlace api.telegram.org .

A continuación, debemos vincular nuestro bot con Google Sheets. Puede ver cómo hacerlo a través de WebHook en el artículo anterior .

¿Qué hará nuestro bot?

Nos descomponemos por los comandos:

  • / start - Inicia el bot
  • / sort - Ordenar
  • / getvkfave - Recuperar marcadores de VK
  • / addinfo - Complete vacío
  • / getall - Obtener todos los grupos

Vemos que tenemos el comienzo del bot, allí insertaremos solo un tutorial con una parte descriptiva a su discreción.

Tres comandos del menú principal por si acaso.

Y el siguiente bono es / getall , sobre esto a continuación.

Los comandos para llamadas convenientes (escriba una barra en la línea de entrada del mensaje) se pueden agregar al mismo @BotFather a través de / setcommands.

Formato - líneas a través de un guión:

start -   
sort - 
getvkfave -    
addinfo -  
getall -   


Bot.gs

doPost : acepta mensajes entrantes del bot.

Naturalmente, como programador inquisitivo, inmediatamente comencé a usar registros. Quizás haya formas más fáciles, pero acabo de crear una nueva hoja, llamada "Registros" y capto las solicitudes entrantes en la primera celda.

Por lo tanto, después de analizar el mensaje entrante a través de JSON.parse (e.postData.contents) , escribimos inmediatamente en los registros.

A continuación, determinamos cuál de los equipos vino a nosotros.

Si no es un equipo, verificamos la validez, es decir, si existe un grupo en VK.

sendText : envía mensajes al bot (por defecto parse_mode = HTML), documentación .

/ getall : lo analizaremos por separado.

No tengas miedo de mi decisión de

[[],[],[],[],[],[],[],[],[],[],[' ']]

Hecho para llenar las líneas con ciudades, mientras nos restringimos a 8-10 líneas en 4 ciudades (variable j = 4).

Si el grupo de música no tiene una ciudad, inserte ---.

Sólo tienes que elegir la ciudad y coger las letras rusas en Bot.gs .

Mostramos una lista de enlaces, nada más.


Recuerde que el acceso a la documentación y la prueba del bot a través de la barra de direcciones a través del Hotspot Shield Free VPN Proxy es VPN ilimitada (para Google Chrome).

Entonces aprendimos tres formas de ingresar a nuestra tabla:

  • Guiones de usuario en el navegador
  • Guiones de usuario en un navegador móvil (USI)
  • Telegram Bot

¿Qué necesitas saber y recordar?


Prefijo de club en enlaces VK Los

grupos VK tienen 2 tipos de almacenamiento de identificadores.

  1. El nombre está en inglés con guiones bajos y guiones válidos.
  2. CARNÉ DE IDENTIDAD

Y pueden dar todo lo mejor y así sucesivamente.

El cheque es simple.

Si hay un grupo, digamos vk.com/4soulsband , sustituya 4soulsband en group_ids en vk.com/dev/groups.getById , se muestra una lista de parámetros, uno de los cuales es un ID . Y si ponemos el club delante de él , voila, llegamos a la misma página vk.com/club68130764 .

Limitar el almacenamiento de grupos en VK a 5000

Parece ridículo, pero no tenía suficiente.

Mi dolor por actualizar la página VK

lo confieso hasta que pude vencer la captura de la transición entre páginas en VK para restablecer el signo más en Tampermonkey. TODO

Usando Google Sheets como DB

  • Plus - disponibilidad
  • Menos: cuando se acumulan más de 5000 líneas, el trabajo con el " DB " se ralentiza . Entonces, para proyectos serios, es mejor usar DBMS normal.

Definición de una ciudad grupal La

dirección del grupo en VK puede estar aquí vk.com/dev/groups.getAddresses , respectivamente, quien quiera mejorar la búsqueda de una ciudad para un grupo puede usarla.

Total


Tenemos:

  1. Tabla de recopilación de datos de Google con la que aprendimos a trabajar.
  2. Conocimiento de VK API. Es decir, usted ya sabe que no podemos limitarnos a grupos musicales.
  3. Telegram Bot con una base de datos que no necesita ser implementada y configurada.

Mi objetivo no es alardear del próximo juguete creado, mi objetivo es mostrar a los recién llegados (y no solo) una enorme capa de API abiertas que pueden ayudar a hacer la vida en un grado u otro, pasar de la tierra de hierro a las "nubes", por así decirlo.

Esta funcionalidad está lista, ya que está abierta a mejoras.

Buena suerte en el desarrollo y comprensión de nuevos conocimientos.

Documentación


Google Apps Script: servicio de hoja de cálculo
Telegram Bot API
VK API
Aprenda a escribir los guiones de
usuario Guiones de usuario. Profundización
del monitoreo del sitio usando Google Docs
Mimos. Escribimos el bot Telegram en el script de Google
[Ejemplos, Script de Google Apps] Desarrollo de complementos / scripts para Hojas de cálculo de Google (hojas de cálculo)
Cómo usar las hojas de cálculo de Google para verificar si hay enlaces rotos

All Articles