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
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']
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
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)
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'])
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 = []
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