smkthat / find-pos-widgets

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

find-pos-widgets

Table of contents
  1. About
  2. Deployment
  3. Configurations
  4. Widget url regexes
  5. Requirements

About

Finds installed POS widgets on the public vk page and checks their URLs for compliance with templates with UTM tags.
The results are written to the file specified in the configuration file.

POS result types

  • CORRECT - Correct urls
  • INVALID - Contain NOT valid urls
  • LINKS_COUNT - Incorrect number of urls
  • MISSING - Urls NOT exists
  • TIMEOUT - Can't get public data from request, connection timeout
  • ERROR - NOT valid public url or parsing errors

The console displays information about processed links:

Clearing resources ...
Reading file ...
Prepare publics from links ...
Number of links found: 3319
Start processing:
Processing: 100%|████████████| 3319/3319 [00:37<00:00, 88.23url/s, CORRECT=963, INVALID=1968, MISSING=388, TIMEOUT=0, ERROR=0]
Processing complete! See results in './result.xlsx'

POS url statuses

  • VALID - Correct url
  • NOT_MATCH - Invalid, url don't match pattern
  • UTM_INVALID - Invalid UTM code value
  • SPACER - Invalid, url contains spaces
  • UNDEFINED - Undefined POS url

Conditions for checking UTM-codes of POS url

Return a validation result True or False

  • ID: Only digits
    \d+
  • REG-CODE: Only 2 digits or one of the values: 111, 711, 7114
    \d{2}|111|711|7114
  • MUN-CODE: Only 8 digits
    \d{8}
  • OGRN: Only 13 digits
    \d{13}
  • SOURCE: Only one of the values: vk, vk1, vk2
    vk|vk1|vk2
  • UNDEFINED: Undefined UTM-code

Deployment

OS Windows

  1. Go to the project directory

    cd find-pos-widgets
  2. Create Python env

    python -m venv venv
  3. Run env

    # for cmd.exe
    venv\Scripts\activate.bat
    # for PowerShell
    venv\Scripts\Activate.ps1
  4. Upgrade pip (this command may be skipped)

    pip install --upgrade pip
  5. Install requirements

    pip install -r requirements.txt
  6. Start script

    python main.py

OS Linux / MacOS

  1. Go to the project directory
    cd find-pos-widgets
  2. Create Python env
    python -m venv venv
  3. Run env
    source venv\Scripts\activate
  4. Upgrade pip (this command may be skipped)
    pip install --upgrade pip
  5. Install requirements
    pip install -r requirements.txt
  6. Start script
    python main.py

Stopping:

  1. For stopping script use keys:
    ctrl + c
  2. For close env use command:
    deactivate

Configurations

Provided in config.yaml file:

vk_api:
  access_token: 'Put your token' # https://vkhost.github.io
parsing:
  max_links_per_widget: 2
  skip_correct: false
  save_public_data: true
  public_data_fields: [ menu, is_government_organization, activity, city, addresses, contacts, description, members_count, status ]
  utm_codes_regex:
    ID: '\d+'
    REG-CODE: '\d{2}|111|711|7114'
    MUN-CODE: '\d{8}'
    OGRN: '\d{13}'
    SOURCE: 'vk|vk1|vk2'
display:
  csv_delimiter: ';'
  public_display_fields: [ pos_result, url, is_government_organization, city.title, addresses.main_address.city.title, id, name, screen_name, pos_links ]
  show_utm_status: true
  codes_hints:
    pattern: '{is_valid} {param}={value} ({hint}; pattern: {pattern})'
    items:
      ID: 'Only digits'
      REG-CODE: 'Only 2 digits or one of the values: 111, 711, 7114'
      MUN-CODE: 'Only 8 digits'
      OGRN: 'Only 13 digits'
      SOURCE: 'Only one of the values: vk, vk1, vk2'
      UNDEFINED: 'Undefined UTM-code'
  status_types:
    pattern: '{name} {value}'
    items:
      VALID: { name: '✅', value: 'Correct urls' }
      NOT_MATCH: { name: '❌', value: 'Invalid, url dont match pattern' }
      UTM_INVALID: { name: '⚠️', value: 'Invalid UTM code value' }
      SPACER: { name: '⚠️', value: 'Invalid, url contains spaces' }
      UNDEFINED: { name: '🆘', value: 'Undefined POS url' }
  result_types:
    pattern: '{name} {value}'
    items:
      CORRECT: { name: '✅', value: 'Correct urls' }
      INVALID: { name: '⚠️', value: 'Contain NOT valid urls' }
      LINKS_COUNT: { name: '❗', value: 'Widgets links count not pass tests' }
      MISSING: { name: '❌', value: 'Urls NOT exists' }
      TIMEOUT: { name: '⌛️', value: 'Timeout when getting url page data' }
      ERROR: { name: '🆘', value: 'NOT valid url or data parsing errors' }
