Search
Write a publication
Pull to refresh

Автопостинг вк python или оставить след о себе после смерти

В принципе данная идея возникла на желании оставить после себя что-то в этом мире после смерти, но на деле будет обыкновенное CR приложение, UD где то по дороге потерялось. Я вообще не профессионал и историю о том как не войти в it 8 лет программируя с дипломом СПО программиста можно наверное оставить для другого ресурса с матерным названием, но hr видимо виднее где берётся опыт которого у меня нет и знания деть не куда. А так как мы не профессионалы пойдём самым лёгким путём. Хватит лирики в прочем можно приступить. Цели:

  1. Цель наполнить базу какими то данными, по идее подойдут любые. Проект будет состоять из нескольких частей

  2. Скрапинг данных(хотя понимал бы я что значит это модное слово) из архива вк. т.е. сообщения.(Для повторения данной манипуляции необходимо скачать архив). Как получить архив гуглам умеют пользоваться все. В прочем если с bs4 пойдёт, что либо не так придётся тащить целый Selenium WebDriver как настоящий самоучный профессионал тестировщик, в любом случае база будет наполнена данными.

  3. Базу будем использовать mySQL потому, что я с ней работал неоднократно в принципе можно использовать любую в любом случае будет всего 2 колонки одна с id поста, другая с текстом поста на стену. В принципе при должном опыте можно расщирить и использовать это в комрчиских целях создав полноценный клиент и автопостинг, но нам это не нужно ведь у самоучек опыта больше.

  4. Цель написать wallpost в определённое время суток, по идее это просто 1 http запрос раз в сутки в бесконечном цикле, но мы будем использовать готовое решение библиотеку vk_api потому, да бы избежать ненужных ошибок.

  5. Написать клиент который будет подключаться к базе, генерировать рандомное число и оставлять пост с сообщением. Скорее всего это будет Kiwy с билдом с помощью buildozer где вводишь адрес сервера с базой, токен вк и на стене постится случайное значение из списка полученного из базы.

  6. Деплой этого добра на сервер с установленной ubuntu. На аренду которого нет средств, да и в принципе, что бы заниматься программированием средства не нужны, на перегревающемся нетбуке с авито за 1,5к. рублей можно писать. Только писать будете раза в 3 дольше и проклянёте всё на свете. Ну в принципе это опять для другого ресурса.

Это уже 3 приложения, но не суть важно ведь при должном опыте это всё можно сделать за пол часа, а главное безопастно. Ах да чуть, не забыл мы будем использовать страшный терминал по этому под win возможно немного иначе, но по идее всё должно работать  на python v3.4+ в плане кода установки пакетов, могут отличаться с установленным ну и с двумя кликами в в принципе разберётесь. В любом случае это всё будет изначально на локальной машине.

Используемые технологии:

Python3, BS4, mySQL(на локальной машине мария в принципе с одной колонкой это вообще не важно), ubuntu.

Текстовый редактор: sublime-text

Окружение: Manjaro. в принципе шел скрипт будет работать на минт в версиях 19 и старше точно, убунту аналогично.

Это всё можно запихать в шел скрипт:

#!/bin/bash
mkdir project-vk-when-i-die
cd project-vk-when-i-die
python3 -m pip install virtualenv
python3 -m venv env
source env/bin/activate
python3 –m pip install beautifulsoup4 pipreqs requests pymysql vk_api html5lib
touch parse .py
subl .

Скрипт для парсинга архива вк  и наполнения бд тестовыми данными parse.py:

import bs4,sys
from urllib.request import urlopen
import database

webpage = urlopen('file:///home/*/vk_arc/Archive/messages/16379605/messages0.html').read().decode('windows-1251')
soup = bs4.BeautifulSoup(webpage, 'html5lib')
text_arr = list()
for text in soup.findAll('div',{"class":"message"}):
	text_arr.append(text.text)



for i in text_arr:
	database.add_to_table(i)


new = database.get_from_db()

print(new[1])

Сообщения можно перебрать циклом по 50 итерацией, но мы делать этого естественно не будем ибо в падлу, база и так наполнена тестовыми данными, а нам большего и не надо.

 

Создать табличку mysql.

В прочем ничего сложного просто 2 колонки с максимальным значением, надеюсь с workbench либо консольным клиентом сможете самостоятельно разобраться потому заострять внимание на этом не стоит.

Create database VK;
USE VK;

CREATE TABLE post_text(
	id int(254) NOT NULL AUTO_INCREMENT,
	text varchar(16382),
	PRIMARY KEY (id)
);

Отдельный файл для работы с субд database.py:

import pymysql.cursors,pymysql.err
import sys


db_table = 'post_text'

db_text = 'text'

connection = pymysql.connect(host='localhost',
                             user='root',
                             password='your_password*',
                             database='VK',
                             cursorclass=pymysql.cursors.SSCursor)
def get_from_db():

	with connection.cursor() as cursor:
		connection.autocommit(True)
		result = list()
		sql = f'SELECT {db_text} FROM {db_table}'
		print(sql)
		cursor.execute(sql)
		for row in cursor:
			result.append(row)

		return result
	


def add_to_table(text):

	with connection.cursor() as cursor:
		sql = f"INSERT INTO {db_table} ({db_text}) VALUES (%s)"
		cursor.execute(sql, text)
	connection.commit()

		

По итогу, так как база наполнена тестовыми данными  можно приступать дальшек постингу на стене данные файлы мы запускаем только 1 раз и для наполнения базы данных.

В прочем не стоит даже запариваться и будем делать пост в бесконечном цикле просто на стене с помощью библиотеки vk_api. Ибо в документации вк чёрт ногу сломит и вообще ничего не понятно, лучше конечно это делать одним пост запросом. При том что документация редко сходится с реальным кейсом, как они это любят говорить лучше понятным методом, тем более наша цель пост на стену раз в сутки в 4 утра и не сильно важно от лица сообщества или страницы.

import vk_api
import database
import config
import requests
import random

from datetime import datetime
from time import sleep





TOKEN = config.TOKEN
login = config.login
password = config.password


vk_session = vk_api.VkApi(login, password)
vk_session.auth()
vk = vk_session.get_api()
working = True
posts = database.get_from_db()

def post_vk(post):
	now = datetime.now()
	current_time = now.strftime("%H:%M")
	time_to_send = "21:00"
	print(current_time)
	if current_time==time_to_send:
		print(vk.wall.post(message='Новый день'))
		sleep(5)
		print(vk.wall.post(message = post))
	sleep(55)




while working:
	rand = random.randrange(0,len(posts))
	print(posts[rand])
	post_vk(posts[rand])

В принципе цель достигнута осталось оттестировать на длительном промежутке времени не будет ли приложение падать, клиент в потенциальном будущем. Всё пишется за пол часа и возможными средствами и мы вовсе не профессионалы посему нам простительно, да и приложение в принципе никому и не нужно вовсе. Ну и целью было склепать годноту за пол часа времени как и положено.

И ни в коем случае, не верьте всем тем кто говорит что программирование это просто.

Весь код находится в репозитории по ссылке с ключами доступа и прочим. Но в принципе это не сильно важно.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.