Пример #1
0
def add_to_history(new_post, wall_id):
    with session_scope() as session:
        pic = session.query(Pic).filter_by(
            post_id=new_post['post_id'], service=new_post['service']).first()
        pic.history_item = HistoryItem(
            wall_id=wall_id)  # orphaned history_item deletes itself
        pic.queue_item = None  # orphaned queue_item deletes itself
Пример #2
0
def post_to_vk_via_api(new_post, msg):
    post_url = 'https://' + service_db[
        new_post['service']]['post_url'] + new_post['post_id'].split('_p')[0]
    # Авторизация
    post_msg = f"{msg}\nОригинал: {post_url}"
    api = vk_requests.create_api(service_token=VK_TOKEN, api_version=5.71)
    # Загрузка картинки на сервер
    with open(f"{QUEUE_FOLDER}{new_post['pic_name']}", 'rb') as pic:
        current_album = get_current_album()
        upload_url = api.photos.getUploadServer(
            group_id=VK_GROUP_ID, album_id=current_album)['upload_url']
        img = {'file1': (new_post['pic_name'], pic)}
        response = requests.post(upload_url, files=img)
        result = response.json()
        result['server'] = int(result['server'])
        uploaded_photo = api.photos.save(group_id=VK_GROUP_ID,
                                         album_id=current_album,
                                         caption=post_url,
                                         **result)
        photo_link = 'photo' + str(uploaded_photo[0]['owner_id']) + '_' + str(
            uploaded_photo[0]['id'])
        wall_id = api.wall.post(message=post_msg,
                                owner_id='-' + VK_GROUP_ID,
                                attachments=(photo_link, ))
    with session_scope() as session:
        num_photos = session.query(Setting).filter_by(
            setting='num_photos').first()
        num_photos.value = str(int(num_photos.value) + 1)
    return wall_id['post_id']
Пример #3
0
def post_to_vk(new_post):
    log = logging.getLogger(f'ohaio.{__name__}')
    if new_post['post_to_vk']:
        try:
            wall_id = post_to_vk_via_api(new_post, gen_msg(new_post))
        except Exception as ex:
            log.error("VK posting failed", exc_info=True)
            wall_id = -1
        else:
            with session_scope() as session:
                last_poster = Setting(setting='last_poster',
                                      value=str(new_post['sender']))
                session.merge(last_poster)
    else:
        wall_id = -1
    return wall_id
Пример #4
0
def update_header():
    with session_scope() as session:
        queue_num = session.query(QueueItem).count()
    # api = vk_requests.create_api(APP_ID, VK_LOGIN, VK_PASS, scope=['wall', 'photos'], v=5.62)
    # api = vk_requests.create_api(access_token=VK_TOKEN, v=5.62)
    api = vk_requests.create_api(service_token=VK_TOKEN, api_version=5.71)
    img = Image.open('header.png')
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("VISITOR_RUS.TTF", 10)
    draw.text((3, img.height - 12),
              f"Пикч в очереди: {queue_num}", (255, 255, 255),
              font=font)
    img.save('cur_header.png')
    with open('cur_header.png', 'rb') as pic:
        upload_url = api.photos.getOwnerCoverPhotoUploadServer(
            group_id=VK_GROUP_ID, crop_x2=795, crop_y2=200)['upload_url']
        img = {'photo': ('cur_header.jpg', pic)}
        response = requests.post(upload_url, files=img)
        result = response.json()
        api.photos.saveOwnerCoverPhoto(**result)
Пример #5
0
def get_current_album():
    api = vk_requests.create_api(service_token=VK_TOKEN, api_version=5.71)
    with session_scope() as session:
        cur_album = session.query(Setting).filter_by(
            setting='current_album').first()
        num_photos = session.query(Setting).filter_by(
            setting='num_photos').first()
        if not num_photos:
            num_photos = Setting(setting='num_photos', value="0")
            session.add(num_photos)
        if not cur_album:
            new_album = create_album(api, 1)
            cur_album = Setting(setting='current_album',
                                value=str(new_album['id']))
            session.add(cur_album)
            return str(new_album['id'])
        if int(num_photos.value) < 10000:
            return cur_album.value
        else:

            albums = api.photos.getAlbums(owner_id='-' + VK_GROUP_ID,
                                          album_ids=(int(
                                              cur_album.value), ))['items']
            # latest_album = [id for id in sorted(albums, key=lambda k: k['updated'], reverse=True)][0]
            latest_album = albums[0]
            if latest_album['size'] < 10000:
                num_photos.value = str(latest_album['size'])
                return cur_album.value

            next_number = int(latest_album['title'].replace("Feed #", "")) + 1
            prev_album = session.query(Setting).filter_by(
                setting='previous_album').first()
            new_album = api.photos.createAlbum(title=f"Feed #{next_number:03}",
                                               group_id=VK_GROUP_ID,
                                               upload_by_admins_only=1,
                                               comments_disabled=1)
            prev_album.value = cur_album.value
            cur_album.value = str(new_album['id'])
            num_photos.value = '0'
            return str(new_album['id'])
