Недавно увидел, как у одного пользователя в Телеге аватарка отображает текущее время. Решил, что хочу что-нибудь подобное, но делать такое в Телеге уже не интересно, пусть будет ВКонтакте.
Шаги:

  1. Авторизация ВК из кода
  2. Получаем текущее время, если отличается от того, что на аватарке, меняем
  3. Создаем картинку с текущим временем
  4. Обновляем аватарку

Насколько знаю нельзя делать аватарку Вконтакте так, чтобы она двигалась сама. Поэтому будем каждую минуту удалять старую аватарку и загружать новую.

Авторизация ВК из кода


Для получения доступа к 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)


  1. 4reddy
    06.07.2022 16:20

    @dbcr1 Есть исходники?


  1. Ds02006
    06.07.2022 17:08
    +2

    На аватарке будет ВАШЕ локальное время? А зачем оно жителям других часовых поясов?


    1. danial72
      06.07.2022 17:26
      +6

      Чтобы знать, что у автора уже 11 часов вечера и ему не стоит писать.


    1. milkground
      07.07.2022 09:09

      То есть вы допускаете, что существуют люди, которые будут смотреть на эту аватарку именно для того, чтобы узнать который сейчас час?


      1. TimsTims
        07.07.2022 09:36

        В интернете очень много всяких глупостей, и время на аватарке - не самая плохая идея.

        Взять например сайт http://www.milliondollarhomepage.com/ , где автор насобирал $1млн за обращение пожизненной рекламы. Разве кто-то будет туда специально заходить, чтобы посмотреть рекламу?) Нет, но странная идея взлетела.


        1. milkground
          07.07.2022 09:43
          +1

          Так я именно про это и говорю. Выше человек написал, что время указывается без учета часового пояса смотрящего. Зачем смотрящему на аватарку время в своём часовом поясе? Он же не собирается сверять часы по этой аватарке. Это просто проект for fun и для того, чтобы впечатлить часть людей сменой аватарки по времени.


          1. TimsTims
            07.07.2022 11:16
            +1

            Это просто проект for fun

            Вы правы, это for fun.

            Но посмотрите шире - эта статья уже на хабре, и завтра какой-то человек захочет переиспользовать код, и обновлять например на аватарке не время, а делать снимок с вебкамер, смотрящих на красивые виды, и выкладывать его.

            А другой человек возьмёт код генерации текста на картинке, и тоже его использует в своём проекте.

            Или ещё кто-нибудь что-нибудь придумает прикольное и забавное, часы здесь как пример.


            1. khacsam
              07.07.2022 12:55
              +2

              Плюсую! К сожалению, только словесно, поскольку кармы не хватает проголосовать за ответ


        1. bBars
          07.07.2022 15:50

          Milliondollarhomepage, если я правильно помню, и не для людей делался


          1. TimsTims
            07.07.2022 20:24

            Да какая разница для кого. Часы на аватарке во ВК разве тоже для людей?) Пока ты зайдешь время посмотреть — ты уже 100500 раз его увидишь в телефоне или на компьютере.


  1. Aquahawk
    06.07.2022 20:21

    браузеры конечно поотрубали такие возможность, но раньше через svg можно было такое сотворить https://habr.com/ru/post/350596/