class TelegraphPost: def __init__(self, short_name, author_name): self.telegraph = Telegraph() self.__SHORT_NAME = short_name self.__AUTHOR_NAME = author_name self.__TELEGRAPH_TOKEN = self.create_acc() self.__TEMPLATE_ENV = Environment(loader=FileSystemLoader( searchpath="api/templates")) def create_acc(self): self.telegraph.create_account(short_name=self.__SHORT_NAME, author_name=self.__AUTHOR_NAME) telegraph_token = self.telegraph.get_access_token() return telegraph_token def create_post(self, rom_name, device, changelog, rom_pic): template = self.__TEMPLATE_ENV.get_template("template.html") html_content = template.render(rom_pic=rom_pic, rom_name=rom_name, changelog=changelog, device=device) title = f"{rom_name} for {device}" response = Telegraph(access_token=self.__TELEGRAPH_TOKEN).create_page( title=title, html_content=html_content, author_name=self.__AUTHOR_NAME) return f'https://telegra.ph/{response["path"]}'
class TelegraphHelper: def __init__(self, author_name=None, author_url=None): self.telegraph = Telegraph() self.short_name = ''.join(random.SystemRandom().choices( string.ascii_letters, k=8)) self.access_token = None self.author_name = author_name self.author_url = author_url self.create_account() def create_account(self): self.telegraph.create_account(short_name=self.short_name, author_name=self.author_name, author_url=self.author_url) self.access_token = self.telegraph.get_access_token() LOGGER.info( f"Creating TELEGRAPH Account using '{self.short_name}' name") def create_page(self, title, content): try: return self.telegraph.create_page(title=title, author_name=self.author_name, author_url=self.author_url, html_content=content) except RetryAfterError as st: LOGGER.warning( f'Telegraph Flood control exceeded. I will sleep for {st.retry_after} seconds.' ) sleep(st.retry_after) return self.create_page(title, content) def edit_page(self, path, title, content): try: return self.telegraph.edit_page(path=path, title=title, author_name=self.author_name, author_url=self.author_url, html_content=content) except RetryAfterError as st: LOGGER.warning( f'Telegraph Flood control exceeded. I will sleep for {st.retry_after} seconds.' ) sleep(st.retry_after) return self.edit_page(path, title, content)
LOGGER.error("One or more env variables missing! Exiting now") exit(1) #Generate User String LOGGER.info("Generating USER_SESSION_STRING") app = Client(':memory:', api_id=int(TELEGRAM_API), api_hash=TELEGRAM_HASH, bot_token=BOT_TOKEN) #Generate Telegraph Token sname = ''.join(random.SystemRandom().choices(string.ascii_letters, k=8)) LOGGER.info("Generating Telegraph Token using '" + sname + "' name") TELEGRAPH = Telegraph() TELEGRAPH.create_account(short_name=sname) TELEGRAPH_TOKEN = TELEGRAPH.get_access_token() LOGGER.info("Telegraph Token Generated: '" + TELEGRAPH_TOKEN + "'") try: HEROKU_API_KEY = getConfig('HEROKU_API_KEY') except KeyError: logging.warning('HEROKU API KEY not provided!') HEROKU_API_KEY = None try: HEROKU_APP_NAME = getConfig('HEROKU_APP_NAME') except KeyError: logging.warning('HEROKU APP NAME not provided!') HEROKU_APP_NAME = None try: MAX_TORRENT_SIZE = int(getConfig("MAX_TORRENT_SIZE")) except KeyError:
finally: cur.close() conn.close() LOGGER.info("Generating USER_SESSION_STRING") app = Client(':memory:', api_id=int(TELEGRAM_API), api_hash=TELEGRAM_HASH, bot_token=BOT_TOKEN) # Generate Telegraph Token sname = ''.join(random.SystemRandom().choices(string.ascii_letters, k=8)) LOGGER.info("Generating TELEGRAPH_TOKEN using '" + sname + "' name") telegraph = Telegraph() telegraph.create_account(short_name=sname) telegraph_token = telegraph.get_access_token() try: STATUS_LIMIT = getConfig('STATUS_LIMIT') if len(STATUS_LIMIT) == 0: raise KeyError else: STATUS_LIMIT = int(getConfig('STATUS_LIMIT')) except KeyError: STATUS_LIMIT = None try: MEGA_API_KEY = getConfig('MEGA_API_KEY') except KeyError: logging.warning('MEGA API KEY not provided!') MEGA_API_KEY = None try:
LOGGER.info('Generating USER_SESSION_STRING...') with Client(':memory:', api_id=int(TELEGRAM_API), api_hash=TELEGRAM_HASH, bot_token=BOT_TOKEN) as app: USER_SESSION_STRING = app.export_session_string() update_dat('config.env', 'USER_SESSION_STRING', USER_SESSION_STRING) # Generate TELEGRAPH_TOKEN if USE_TELEGRAPH: sname = ''.join(random.SystemRandom().choices(string.ascii_letters, k=8)) LOGGER.info("Using Telegra.ph...") LOGGER.info("Generating TELEGRAPH_TOKEN...") telegraph = Telegraph() telegraph.create_account(short_name=sname) TELEGRAPH_TOKEN = telegraph.get_access_token() if not USE_TELEGRAPH: TELEGRAPH_TOKEN = None LOGGER.info("Not Using Telegra.ph...") pass try: INDEX_URL = os.environ['INDEX_URL'] if len(INDEX_URL) == 0: INDEX_URL = None except KeyError: INDEX_URL = None try: BUTTON_THREE_NAME = os.environ['BUTTON_THREE_NAME'] BUTTON_THREE_URL = os.environ['BUTTON_THREE_URL'] if len(BUTTON_THREE_NAME) == 0 or len(BUTTON_THREE_URL) == 0:
if arg == sys.argv[0]: continue p.apply_async(main_up, args=(arg, )) p.close() p.join() print("upload final") input("waiting for input") else: inp = input("输入info获取信息,输入list获取所有的文章列表") if inp == "info": print( telegraph.get_account_info([ 'short_name', 'author_name', 'author_url', 'auth_url', 'page_count' ])) print(telegraph.get_access_token()) if inp == "list": offset = 0 while True: page_list = telegraph.get_page_list(offset, 10) print("共有{total}篇文章,目前显示的是{page_s}-{page_e}页".format( total=page_list['total_count'], page_s=offset + 1, page_e=offset + 10)) pages = page_list['pages'] for args in pages: for key, value in args.items(): print("{}:{}".format(key, value)) print("") flag = input("输入n下一页,输入b上一页,输入q退出") if flag == "q":
class Data: TEST_PHOTO = "https://i.ibb.co/0Gv4JyW/photo-2021-04-16-12-48-15.jpg" JOB_FAIR_END_TIME = datetime(2021, 5, 20, 20, 0, 0) def __init__(self, conn_string: str, bot: TeleBot): self.bot = bot me.connect(host=conn_string) print("connection success ") # if there is no ejf table in DB - then create it if len(JobFair.objects) == 0: self.reinit_ejf_table() print("ejf and content tables have been initialized") # if there was table already else: self.update_ejf_table() # create telegraph account self._create_telegraph_account() self.ADMIN_PASSWORD = self.get_ejf().admin_password # remove later # if there is no quiz table in DB - then create it self.add_quizes() # for user in User.objects: # user.additional_info = None # user.save() def add_test_company_with_vacancies(self, user, vacancies_number=2, photo=None, company_name=None): # company name = self._generate_string( ) if company_name is None else company_name photo_id = self.TEST_PHOTO if photo is None else photo description = self._generate_string(long=True) vacancy_counter = 20 # ? HR = user token = self._generate_string() registration_date = datetime.now(tz=timezone.utc) test_company = Company( name=name, photo_id=photo_id, description=description, vacancy_counter=vacancy_counter, HR=HR, token=token, registration_date=registration_date, ) test_company.save() # vacancies for i in range(vacancies_number): company = test_company name = self._generate_string() tag = self.get_ejf().filters_interest[random.randint( 0, len(self.get_ejf().filters_interest) - 1)] salary = f"{random.randint(1000, 5000)}$" experience = self.get_ejf().filters_experience[random.randint( 0, len(self.get_ejf().filters_experience) - 1)] employment_type = self.get_ejf().filters_employment[random.randint( 0, len(self.get_ejf().filters_employment) - 1)] description = self._generate_string(long=True) add_date = datetime.now(tz=timezone.utc) last_update_date = datetime.now(tz=timezone.utc) active_days_left = 14 is_active = True vacancy = Vacancy( company=company, name=name, tag=tag, salary=salary, experience=experience, employment_type=employment_type, description=description, add_date=add_date, last_update_date=last_update_date, active_days_left=active_days_left, is_active=is_active, ) from .objects import vacancy as vacancy_module vacancy_module.create_vacancy_telegraph_page( vacancy, self.telegraph) vacancy.save() def add_quizes(self): if len(Quiz.objects) == 0: self._add_start_quiz() # otherwise update it else: self.update_quiz_table() # add vacancy quiz if Quiz.objects.filter(name="VacancyQuiz").count() == 0: self._add_vacancy_quiz() print("Vacancy quiz has been added") # add vacancy quiz if Quiz.objects.filter(name="VacancyEditQuiz").count() == 0: self._add_vacancy_edit_quiz() print("Vacancy edit quiz has been added") # add company quiz if Quiz.objects.filter(name="CompanyQuiz").count() == 0: self._add_company_quiz() print("Company quiz has been added") def _add_start_quiz(self): quiz = Quiz(name="StartQuiz", is_required=True) q_name_surname = Question( name="name_surname", message="Як мені до тебе звертатися?", correct_answer_message="Гарно звучить 🥰", wrong_answer_message="Введи ім’я текстом 🤡", ) q_age = Question( name="age", message="Скільки тобі років?", regex="[1-9][0-9]", correct_answer_message="Ого, ми однолітки 🥰", wrong_answer_message="Вкажи свій справжній вік 🤡", ) q_school = Question( name="school", message="Де вчишся? Вибери або введи.", buttons=[ "НУЛП", "ЛНУ", "УКУ", "КПІ", "КНУ", "Ще в школі", "Вже закінчив(-ла)", ], correct_answer_message="Клас 🥰", wrong_answer_message="Введи назву текстом 🤡", ) q_study_term = Question( name="study_term", message="Який ти курс?", buttons=[ "Перший", "Другий", "Третій", "Четвертий", "На магістартурі", "Нічого з переліченого", ], allow_user_input=False, correct_answer_message="Ідеальний час, щоб будувати кар'єру 🥰", wrong_answer_message="Вибери, будь ласка, один з варіантів 🤡", ) ############## q_city = Question( name="city", message="Звідки ти? Вибери зі списку або введи назву.", buttons=["Львів", "Київ", "Новояворівськ", "Донецьк", "Стамбул"], correct_answer_message="Був-був там!", wrong_answer_message="Введи назву текстом :)", ) q_contact = Question( name="contact", message="Обміняємося контактами?", buttons=["Тримай!"], input_type="contact", correct_answer_message= "Дякую. А я залишаю тобі контакт головного організатора: @Slavkoooo 🥰", wrong_answer_message="Надішли, будь ласка, свій контакт 🤡", ) q_email = Question( name="email", message="Наостанок, вкажи адресу своєї поштової скриньки.", regex="^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$", correct_answer_message="Дякую 🥰", wrong_answer_message="Введи, будь ласка, електронну адресу 🤡", ) q_agree = Question( name="user_agreements", message="Залишилося тільки дати згоду на обробку даних.", buttons=["Я погоджуюсь."], allow_user_input=False, ) q_register_end = Question( name="end_register", message= "Хух, усі формальності позаду!\n\nЯ зареєстрував тебе на ІЯК. Далі нас очікують два дні пригод.\n\n<b>Поонлайнимо?</b> 🤓", buttons=[ "Прийду подивитися 👀", "Прийду шукати роботу 🤑", "Прийду дізнатися щось нове 🧐", "Візьму участь у воркшопах✍️", "Все разом 🤹", ], allow_user_input=False, ) quiz.questions = [ q_name_surname, q_age, q_school, q_study_term, # q_city, q_contact, q_email, q_agree, q_register_end, ] quiz.save() def _add_vacancy_quiz(self): quiz = Quiz(name="VacancyQuiz", is_required=False) ejf = self.get_ejf() q_name = Question( name="name", message="Спочатку введи назву вакансії", max_text_size=100, correct_answer_message="Гарно звучить 🥰", wrong_answer_message="Введи назву текстом 🤡", ) q_tag = Question( name="tag", message="Вибери категорію до якої відноситься вакансія", buttons=list(ejf.filters_interest), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_experience = Question( name="experience", message= "Вибери наскільки досвідченим має бути твій новий працівник!", buttons=list(ejf.filters_experience), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_employment = Question( name="employment_type", message="Вибери тип зайнятості", buttons=list(ejf.filters_employment), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_salary = Question( name="salary", message="Введи скільки зароблятиме твій працівник", max_text_size=30, buttons=["Договірно"], correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", ) q_description = Question( name="description", message= "Лишився останній штрих!\nНадішли мені стислий опис своєї вакансії, щоб кандидат міг зрозуміти, чим він буде займатись.\n\n<b>Максимум 2000 символів</b>", max_text_size=2000, correct_answer_message="Клас 🥰", wrong_answer_message= "Введи опис текстом і не більше 2000 символів 🤡", ) quiz.questions = [ q_name, q_tag, q_experience, q_employment, q_salary, q_description, ] quiz.save() def _add_vacancy_edit_quiz(self): quiz = Quiz(name="VacancyEditQuiz", is_required=False) ejf = self.get_ejf() q_tag = Question( name="tag", message="Вибери категорію до якої відноситься вакансія", buttons=list(ejf.filters_interest), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_experience = Question( name="experience", message= "Вибери наскільки досвідченим має бути твій новий працівник!", buttons=list(ejf.filters_experience), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_employment = Question( name="employment_type", message="Вибери тип зайнятості", buttons=list(ejf.filters_employment), correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", allow_user_input=False, ) q_salary = Question( name="salary", message="Введи скільки зароблятиме твій працівник", max_text_size=30, buttons=["Договірно"], correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", ) q_description = Question( name="description", message= "Лишився останній штрих!\nНадішли мені стислий опис своєї вакансії, щоб кандидат міг зрозуміти, чим він буде займатись.\n\n<b>Максимум 2000 символів</b>", max_text_size=2000, correct_answer_message="Клас 🥰", wrong_answer_message= "Введи опис текстом і не більше 2000 символів 🤡", ) quiz.questions = [ q_tag, q_experience, q_employment, q_salary, q_description, ] quiz.save() def _add_company_quiz(self): quiz = Quiz(name="CompanyQuiz", is_required=False) q_name = Question( name="name", message="Спочатку введи назву компанії", max_text_size=30, correct_answer_message="Гарно звучить 🥰", wrong_answer_message="Введи назву текстом 🤡", ) q_photo_id = Question( name="photo_id", message="Скинь фотку компанії", input_type="photo", correct_answer_message="Ого, круто 🥰", wrong_answer_message="Не треба так робити", ) q_description = Question( name="description", message="Надішли опис компанії", max_text_size=2000, correct_answer_message="Клас 🥰", wrong_answer_message= "Введи опис текстом і не більше 2000 символів 🤡", ) q_company_url = Question( name="company_url", message="Надішли посилання на сайт компанії", regex="^https:\/\/.*", correct_answer_message="Клас 🥰", wrong_answer_message= "Введи посилання яке починається на <b>https://</b>", ) quiz.questions = [q_name, q_photo_id, q_description, q_company_url] quiz.save() def reinit_ejf_table(self): # delete collections JobFair.objects.delete() Content.objects.delete() # create content table content = Content() content.start_text = ( "Йоу, друзі! Теж помітили, що останнім часом зникли запахи і їжа якось не так смакує? 😔 Усе ясно: життя без ІЯКу втратило смак.\n\n" "🌤 Нам пощастило, що до 19 травня залишилося зовсім трохи. А що там 19 травня? А там <b>повернення легендарного Інженерного ярмарку кар’єри — ІЯКу від BEST Lviv!</b>" "Але мусимо зробити камінг-аут: цього року <b>ІЯК став віртуалом.</b> 😳 Немає часу пояснювати. Ти, головне, реєструйся. Далі — більше" ) content.user_start_text = "Прив" content.user_start_photo = self.TEST_PHOTO content.ejf_start_text = ( "Я знаю, друже, що до 19 травня ще є трохи часу, тому приготував для тебе кілька корисних штук. Заходь у <b>меню</b>, читай, слідкуй за оновленнями 🧐\n\n" "Почувай себе, як вдома ☺️") content.ejf_start_photo = self.TEST_PHOTO content.save() # create ejf table ejf = JobFair() ejf.filters_interest = ["Full Stack", "Front End", "Data Science"] ejf.filters_experience = ["1 рік", "3+ років"] ejf.filters_employment = ["Full time", "Part time"] ejf.admin_password = "******" ejf.cv_archive_file_id_list = [] ejf.cv_archive_last_update = None ejf.cv_archive_size = 0 ejf.start_menu = [ SimpleButton( name="Що? 🤨", text= ("<b>Інженерний ярмарок кар’єри — коротко ІЯК — це must-visit подія для кожного студента.</b> Не лякайся слова “інженерний”, бо наш Ярмарок уже давно вийшов за будь-які рамки і навіть претендує називатися наймасштабнішим у Львові.\n\n" "У нас для цього є все:\n\n" "✅ <b>Топ-компанії</b>, які зацікавлені в студентах. Чекни розділ 'Компанії'.\n\n" "✅ Класний <b>контент</b>, який за два дні допоможе тобі нарешті відповісти на питання, ким ти хочеш стати. Ознайомся з розділом 'Розклад'.\n\n" "✅ Можливість знайти <b>роботу</b> прямо через бота, тобто через мене! Після 20 травня я оновлю меню і ти все зрозумієш.\n\n" "✅ Найкращі <b>учасники</b>. Угу, такі як ти!😌\n\n" "Останні штрихи й ІЯК 2021 стане реальністю. Ще й не простою, а віртуальною. <b>Зустрінемося на Hopin!</b>\n\n" "Па!"), photo=self.TEST_PHOTO, ), SimpleButton( name="Де і як? 🦦", text= ("Пам’ятаєш, ще на початку я казав, що ІЯК став віртуалом? Так-от, я мав на увазі, що цього року у Львівській політехніці звичного Ярмарку не буде. Не буде довгих черг, великих скупчень і хаосу. <b>Ми переїжджаємо в кращі санітарні умови... В онлайн простір!</b>✌️👩💻\n\n" "ІЯК відбудеться на платформі <b>Hopin</b>. Ти майже не відчуєш різниці між спілкуванням наживо і онлайн. На Hopin усе організовано так, як ми звикли: віртуальні стенди з компаніями, окрема кімната для презентацій та воркшопів. Є навіть сцена!\n\n" "<b>Переходь за посиланням у запрошенні і побач усе на власні очі.</b>" ), photo=self.TEST_PHOTO, ), SimpleButton( name="Компанії 📈", text="КомпаніїКомпаніїКомпанії", photo=self.TEST_PHOTO, url_link="https://ejf.best-lviv.org.ua/partners/ejfwp/", url_text="Детально про компанії", ), SimpleButton( name="Розклад 📌", text="РозкладРозкладРозклад", photo=self.TEST_PHOTO, ), SimpleButton( name="Зв'язок з нами ✍️", text= ("🙂Залишилися питання? Може, маєш важливий фідбек на цьому етапі? У такому разі напиши комусь з нас🙃\n\n" "<b>Вибирай:</b>\n\n" "<a href='https://t.me/Slavkoooo'>головний організатор Ярік</a>\n\n" "<a href='https://t.me/PogibaAnn'>відповідальна за компанії Аня</a>\n\n" "<a href='https://t.me/OnAzart'>відповідальний за компанії Назар</a>\n\n" "<a href='https://t.me/Yaroslav_Horodyskyi'>відповідальний за технічну частину Ярік</a>\n\n" "<a href='https://t.me/demberetska'>відповідальна за контент Соля</a>\n\n" "<a href='https://t.me/foxiero'>відповідальна за дизайн Софа</a>\n\n" "<a href='https://t.me/vikahbhk'>відповідальна за піар Віка</a>\n\n" "<a href='https://t.me/yarchik_5'>відповідальна за людські ресурси Ярина</a>\n\n" ), photo=self.TEST_PHOTO, ), ] ejf.content = content ejf.start_datetime = datetime(2021, 5, 19, 10, 0, 0) ejf.end_datetime = self.JOB_FAIR_END_TIME ejf.save() def update_ejf_table(self): ejf = self.get_ejf() # form paragraphs in ejf menu for btn in ejf.start_menu: btn.name = btn.name.replace("\\n", "\n") btn.text = btn.text.replace("\\n", "\n") # form paragraphs in content content = ejf.content ejf.content.start_text = content.start_text.replace("\\n", "\n") ejf.content.user_start_text = content.user_start_text.replace( "\\n", "\n") ejf.content.ejf_start_text = content.ejf_start_text.replace( "\\n", "\n") ejf.content.save() ejf.save() def update_quiz_table(self): quizes = Quiz.objects # form paragraphs in questions for quiz in quizes: for question in quiz.questions: question.message = question.message.replace("\\n", "\n") quiz.save() def get_ejf(self): return JobFair.objects.first() def get_cv_count(self) -> int: return User.objects.filter(cv_file_id__ne=None).count() def update_deleted_users(self): pass # HZ CHI TREBA def _add_test_user( self, chat_id, name, surname, username, interests=[], experience="", employment="", apply_counter=0, registration_date=None, last_update_date=None, last_interaction_date=None, hr_status=False, ): registration_date = datetime.now(tz=timezone.utc) last_interaction_date = registration_date last_update_date = registration_date User( chat_id=chat_id, name=name, surname=surname, username=username, interests=interests, experience=experience, employment=employment, apply_counter=apply_counter, registration_date=registration_date, last_update_date=last_update_date, last_interaction_date=last_interaction_date, hr_status=hr_status, ).save() def _generate_string(self, long=False): letters = string.ascii_letters if long is False: length = random.randint(10, 30) else: length = random.randint(300, 500) return "".join(random.choice(letters) for i in range(length)) def _create_telegraph_account(self): SHORT_NAME = "BEST Job Fest" AUTHOR_NAME = "BEST Lviv" AUTHOR_URL = "https://t.me/bestlviv" ejf = self.get_ejf() if ejf.telegraph_token is None: self.telegraph = Telegraph() self.telegraph.create_account(SHORT_NAME, AUTHOR_NAME, AUTHOR_URL) # save new token ejf.update(set__telegraph_token=self.telegraph.get_access_token()) ejf.save() print("New Telegraph account has been initialized") else: self.telegraph = Telegraph(ejf.telegraph_token) print("Telegraph account has been initialized")