إضافة ذكية للمجموعات الموسيقية إلى جداول بيانات Google عبر VK API و Tampermonkey و Telegram bot

كيف أقوم بتنظيم تخزين الموسيقى في جداول بيانات Google بدعم من برامج متعددة؟


معطى : الحسابات في Google و VK و Telegram.
المهمة : إنشاء مستودع للمجموعات الموسيقية مع إمكانية التجديد المناسب.
الأدوات : Google Apps Script (GAS) ، VK API ، Tampermonkey ، Telegram Bot API.

إنشاء جداول بيانات Google


إنشاء جداول بيانات Google جديدة.

نصنع رأسًا ثابتًا (ثم تبدأ جميع دورات تعداد الخلايا ، بسبب هذا ، ليس من 0 ، ولكن من 1).

من حيث المبدأ ، قالبنا جاهز.

الشيء الوحيد هو أنني لم ألتزم بالأعمدة من خلال الأسماء (لم أكن أرغب في استخدام الحلقات) ، لذا في جميع أجزاء البرنامج النصي سأشير إلى رقم العمود ذي الأسلاك الصلبة.

انقر فوق "أدوات - محرر البرنامج النصي".



2 إنشاء برنامج نصي: Kod.gs و 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)
}


مزيد من التفاصيل أدناه.

انقر فوق " نشر - نشر كتطبيق ويب ".



الآن لدينا رابط للنموذج script.google.com/macros/s/AAA/exec ، واستبدال معلمة "link" إليه ، يمكننا إضافة مجموعة VK إلى Google Table.

مخطوطات المستخدم في المتصفح


الطريقة الأولى والرئيسية لإدخال البيانات!

افتح متصفح Google Chrome أو Mozilla Firefox وثبّت المكوّن الإضافي لبرنامج نصي Tampermonkey.

وصلات لل كروم ، ل موزيلا .

تم استخدامه في الأصل Greasemonkey ، ولكن كان عليه التبديل إلى Tampermonkey بسبب التوافق عبر المتصفح.

الذين سيكون لديهم أسئلة لماذا المعلمات النصي المستخدم تبدأ مع GM_ البادئة ، وليس TM_ - الفكرة ليست الألغام، انتقل إلى الوثائق .


نقوم بإدراج البرنامج النصي vkGroupToGS بالنقر فوق علامة التبويب الأولى بعلامة الجمع.

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)
};


"حفظ الملف."


كما ترى ، يرسم نصنا علامة زائد (والتي كانت كافية للخيال) في الكتلة اليسرى left_menu_nav_wrap .


من خلال النقر فوق علامة الجمع ، يتم تنفيذ GM_xmlhttpRequest من vkGroupToGS في Code.gs النصي باستخدام رابط جداول بيانات Google المرفق أعلاه (url_first).

سيطلب منا Tampermonkey ربط هذين النصين القانونيين بالحقوق ، انقر إما على " السماح دائمًا " أو " السماح دومًا بالنطاق " لـ " script.google.com ". كرر حسب الحاجة لـ " script.googleusercontent.com ".


بمجرد أن يبتعد الطلب بنجاح ، سيأتي رد الاتصال من GM_xmlhttpRequest ولون زرنا باللون الأخضر عند الإضافة الناجحة أو اللون الأحمر إذا ظهر الخطأ.

بالإضافة إلى Tampermonkey - تخزين النصوص النصية في Google (لم يكن سابقًا) في وجود خصوبتها وخيالها.

عودة إلى جداول بيانات Google.

قبل البدء في تحليل Code.gs ، أريد مشاركة وثائق التطوير في VK - vk.com/dev

رمز VK


الحصول على مفتاح وصول.
تقديم طلبات إلى VKontakte API.

حتى الآن ، تعلمت طريقة واحدة فقط للحصول على رمز مميز - من خلال التطبيقات المكتوبة ذاتيًا.

نحن جئنا إلى هنا .
منصة - " تطبيق مستقل ".
بعد الإنشاء ، كل ما نحتاجه هو معرف التطبيق (الآن المكون من سبعة أرقام) ، فليكن 1234567.
لكننا بحاجة إلى رمز مميز.
جيد جدًا حول الرمز المميز مكتوب في Meet API VK .

إذا لم نرغب في القراءة ، فما عليك سوى فتح الرابط عن طريق إدراج معرّف التطبيق الخاص بك في client_id . تتم إعادة توجيهنا إلى صفحة تحتوي على النقش:


يرجى عدم نسخ البيانات من شريط العناوين لمواقع الطرف الثالث. وبالتالي ، قد تفقد الوصول إلى حسابك.

وهذا صحيح ، كن حذرًا جدًا من الرمز المميز!

