Как стать автором
Обновить

Автопостинг вк 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])

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

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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.