Пример #6
0
from datetime import date
from typing import List

import vk_requests
from dateutil.relativedelta import relativedelta

from creds import VK_TOKEN, VK_GROUP_ID
from db_mng import Setting, session_scope

with session_scope() as session:
    current_album = session.query(Setting).filter_by(setting='current_album').first()
    previous_album = session.query(Setting).filter_by(setting='previous_album').first()
today = date.today()
d = today - relativedelta(months=1)
month_start, month_end = date(d.year, d.month, 1), date(today.year, today.month, 1) - relativedelta(days=1)
api = vk_requests.create_api(service_token=VK_TOKEN, api_version=5.71)


def get_photos(cur_album, old_album, offset=0) -> List[dict]:
    acc: List[dict] = []
    req = api.photos.get(owner_id='-' + VK_GROUP_ID, album_id=cur_album, extended=1, rev=1, count=1000, offset=offset)
    acc += req['items']
    if req['count'] < 1000 and old_album:
        pics_got = req['count']
        cur_album = old_album
        acc += api.photos.get(owner_id='-' + VK_GROUP_ID, album_id=cur_album, extended=1, rev=1,
                              count=1000 - pics_got)['items']
    return acc


photos = []
Пример #7
0
def check_queue(args):
    vk_posting_times = [(55, 60), (0, 5), (25, 35)]
    minute = dt.now().minute
    is_vk_time = args.forced_post or any(
        time_low <= minute <= time_high
        for time_low, time_high in vk_posting_times)
    with session_scope() as session:
        post_stats = {
            sender: count
            for sender, count in session.query(
                QueueItem.sender, func.count(QueueItem.sender)).group_by(
                    QueueItem.sender).all()
        }
        if not post_stats:
            return None
        db_last_poster = session.query(Setting).filter_by(
            setting='last_poster').first()
        db_users = [
            user.user_id
            for user in session.query(User).order_by(User.user_id).all()
        ]  # order is important
        limits = {
            user.user_id: user.limit
            for user in session.query(User).order_by(User.user_id).all()
        }
        last_user = int(db_last_poster.value) if db_last_poster else OWNER_ID
        shifted_users = db_users[
            db_users.index(last_user):] + db_users[:db_users.index(last_user)]
        # shift users to start from next user for vk
        vk_users = shifted_users[1:] + shifted_users[:1]
        new_poster = None
        if is_vk_time:
            for user in vk_users:
                if post_stats.get(user, 0) > 0:
                    new_poster = user
                    break
        else:  # can stay same if appropriate
            for user in shifted_users:
                if post_stats.get(user, 0) >= limits.get(user, QUEUE_LIMIT):
                    new_poster = user
                    break
            else:
                return None  # don't post if no user exceeds limit
        posts = session.query(QueueItem).filter_by(sender=new_poster).order_by(
            QueueItem.id).all()
        queue_post = None
        for post in posts:
            if not post.pic.history_item:
                queue_post = {
                    'service': post.pic.service,
                    'post_id': post.pic.post_id,
                    'authors': post.pic.authors,
                    'chars': post.pic.chars,
                    'copyright': post.pic.copyright,
                    'sender': post.sender,
                    'post_to_vk': is_vk_time
                }
                if os.path.exists(f"{QUEUE_FOLDER}{post.pic_name}"):
                    queue_post['pic_name'] = post.pic_name
                elif post.pic.file_id:
                    queue_post['file_id'] = post.pic.file_id
                else:  # how this even happened?
                    session.delete(post)
                    continue
                break
            else:
                session.delete(post)
    return queue_post