paths:
  log_file: 'runtime.log'
  target_file: 'target.txt'
  result_file: 'result.xlsx'
  save_public_data_dir: 'publics_data'

VK API

Param Type Default Description
version float 5.221 VK API version
access_token string - Your VK API token.

For provide access_token you can use official VK hosts. It is better not to get a token from a personal page, because there is a low probability of getting blocked, use a fake account.

Parsing

Param Type Default Description
max_links_per_widget intager 2 Checking for the number of POS widgets, if 0 - the check is skipped
skip_correct boolean false Skip URLs with correct pos widgets
save_public_data boolean true If we need to save datas of publics in folder
public_data_fields list [menu, is_government_organization] Fields for request from VK API.

Variables:
  • menu - (Default) Widgets data
  • is_government_organization - (Default) Government org mark
  • activity - Public activity type
  • city - City of the public
  • description - Public description
  • members_count - Public total members
  • status - Current public status
  • ... find more fields in dev.vk.com
utm_codes_regex dictionary ID: \d+
REG-CODE: \d{2}|111|711|7114
MUN-CODE: \d{8}
OGRN: \d{13}
SOURCE: vk|vk1|vk2
Fields for overriding regex checks of UTM tags.

Display

Param Type Default Description
csv_delimiter string ; Delimiter for result csv file
public_display_fields list [pos_result, url, name, is_government_organization, pos_links, id, screen_name] Select fields to display in result csv file (with the preservation of order)

Variables:
  • pos_result - POS widgets parsing result type
  • url - Target public url
  • is_government_organization - Government org mark
  • name - Parsed public name
  • pos_links - POS links checking status
  • id - Parsed public id
  • screen_name - Parsed public screen_name
  • ... include more from parsing.public_data_fields

You can access the nested data if the field returns the following, example for city.title:

field city return data {"id": 123, "title": "cityname"}

for getting cityname use city.title
show_utm_status boolean true Whether to show detailed error information in UTM-tags
codes_hints dictionary - Here you can specify the values to display in the pattern results file

Use variables and provide a pattern to determine how it will be provided

Variables:
code - (string) Code designation
param - (string) UTM-label
value - (string) UTM-code value
pattern - (string) Verification pattern
hint - (string) Hint of expected value
is_valid - (boolean) Validation result

Example:
pattern = "[{is_valid}] {param}={value} ({hint}, pattern: {pattern})"
display: True: utm_source='vk' ('Only one of the values: vk, vk1, vk2', pattern: 'vk1|vk2|vk3')
result_types
and
status_types
dictionary - Here you can specify the values to display in the pattern results file

Use any variables, such as name, value, or others. Then provide a pattern to determine how it will be provided

Example for status_type:
{"name": "✅", "value": "Correct urls"}
pattern = "{name}: {value}"
display: ✅: Correct urls
Output result xlsx file example:
pos_result url id name is_government_organization screen_name pos_url-0 pos_url_status-1 url_utm_codes-1 ...
https://vk.com/public12345678 12345678 Name of the public True club12345678 https://pos.gosuslugi.ru/form/?opaId=123456&utm_source=vk&utm_medium=11&utm_campaign=1234567890123 ✅ Ок True opaId='223186' (Only digits, pattern: '\d+')
True utm_source='vk' (Only one of the values: vk, vk1, vk2, pattern: 'vk|vk1|vk2')
True utm_medium='44' (Only 2 digits or one of the values: 111, 711, 7114, pattern: '\d{2}|111|711|7114')
True utm_campaign='1024900965088' (Only 13 digits, pattern: '\d{13}')
...
https://vk.com/best_public 87654321 Best public ever False best_public ...

