-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathapp.py
124 lines (99 loc) · 4.59 KB
/
app.py
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import re
import json
import feedparser
from time import sleep
from functools import wraps
from bs4 import BeautifulSoup
from telegram.ext import Updater, CommandHandler
def get_config():
with open("config/config.json", "r") as read_file:
config = json.load(read_file)
return config
updater = Updater(get_config()["telegram_token"], use_context=True)
def restricted(func):
@wraps(func)
def wrapped(update, context, *args, **kwargs):
user_id = update.effective_user.id
chat_id = get_config()["admin_chat_id"][0]
if user_id != chat_id:
updater.bot.send_message(chat_id=chat_id, text=f'Unauthorized access denied for {user_id}')
return func(update, context, *args, **kwargs)
return wrapped
class UpworkFeed:
def __init__(self):
self.entries_list = []
self.filter_countries = get_config()['filter_countries']
self.blocked_countries = [b[1:] for b in self.filter_countries if b[0] == '!']
self.allowed_countries = [a for a in self.filter_countries if a[0] != '!']
def is_blocked_country(self, description):
if len(self.allowed_countries) != 0:
for a in self.allowed_countries:
if a.upper() not in description.upper():
return True
elif len(self.allowed_countries) == 0 and len(self.blocked_countries) != 0:
for b in self.blocked_countries:
if b.upper() in description.upper():
return True
def parsed_feed(self, url):
while True:
sleep(5)
parsed_feed = feedparser.parse(url)
if parsed_feed.status == 200:
return parsed_feed
def new_posts(self, url):
if len(self.entries_list) != 0:
new_parsed_data = self.parsed_feed(url)
new_entries_list = [v for k, v in new_parsed_data.items() if k == 'entries']
new_jobs = []
for t in new_entries_list[0]:
if t['link'] not in [t['link'] for t in self.entries_list[0]]:
new_jobs.append(t)
self.entries_list = new_entries_list
return reversed(new_jobs)
else:
parsed_data = self.parsed_feed(url)
self.entries_list = [v for k, v in parsed_data.items() if k == 'entries']
return reversed(self.entries_list[0])
def extract_url(self, description):
regex = r"((https?):((//)|(\\\\))+([\w\d:#@%/;$()~_?\+-=\\\.&](#!)?)*)"
url = re.findall(regex, description)
return [x[0] for x in url][0]
def format_msg(self, msg_list):
formated_msgs = []
for msg in msg_list:
soup = BeautifulSoup((msg['summary']), features="html.parser")
description = soup.get_text().replace('Budget', '\n\nBudget').replace('Skills:', '\n\nSkills:\n').replace('Posted On:', '\nPosted On:').replace('Category:', '\n\nCategory:').replace('Country:', '\nCountry:').replace('click to apply', msg['link'])
if len(description) >= 4096:
if not self.is_blocked_country(description):
formated_msgs.append(f"{msg['title']}\n\ndescription is too long, to see full version please visit the web site...\n{self.extract_url(description)}")
else:
if not self.is_blocked_country(description):
formated_msgs.append(f"{msg['title']}\n\n{description}")
return formated_msgs
@restricted
def start(update, context):
context.bot.send_message(chat_id=update.effective_chat.id, text='Hello\n\nto start type /feed name\n\nfor example /feed main')
@restricted
def get_feed(update, context):
if len(" ".join(context.args)) == 0:
context.bot.send_message(chat_id=update.effective_chat.id,text='To start type /feed name')
feed_name = context.args[0]
if feed_name not in [k for k in get_config().keys()]:
context.bot.send_message(chat_id=update.effective_chat.id, text='Type correct feed name!')
feed = UpworkFeed()
while True:
try:
sleep(20)
new_msg = feed.format_msg(feed.new_posts(get_config()[feed_name]))
for msg in new_msg:
sleep(5)
context.bot.send_message(chat_id=update.effective_chat.id, text=msg)
except Exception as e:
updater.bot.send_message(chat_id=get_config()["admin_chat_id"][0], text=str(e))
def main():
updater.dispatcher.add_handler(CommandHandler("start", start))
updater.dispatcher.add_handler(CommandHandler("feed", get_feed))
updater.start_polling()
# updater.idle()
if __name__ == "__main__":
main()