نقوم بنسخ الرمز المميز من شريط العناوين بعد access_token . سأشارك ذلك

فورًا مع هذا الرمز المميز ، يمكنك الاستعلام مثل 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٪ 5Bcount٪ 5D = 5 & params٪ 5Bcount٪ 5B = 5 & params٪ 5B = 5 & params٪ 5B = 5 & params٪ 5B = 5 & params٪ 5B

يمكن تحويلها بأمان إلى روابط 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 وتلقي المعلومات في أي تطبيق.



لقد فتحت صندوق Pandora صغيرًا ، ربما هذه ليست أخبارًا ، ولكن بهذه الطريقة يمكنك الحصول على الكثير من الأشياء المفيدة من VK ، وأتمتة العديد من العمليات وإنشاء الكثير من الأشياء المريحة.

بالطبع ، مع بعض القيود ، لنفترض أنه لا يوجد أكثر من 999 كيان في الاستجابة أو 20 طلبًا في الثانية ، إلخ.

أيضا ، سوف يهتم شخص ما باللعب بالملفات المخزنة - في تطبيقنا علامة التبويب " الإجراءات المخزنة ".

انها لديها قناعاتها قواعد ل سحب المعلومات، وهو مناسب جدا للاستعلامات متتابعة، حتى لا تجعل العديد من الحلقات في التعليمات البرمجية.

اتبع الإصدارات!

مع تغييراتهم ، قد تتغير وظائف الأساليب. الآن أقوم بتطبيق أمثلة على الإصدار 5.107 .

لذا ، لدينا الرمز المميز ، انتقل إلى ...

Code.gs

doGet (e) - نحن نقبل طلبات الحصول الواردة من الروبوت ، VK وفقط من المتصفح.
يتم تحليل معلمات الإدخال ، مثل e.parameters ['INPUT_Parameter']
وصل ارتباط ، تحقق لمعرفة ما إذا كان هناك جدول. إذا لم يكن الأمر كذلك ، فاطلب معلومات تفصيلية عبر groups.getById ، parsim ، add.

! انتباه! البرنامج النصي بسيط ، لذلك سوف يبتلع كل الروابط الواردة ، لذا كن حذرًا حتى عند إدخال 123 عند التحقق من البرنامج النصي.

searchGenre - بحث ذكي عن نمط / نوع المجموعة ، حيث أضع علامة "التعبيرات العادية" في المقالة.

التحسينات ممكنة.

بينما يعمل فقط للبحث عن سلسلة الكلمات اللاحقة من خلال شرطة مائلة أو واصلة بعد الكلمات "النمط أو النوع أو النوع ".

isRus عبارة عن قاعدة عادية بسيطة باستثناء الحروف الروسية.
الفرز - الفرز. لقد قمت بتعيين الإعداد الافتراضي على 1. المدينة ، 2. الاسم.
searchExists - البحث البسيط عن المجموعات الموجودة من خلال حلقة.
addInfo - نص برمجي لنفسي ، اتركه هنا ، كمكافأة. من الضروري إذا كانت لديك قائمة بالارتباطات ، ولكن لا توجد بيانات عليها.

أدخل القائمة في عمود "الارتباط" ، وانقر فوق "إعادة ملء فارغة " في القائمة الرئيسية ويتم تجديد الأعمدة المتبقية من VK.

بسبب القيود المفروضة على عدد الأحرف في UrlFetchApp .fetch وفي عدد من الروابط وضعها في شريط العنوان كان لتقديم دورة 1000 حرفا.

getVkFave- مكافأة أخرى حدثت في رأسي أثناء كتابة مقال بدأت أنا بنفسي في استخدامه.

خلاصة القول هي أننا نذهب إلى تطبيق VC من الهاتف ، ونعثر على المجموعة التي نريد حفظها ، وحفظها في الإشارات المرجعية مع علامة " مجموعة الموسيقى " المضافة مسبقًا ( faveTag المتغير العام ).

كيف تتراكم ، انتقل إلى جدول Google الخاص بنا ، واستدعاء القائمة ، انقر فوق " استرداد الإشارات المرجعية من VK ". يزحف

النص الذي يحتوي على الرمز المميز إلى api.vk.com/method/fave.getTags ، ويحلل ، ويضيف إلى الجدول ، بعد أن حذر سابقًا من الإزالة من VC (هنا ، بشكل أكثر دقة مع الاختبار ، يتم حذف كل شيء تمامًا من الإشارات المرجعية مع هذه العلامة ).

getStatusUrl و checkActualLink- تجربة أسفرت عن نصين.
خلاصة القول هي التحقق من صحة والوصول إلى الروابط.