Paths

Param Type Default Description
log_file string runtime.log Path to runtime log file
target_file string target.txt Path to target file with urls
result_file string result.xlsx Path to result file, default file format is xlsx.

Available formats: csv, xlsx, json, html.
save_public_data_dir string publics_data The path to the directory when saving the parsed data of the VK group to a JSON file

If parsing.save_public_data is false - data don't been saved

Exceptions

Param Type Default Description
max_tries intager 5 Number of attempts to get data
timeout float 5 Waiting between attempts
(multiplied by the number of max_tries)

Widget url regexes

Not provided UTM codes

REG-CODE|OGRN|ID|MUN-CODE

Spacers

\s|%20

Template

https://pos\.gosuslugi\.ru/(?:form/\?(opaId=\d+)|og/org-activities\?(?:(reg_code=\d{2,8})|(mun_code=\d{8})))&(utm_source=vk|utm_source=vk[12])&(utm_medium=\d{2,4})&(utm_campaign=\d{13})

Requirements

  1. Python 3.8+
  2. Installed python env requirements
    omegaconf==2.3.0
    tqdm==4.65.0
    vk==3.0
    openpyxl==3.1.2
    pandas~=2.0.2
    requests~=2.31.0
    

find-pos-widgets

Оглавление
  1. Описание
  2. Развертывание
  3. Конфигурации
  4. Регулярные выражения URL виджетов
  5. Требования

Описание

Находит установленные виджеты POS на общедоступной странице ВКонтакте и проверяет их URL-адреса на соответствие шаблонам с метками UTM.
Результаты записываются в файл, указанный в файле конфигурации.

Типы результатов POS

  • CORRECT - Правильные URL-адреса
  • INVALID - Содержат неправильные URL-адреса
  • LINKS_COUNT - Неверное количество URL-адресов
  • MISSING - URL-адреса отсутствуют
  • TIMEOUT - Невозможно получить публичные данные из запроса, истекло время ожидания соединения
  • ERROR - Неправильный публичный URL или ошибка обработки полученных данных

В консоли отображается прогрессбар с информацией о ходе выполнения программы:

Clearing resources ...
Reading file ...
Prepare publics from links ...
Number of links found: 3319
Start processing:
Processing: 100%|████████████| 3319/3319 [00:37<00:00, 88.23url/s, CORRECT=963, INVALID=1968, MISSING=388, TIMEOUT=0, ERROR=0]
Processing complete! See results in './result.xlsx'

Статусы URL-адресов

  • VALID - Правильный URL-адрес
  • NOT_MATCH - Неверный URL-адрес, не соответствует шаблону
  • UTM_INVALID - Неверное значение кода UTM
  • SPACER - Неверный URL-адрес, содержит пробелы

Условия для проверки UTM-кодов POS ссылки

Возвращает результат проверки True (пройдена) или False (НЕ пройдена)

  • ID: Только цифры
    \d+
  • REG-CODE: Только 2 цифры или одно из значений: 111, 711, 7114
    \d{2}|111|711|7114
  • MUN-CODE: Только 8 цифр
    \d{8}
  • OGRN: Только 13 цифр
    \d{13}
  • SOURCE: Только одно из значений: vk, vk1, vk2
    vk|vk1|vk2
  • UNDEFINED: Неизвестный UTM-код

Развертывание

ОС Windows

  1. Перейдите в директорию проекта

    cd find-pos-widgets
  2. Создайте Python-окружение

    python -m venv venv
  3. Активируйте окружение

    # для cmd.exe
    venv\Scripts\activate.bat
    # для PowerShell
    venv\Scripts\Activate.ps1
  4. Обновите pip (эту команду можно пропустить)

    pip install --upgrade pip
  5. Установите зависимости

    pip install -r requirements.txt
  6. Запустите скрипт

    python main.py

ОС Linux / MacOS

  1. Перейдите в директорию проекта
    cd find-pos-widgets
  2. Создайте Python-окружение
    python -m venv venv
  3. Активируйте окружение
    source venv\Scripts\activate
  4. Обновите pip (эту команду можно пропустить)
    pip install --upgrade pip
  5. Установите зависимости
    pip install -r requirements.txt
  6. Запустите скрипт
    python main.py

