Шаги:
- Авторизация ВК из кода
- Получаем текущее время, если отличается от того, что на аватарке, меняем
- Создаем картинку с текущим временем
- Обновляем аватарку
Насколько знаю нельзя делать аватарку Вконтакте так, чтобы она двигалась сама. Поэтому будем каждую минуту удалять старую аватарку и загружать новую.
Авторизация ВК из кода
Для получения доступа к API ВК решил использовать библиотеку vk_api, к ней есть подробная документация и работать с ней приятно. Пора ее установить:
pip3 install vk_api
Авторизуемся через токен, так как метод для смены аватарки требует ключ доступа пользователя.
vk_session = vk_api.VkApi(login = '#ваш логин(лучше всего использовать номер телефона',
token='#ваш токен')
try:
vk_session.auth(token_only=True)
except vk_api.AuthError as error_msg:
print(error_msg)
return
Получаем текущее время, если отличается от того, что на аватарке, меняем
Устанавливаем стартовое время, может быть любое. Я выбрал полночь
start_time = '00.00'
После чего создаем цикл, который каждый раз будет получать текущее время и будет сравнивать его со стартовым, и если есть изменения делать определенные действия.
start_time = '00.00'
while True:
dt = datetime.now()
end_time = f"{dt.hour}:{dt.minute:02}"
if start_time < end_time:
#Присваиваем стартовому времени текущее время.
start_time = end_time
Создаем картинку с текущим временем
Для работы с графикой решил использовать библиотеку Pillow, уже имел опыт использования ее и поэтому не возникло трудностей со вставкой текста на картинку.
Устанавливаем:
pip3 install Pillow
Перед циклом задаем параметры для шрифта, положения и цвет текста на картинке.
#Указываем шрифт и размер (шрифт находится в текущей папке)
font = ImageFont.truetype('acrom300.otf',70)
# определяете положение текста на картинке
text_position = (80, 120)
# цвет текста, RGB
text_color = (0,0,0)
prev_update_time = ""
Так же создам функцию для перевода времени в строку.
def convert_time_to_string(dt):
return f"{dt.hour}:{dt.minute:02}"
Уже в самом цикле создаем картинку с нынешним временем.
#создаем холст
image = Image.new("RGB", (320,320), (255,255,255))
draw = ImageDraw.Draw(image)
# собственно, сам текст
prev_update_time = convert_time_to_string(datetime.now())
# добавляем текст
draw.text(text_position, prev_update_time , text_color, font)
# сохраняем новое изображение
image.save('test.jpg')
После того как создали картинку, нужно удалить старую аватарку из профиля. Загрузить новую, а также удалить запись со стены о том, что обновили главную страницу, чтобы сильно не палиться, что каждую минуту меняем картинку. И конце удаляем картинку из папки.
# удаляем старую аватарку
vk = vk_session.get_api()
response_ph = vk.photos.get(count = 1, album_id = 'profile', rev = 1)
if response_ph ['items']:
ph_id = response_ph['items'][0]
ph_response_delete = vk.photos.delete(photo_id = ph_id['id'])
# загружаем новую.
upload = vk_api.VkUpload(vk_session)
photo = upload.photo_profile('test.jpg')
response = vk.wall.get(count = 1)
if response ['items']:
post = response['items'][0]
post_response_delete = vk.wall.delete(post_id = post['id'])
# удаляем аватарку с компа
os.remove('test.jpg')
Готово. Запускаем и любуемся где-то час, а потом Вконтакте присылает нам капчу, которую пока бот не состоянии обработать, надеюсь в будущем смогу найти решения данной проблеме.
И все еще думаю на тем как сделать красивую аву, а не белый фон и цифры черными буквами, хоть и выглядит это довольно минималистично.
Комментарии (11)
Ds02006
06.07.2022 17:08+2На аватарке будет ВАШЕ локальное время? А зачем оно жителям других часовых поясов?
milkground
07.07.2022 09:09То есть вы допускаете, что существуют люди, которые будут смотреть на эту аватарку именно для того, чтобы узнать который сейчас час?
TimsTims
07.07.2022 09:36В интернете очень много всяких глупостей, и время на аватарке - не самая плохая идея.
Взять например сайт http://www.milliondollarhomepage.com/ , где автор насобирал $1млн за обращение пожизненной рекламы. Разве кто-то будет туда специально заходить, чтобы посмотреть рекламу?) Нет, но странная идея взлетела.
milkground
07.07.2022 09:43+1Так я именно про это и говорю. Выше человек написал, что время указывается без учета часового пояса смотрящего. Зачем смотрящему на аватарку время в своём часовом поясе? Он же не собирается сверять часы по этой аватарке. Это просто проект for fun и для того, чтобы впечатлить часть людей сменой аватарки по времени.
TimsTims
07.07.2022 11:16+1Это просто проект for fun
Вы правы, это for fun.
Но посмотрите шире - эта статья уже на хабре, и завтра какой-то человек захочет переиспользовать код, и обновлять например на аватарке не время, а делать снимок с вебкамер, смотрящих на красивые виды, и выкладывать его.
А другой человек возьмёт код генерации текста на картинке, и тоже его использует в своём проекте.
Или ещё кто-нибудь что-нибудь придумает прикольное и забавное, часы здесь как пример.
khacsam
07.07.2022 12:55+2Плюсую! К сожалению, только словесно, поскольку кармы не хватает проголосовать за ответ
Aquahawk
06.07.2022 20:21браузеры конечно поотрубали такие возможность, но раньше через svg можно было такое сотворить https://habr.com/ru/post/350596/
4reddy
@dbcr1 Есть исходники?