لأنه على مدى سنوات تراكم المجموعات الموسيقية ، واجهت حقيقة أن السجلات العامة يتم حذفها أو إعادة تسميتها.

من سيستخدم راحتي ، أنصح بعض TODO ، التي لن تحذف الروابط غير الصالحة فحسب ، بل تحقق أيضًا من التواجد في VK من خلال groups.search بالاسم.

checkActualLink - يتحقق مرة واحدة من الصلاحية عن طريق التلوين غير صالح باللون الأحمر.

  • ناقص - سرعة منخفضة.
  • بالإضافة إلى ذلك - يمكنك القيام بذلك عندما تريد.

getStatusUrl - يسمى في الخلية من خلال برنامج نصي

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

أخذ الأساس من هنا .

  • ناقص - يعمل لجميع الخلايا في كل مرة يتم فيها فتح الصفحة.
  • — , , checkActualLink.

بعد ذلك تأتي الراحة

لنصوص جوجل: addInTableFromArray - إضافة صف إلى الجدول. إما من الدورة أو لمرة واحدة.
getNumSheet - ابحث عن رقم الورقة بالاسم. بصراحة ، لم أجد طريقة أبسط على الإنترنت من هذه الطريقة. من الضروري بسبب تحول أرقام الورقة عند إضافة أرقام جديدة. أخذ الأساس من هنا .
escapeHtml - حذف الحروف الخاصة
ليرة لبنانية - جعل Logger.log قصيرة لنفسها ، ويقلل الوقت ، وأنا أنصح.
onOpen - ميزة مألوفة لرسم القوائم في جداول بيانات Google.

لذا ، فإن Code.gs يلتقط الروابط من VK من خلال Tampermonkey ويضيف مجموعات إلى Google Table.

بدوره على الكسل


  • نحن نجلس على الكمبيوتر.
  • نحن نجلس على الهاتف.

تعلمنا من الكمبيوتر كيفية إضافة مجموعات من خلال " علامة الجمع " في VK ومن خلال الإشارات المرجعية.
من خلال الهاتف ، فقط من خلال الإشارات المرجعية في تطبيق VK.

دعونا نلقي نظرة على خيارين آخرين لإنشاء مجموعات.

USI


مخطوطات المستخدم في متصفح الجوال.

بالنسبة لشخص ما ، سيبدو الأمر قديمًا وغير ضروري ، ولكن سيكون هناك هؤلاء الأشخاص الذين سيخرجون المحترفين منه.

البحث في الإنترنت حتى الآن وجدت فقط مثل هذا البرنامج المساعد .
يعمل فقط في Firefox (تم اختباره فقط في android).

زائد ضخم - يمكنك استخدام البرنامج النصي Tampermonkey.

نظرا للاختلافات في التصميم بين vk.com و m.vk.com ، وأيضا بسبب فتح نافذة الافتراضي في m.vk.com، أنا لم رسم علامة زائد ، إلا أن سيناريو بسيط VK_event_to_list_mvk أن يعمل عند فتح نافذة (حرق لي في الجحيم ل setTimeout ، وأنا أعلم).

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);



برقية برقية


ننشئ روبوت وفقًا للتعليمات .
نحن بحاجة إلى رمز مميز ، فليكن 123123.

قم بإنشاء برنامج نصي Bot.gs ، وأدخل 123123 في متغير botApi ، وقم بوضع إطار له مع علامات اقتباس ورابط api.telegram.org .

بعد ذلك ، نحتاج إلى ربط برنامج الروبوت الخاص بنا بجداول بيانات Google. يمكنك معرفة كيفية القيام بذلك عبر WebHook في المقالة السابقة .

ماذا سيفعل البوت لدينا؟

نحن نتحلل بالأوامر:

  • / start - ابدأ البوت
  • / فرز - فرز
  • / getvkfave - استرجاع الإشارات من VK
  • / addinfo - املأ الفراغ
  • / getall - احصل على كل المجموعات

نرى أن لدينا بداية الروبوت ، حيث سنقوم بإدراج برنامج تعليمي فقط مع جزء وصفي حسب تقديرك.

ثلاثة أوامر من القائمة الرئيسية فقط في حالة.

والمكافأة التالية هي / getall ، عن ذلك أدناه.

يمكن إضافة أوامر للاتصال المريح (كتابة شرطة مائلة في سطر إدخال الرسالة) إلى نفسBotFather عبر / setcommands.

التنسيق - الخطوط من خلال الشرطة:

start -   
sort - 
getvkfave -    
addinfo -  
getall -   


Bot.gs

doPost - يقبل الرسائل الواردة من البوت.