Остановка:

  1. Для остановки скрипта используйте сочетание клавиш:
    ctrl + c
  2. Для закрытия окружения используйте команду:
    deactivate

Конфигурации

Определены в config.yaml файле:

vk_api:
  access_token: 'Ваш токен здесь' # https://vkhost.github.io
parsing:
  max_links_per_widget: 2
  skip_correct: false
  save_public_data: true
  public_data_fields: [ menu, is_government_organization, activity, city, addresses, contacts, description, members_count, status ]
  utm_codes_regex:
    ID: '\d+'
    REG-CODE: '\d{2}|111|711|7114'
    MUN-CODE: '\d{8}'
    OGRN: '\d{13}'
    SOURCE: 'vk|vk1|vk2'
display:
  csv_delimiter: ';'
  public_display_fields: [ pos_result, url, is_government_organization, city.title, addresses.main_address.city.title, id, name, screen_name, pos_links ]
  show_utm_status: true
  codes_hints:
    pattern: '{is_valid} {param}={value} ({hint}; шаблон: {pattern})'
    items:
      ID: 'Только цифры'
      REG-CODE: 'Только 2 цифры или одно из значений: 111, 711, 7114'
      MUN-CODE: 'Только 8 цифр'
      OGRN: 'Только 13 цифр'
      SOURCE: 'Только одно из значений: vk, vk1, vk2'
      UNDEFINED: 'Неизвестный UTM-код'
  status_types:
    pattern: '{name}'
    items:
      VALID: { name: '✅', value: 'Правильный URL-адрес' }
      NOT_MATCH: { name: '❌', value: 'Неверный URL-адрес, не соответствует шаблону' }
      UTM_INVALID: { name: '⚠️', value: 'Неверное значение кода UTM' }
      SPACER: { name: '⚠️', value: 'Неверный URL-адрес, содержит пробелы' }
      UNDEFINED: { name: '❗', value: 'Ссылка не является POS' }
  result_types:
    pattern: '{name}: {value}'
    items:
      CORRECT: { name: '✅', value: 'Правильные URL-адреса' }
      INVALID: { name: '⚠️', value: 'Содержат неправильные URL-адреса' }
      LINKS_COUNT: { name: '❗', value: 'Неверное количество URL-адресов' }
      MISSING: { name: '❌', value: 'URL-адреса отсутствуют' }
      TIMEOUT: { name: '⌛️', value: 'Невозможно получить публичные данные из запроса, истекло время ожидания соединения' }
      ERROR: { name: '🆘', value: 'Неправильный публичный URL или ошибка обработки полученных данных' }
paths:
  log_file: 'runtime.log'
  target_file: 'target.txt'
  result_file: 'result.xlsx'
  save_public_data_dir: 'publics_data'

VK API

Параметр Тип Значение по умолчанию Описание
version float 5.221 Версия VK API
access_token string - (Обязательный) Ваш токен VK API.

For provide access_token you can use официальные VK hosts. Лучше не получать токен с личной страницы, т.к. есть низкая вероятность получить блокировку, используйте фейк аккаунт.

Парсинг

Параметр Тип Значение по умолчанию Описание
max_links_per_widget intager 2 Проверка количества POS-виджетов, если 0 - проверка пропускается
skip_correct boolean false Пропустить URL-адреса с правильными POS-виджетами
save_public_data boolean true Если нам нужно сохранить данные об общественных страницах в папке
public_data_fields list [menu, is_government_organization] Поля для запроса из VK API.

Переменные:
  • menu - данные виджетов
  • activity - тип активности общественной страницы
  • city - город общественной страницы
  • description - описание общественной страницы
  • members_count - общее количество участников общественной страницы
  • status - текущий статус общественной страницы
  • ... больше полей можно найти на dev.vk.com
utm_codes_regex dictionary ID: \d+
REG-CODE: \d{2}|111|711|7114
MUN-CODE: \d{8}
OGRN: \d{13}
SOURCE: vk|vk1|vk2
Поля для перезаписи regex для проверок UTM-меток.

Дисплей

Параметр Тип Значение по умолчанию Описание
csv_delimiter string ; Разделитель для файла результатов в формате CSV
public_display_fields list [pos_result, url, name, pos_links, id, screen_name] Выберите поля для отображения в файле результатов (они будут отображены в том же порядке)

