VK API и баг с сохранением видео

Как то давно написал я python-скрипт для добавления YouTube-видео в группу Вконтакте по расписанию. Все работало хорошо, но иногда в группе появлялись странные посты где вместо нужного видео подставлялся клип группы БИ-2, причем он был залит напрямую в VK и из левых видеороликов появлялся всегда именно этот.
После отладки выяснилось что в настройках некоторых видео на YouTube стоит запрет на добавление в VK. Если попробовать залить такой ролик вручную то вывалится подробная ошибка, а API такой случай не обрабатывает и возвращает успешный ответ!
Естественно такой кривой ролик публикуется и в группе красуется пост с клипом БИ-2 и чужим названием =)

Лечим баг

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

Если проверять такие ролики в API-песочнице VK то выяснится что залитые напрямую ролики отличаются от ютубовских только атрибутом files где у ютубовского будет external и ссылка на страницу в ютубе, а у другого прямые ссылки на mp4-файлы в разном качестве.
Все это хорошо, но атрибут files через API доступен далеко не всем и мой скрипт возвращает ответ без этого параметра.
Тогда я заметил что прямые ссылки на скриншоты с того самого ролика БИ-2 всегда отдаются одни и те же. Поэтому я взял и захардкодил проверку по url-скриншота ролика и на этом основании публикую или удаляю видео.

Описано сумбурно, думаю проще разобраться в самом скрипте:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- coding: utf-8 -*-

import vk_api
import re
import urllib2
import sys
import time


def normalize(value):
deletechars = '\/:*?"<>|'
for c in deletechars:
value = value.replace(c,'')
value = value[0:100]
return value + '.mp3'

def main():

login, password = '+79001001010', 'superpassword'
link = str(sys.argv[1])
name = str(sys.argv[2])

vk = vk_api.VkApi(login, password)

try:
vk.authorization()
except vk_api.AuthorizationError as error_msg:
print(error_msg)
return

values = {
'name': name,
'link': link,
'group_id': '999999999',
}
response = vk.method('video.save', values) # Используем метод video.save
# print response

response = urllib2.urlopen(response['upload_url'])
html = response.read()
# print html

good = '{"response":1}'
if (html == good):
values = {
'owner_id': '-999999999', # Получаем только один пост
'count': 1
}
response = vk.method('video.get', values) # Используем метод video.get
# print response['items'][0]['photo_320']

# бракуем видео на основании скриншота БИ-2
if (response['items'][0]['photo_320'] != 'http://cs634306.vk.me/u248902071/video/l_757c13b1.jpg'):
if((int(time.time())-int(response['items'][0]['adding_date']))<10):
values = {
'owner_id': '-999999999',
'from_group': 1,
'message': 'Новое видео! '+str(name),
'attachments': 'video-999999999_'+str(response['items'][0]['id']),
}
response = vk.method('wall.post', values)
print response
else:
values = {
'owner_id': '-999999999',
'video_id': response['items'][0]['id'],
}
response = vk.method('video.delete', values)
print 'bi2'


if __name__ == '__main__':
main()

Запускается он вот так:

1
python vk.py  'http://www.youtube.com/watch?v=aH9tlMra0Q0' 'Название видео'

Публикует видео на стену группы с id 999999999