بطبيعة الحال ، كمبرمج فضولي ، بدأت على الفور في استخدام السجلات. ربما توجد طرق أسهل ، ولكني قمت للتو بإنشاء ورقة جديدة ، أطلق عليها اسم "السجلات" وألتقط الطلبات الواردة في الخلية الأولى.

لذلك ، بعد أن قمنا بتحليل الرسالة الواردة من خلال JSON.parse (e.postData.contents) ، نكتب على الفور إلى السجلات.

بعد ذلك ، نحدد أي الفرق جاءت إلينا.

إذا لم يكن فريقًا ، فإننا نتحقق من الصلاحية ، أي هل توجد مجموعة في VK.

sendText - يرسل رسائل إلى البوت (الافتراضي parse_mode = HTML) ، وثائق .

/ getall - سنقوم بتحليله بشكل منفصل.

لا تخف من قراري من

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

صُمم لملء الخطوط بالمدن ، بينما نقتصر على 8-10 خطوط في 4 مدن (المتغير j = 4).

إذا كانت المجموعة الموسيقية بدون مدينة ، فأدخل ---.

مجرد اختيار المدينة والتقاط الرسائل الروسية في Bot.gs .

نحن نعرض قائمة الروابط ، لا أكثر.


تذكر أن الوصول إلى الوثائق واختبار الروبوت من خلال شريط العنوان من خلال وكيل Hotspot Shield Free VPN Proxy هو VPN غير محدود (لـ Google Chrome).

لذلك تعلمنا ثلاث طرق لدخول طاولتنا:

  • مخطوطات المستخدم في المتصفح
  • البرامج النصية للمستخدم في متصفح الجوال (USI)
  • برقية برقية

ما تحتاج إلى معرفته وتذكره؟


بادئة النادي في روابط VK

تحتوي مجموعات VK على نوعين من تخزين المعرفات.

  1. الاسم باللغة الإنجليزية مع شرطات سفلية وواصلات صالحة.
  2. هوية شخصية

ويمكنهم أن يقدموا كل خير وما إلى ذلك.

الشيك بسيط.

إذا كانت هناك مجموعة ، دعنا نقول vk.com/4soulsband ، استبدل 4soulsband في group_ids في vk.com/dev/groups.getById ، يتم عرض قائمة من المعلمات ، أحدها معرف . وإذا وضعنا النادي أمامه ، فويلا ، نصل إلى نفس الصفحة vk.com/club68130764 .

الحد من تخزين المجموعات في VK إلى 5000

يبدو سخيفة ، لكن لم يكن لدي ما يكفي.

أعاني من تحديث صفحة VK التي

أعترف بها حتى تمكنت من هزيمة صيد الانتقال بين الصفحات في VK لإعادة تعيين علامة الجمع في Tampermonkey. TODO

باستخدام جداول بيانات Google باعتباره قاعدة بيانات

  • بالإضافة إلى - توافر
  • ناقص - عند تراكم أكثر من 5000 خط ، يتباطأ العمل مع " DB " . لذا بالنسبة للمشاريع الجادة ، من الأفضل استخدام DBMS العادي.

تعريف مدينة المجموعة

يمكن أن يكون عنوان المجموعة في VK هنا vk.com/dev/groups.getAddresses ، على التوالي ، الذي يريد تحسين البحث عن مدينة لمجموعة يمكن استخدامه.

مجموع


نملك:

  1. جدول جمع بيانات Google الذي تعلمنا العمل معه.
  2. معرفة VK API. أي أنك تدرك بالفعل أنه لا يمكن أن يقتصر الأمر على المجموعات الموسيقية.
  3. برقية Telegram بقاعدة بيانات لا تحتاج إلى النشر والتكوين.

ليس هدفي هو التفاخر بشأن اللعبة التي تم إنشاؤها في المستقبل ، بل هدفي هو إظهار الوافدين الجدد (وليس فقط) طبقة ضخمة من واجهات برمجة التطبيقات المفتوحة التي يمكن أن تساعد في جعل الحياة إلى درجة أو أخرى ، والانتقال من الأرض الحديدية إلى "الغيوم" ، إذا جاز التعبير.

هذه الوظيفة جاهزة ، كما أنها مفتوحة للتحسينات.

حظا سعيدا في تطوير واستيعاب المعرفة الجديدة.

توثيق


Google Apps Script - Spreadsheet Service
Telegram Bot API
VK API
تعلم كتابة
نصوص المستخدمين. تعميق
مراقبة الموقع باستخدام
تدليل مستندات Google . نكتب Telegram bot على برنامج Google النصي
[أمثلة ، Google Apps Script] تطوير الوظائف الإضافية / النصوص البرمجية لجداول بيانات Google (جداول البيانات)
كيفية استخدام جداول بيانات Google للتحقق من الروابط المعطلة

All Articles