Переменные:
  • pos_result - тип результата анализа виджета POS
  • url - целевой общедоступный URL
  • is_government_organization - Метка госорганизации
  • name - разобранное имя общедоступного ресурса
  • pos_links - статус проверки ссылок POS
  • id - разобранный идентификатор общедоступного ресурса
  • screen_name - разобранное имя общедоступного ресурса в короткой ссылке
  • ... добавьте больше из parsing.public_data_fields

Вы можете получить доступ к вложенным данным, если поле возвращает набор данных, пример для city.title:

поле city возвращает данные {"id": 123, "title": "cityname"}

для получения cityname используй city.title
show_utm_status boolean true Включает детальную информацию по UTM-кодах в POS ссылке
codes_hints dictionary - Здесь вы можете указать значения для отображения в файле результатов в формате шаблона

Используйте переменные из списка и укажите шаблон pattern, чтобы определить, как они будут предоставлены

Переменные:
code - (string) Код
param - (string) атрибут UTM-кода
value - (string) Значение UTM-кода
pattern - (string) регулярное выражение для проверки
hint - (string) Ожидаемое значение
is_valid - (boolean) Результат проверки

Пример:
pattern = "[{is_valid}] {param}={value} ({hint}, pattern: {pattern})"
будет представлено как: True: utm_source='vk' ('Только одно из значений: vk, vk1, vk2', pattern: 'vk1|vk2|vk3')
result_types
and
status_types
dictionary - Здесь вы можете указать значения для отображения в файле результатов в формате шаблона

Используйте любые переменные, такие как name, value или другие. Затем укажите pattern, чтобы определить, как они будут предоставлены

Пример для status_type:
{"name": "✅", "value": "Правильные URL-адреса"}
pattern = "{name}: {value}"
будет представлено как: `✅: Правильные URL-адреса
Пример файла результата в формате XLSX:
pos_result url id name is_government_organization screen_name pos_url-0 pos_url_status-1 url_utm_codes-1 ...
https://vk.com/public12345678 12345678 Имя паблика True club12345678 https://pos.gosuslugi.ru/form/?opaId=123456&utm_source=vk&utm_medium=11&utm_campaign=1234567890123 ✅ Ок True opaId='223186' (Только цифры, шаблон: '\d+')
True utm_source='vk' (Только одно из значений: vk, vk1, vk2, шаблон: 'vk|vk1|vk2')
True utm_medium='44' (Только 2 цифры или одно из значений: 111, 711, 7114, шаблон: '\d{2}|111|711|7114')
True utm_campaign='1024900965088' (Только 13 цифр, шаблон: '\d{13}')
...
https://vk.com/best_public 87654321 Самый лучший паблик False best_public ...

Пути

Параметр Тип Значение по умолчанию Описание
log_file string runtime.log Путь к файлу журнала выполнения
target_file string target.txt Путь к файлу с целевыми URL-адресами
result_file string result.xlsx Путь к файлу с результатами, формат по-умолчанию xlsx.

Доступные форматы: csv, xlsx, json, html.
save_public_data_dir string publics_data Путь к каталогу, в котором сохраняются разобранные данные группы VK в формате JSON

Если parsing.save_public_data равно false, данные не сохраняются

Исключения

Параметр Тип Значение по умолчанию Описание
max_tries intager 5 Количество попыток получения данных
timeout float 5. Ожидание между попытками
(умножается на количество max_tries)

Регулярные выражения URL-адресов виджетов

Не предоставленные коды UTM

REG-CODE|OGRN|ID|MUN-CODE

Разделители

\s|%20

Шаблон

https://pos\.gosuslugi\.ru/(?:form/\?(opaId=\d+)|og/org-activities\?(?:(reg_code=\d{2,8})|(mun_code=\d{8})))&(utm_source=vk|utm_source=vk[12])&(utm_medium=\d{2,4})&(utm_campaign=\d{13})

Требования

  1. Python 3.8+
  2. Установлены зависимости python requirements
    omegaconf==2.3.0
    tqdm==4.65.0
    vk==3.0
    openpyxl==3.1.2
    pandas~=2.0.2
    requests~=2.31.0
    

About


Languages

Language:Python 100.0%