Spaces:
Runtime error
Runtime error
initial commit
Browse files- app.py +44 -0
- common/helpers.py +28 -0
- common/tinderwrapper.py +59 -0
- config.json +5 -0
app.py
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import json
|
3 |
+
import shutil
|
4 |
+
from common.tinderwrapper import TinderWrapper
|
5 |
+
from common.helpers import create_folder, save_data
|
6 |
+
|
7 |
+
with open('config.json', 'r') as f:
|
8 |
+
config = json.load(f)
|
9 |
+
|
10 |
+
APP_NAME = config['APP_NAME']
|
11 |
+
APP_LOGO = config['APP_LOGO']
|
12 |
+
APP_DESCRIPTION = config['APP_DESCRIPTION']
|
13 |
+
|
14 |
+
def update_progress(percent, text):
|
15 |
+
progress_bar.progress(percent)
|
16 |
+
status_text.text(text)
|
17 |
+
|
18 |
+
st.set_page_config(page_title=APP_NAME)
|
19 |
+
st.title(APP_NAME)
|
20 |
+
st.image(APP_LOGO, use_column_width=True)
|
21 |
+
st.markdown(APP_DESCRIPTION)
|
22 |
+
|
23 |
+
access_token = st.text_input('Tinder Access Token', help='Токен доступа, полученный из запроса Tinder')
|
24 |
+
|
25 |
+
if st.button('Запуск'):
|
26 |
+
if not access_token:
|
27 |
+
st.error('Необходимо задать токен доступа')
|
28 |
+
progress_bar = st.progress(0)
|
29 |
+
status_text = st.empty()
|
30 |
+
wrapper = TinderWrapper(access_token)
|
31 |
+
dump_folder = 'dump'
|
32 |
+
create_folder(dump_folder)
|
33 |
+
dump = wrapper.create_dump(dump_folder)
|
34 |
+
save_data(dump)
|
35 |
+
shutil.make_archive('output.zip', 'zip', dump_folder)
|
36 |
+
with open('output.zip', 'rb') as f:
|
37 |
+
bytes_data = f.read()
|
38 |
+
st.download_button(
|
39 |
+
label='Download Zip File',
|
40 |
+
data=bytes_data,
|
41 |
+
file_name='output.zip',
|
42 |
+
mime='application/octet-stream'
|
43 |
+
)
|
44 |
+
|
common/helpers.py
ADDED
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import requests
|
2 |
+
import shutil
|
3 |
+
import os
|
4 |
+
|
5 |
+
def download_photo(url, save_path):
|
6 |
+
response = requests.get(url)
|
7 |
+
with open(save_path, 'wb') as file:
|
8 |
+
file.write(response.content)
|
9 |
+
|
10 |
+
def save_data(dump, dump_folder):
|
11 |
+
for id, value in dump.items():
|
12 |
+
folder_path = os.path.join(dump_folder, f'{value["name"]}_{id}')
|
13 |
+
os.makedirs(folder_path)
|
14 |
+
|
15 |
+
for photo_url in value['photos']:
|
16 |
+
file_name = photo_url.split("/")[-1]
|
17 |
+
save_path = os.path.join(folder_path, file_name)
|
18 |
+
download_photo(photo_url, save_path)
|
19 |
+
|
20 |
+
with open(os.path.join(folder_path, 'chat.txt'), 'w') as file:
|
21 |
+
for message in value['messages']:
|
22 |
+
name = f'[{value["name"] if message["from"] == id else "Me"}]'
|
23 |
+
file.write(f'{name}: {message["message"]}' + '\n')
|
24 |
+
|
25 |
+
def create_folder(folder_name):
|
26 |
+
if os.path.exists(folder_name):
|
27 |
+
shutil.rmtree(folder_name)
|
28 |
+
os.makedirs(folder_name)
|
common/tinderwrapper.py
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import requests
|
2 |
+
import json
|
3 |
+
|
4 |
+
class TinderWrapper():
|
5 |
+
def __init__(self, token):
|
6 |
+
self.headers = {
|
7 |
+
'Host': 'api.gotinder.com',
|
8 |
+
'persistent-device-id': '2A1756C9304C47E39CC4EB52BA002E59',
|
9 |
+
'User-Agent': 'Tinder/14.14.0 (iPhone; iOS 16.1; Scale/3.00)',
|
10 |
+
'app-session-id': '59B3E862-6B7A-4CFA-8D15-179326473F70',
|
11 |
+
'support-short-video': '1',
|
12 |
+
'x-hubble-entity-id': 'd213d4fe-239a-4583-87df-8907c6de59ad',
|
13 |
+
'app-session-time-elapsed': '2.14300799369812',
|
14 |
+
'X-Auth-Token': token,
|
15 |
+
'x-supported-image-formats': 'webp, jpeg',
|
16 |
+
'platform': 'ios',
|
17 |
+
'Connection': 'keep-alive',
|
18 |
+
'user-session-time-elapsed': '2.141390085220337',
|
19 |
+
'Accept-Language': 'ru',
|
20 |
+
'tinder-version': '14.14.0',
|
21 |
+
'Accept': 'application/json',
|
22 |
+
'app-version': '5363',
|
23 |
+
'user-session-id': 'D31F92A9-C94B-478F-A3FB-05531B18758F',
|
24 |
+
'os-version': '160000100000',
|
25 |
+
'Content-Type': 'application/json'
|
26 |
+
}
|
27 |
+
self.host = 'https://api.gotinder.com'
|
28 |
+
|
29 |
+
def get_updates(self, last_activity_date):
|
30 |
+
try:
|
31 |
+
url = self.host + '/updates'
|
32 |
+
r = requests.post(url, headers=self.headers, data=json.dumps({"last_activity_date": last_activity_date}))
|
33 |
+
return r.json()
|
34 |
+
except requests.exceptions.RequestException as e:
|
35 |
+
print(e)
|
36 |
+
|
37 |
+
def get_photos(self, person):
|
38 |
+
photos = person['photos']
|
39 |
+
photo_urls = []
|
40 |
+
for photo in photos:
|
41 |
+
photo_urls.append(photo['url'])
|
42 |
+
return photo_urls
|
43 |
+
|
44 |
+
def create_dump(self, last_activity_date='1997-03-25T22:49:41.151Z'):
|
45 |
+
updates = self.get_updates(last_activity_date)['matches']
|
46 |
+
output = {}
|
47 |
+
for update in updates:
|
48 |
+
person = update['person']
|
49 |
+
photos = self.get_photos(person)
|
50 |
+
person_id = person['_id']
|
51 |
+
name = person['name']
|
52 |
+
messages = update['messages']
|
53 |
+
output[person_id] = {
|
54 |
+
'name': name,
|
55 |
+
'messages': messages,
|
56 |
+
'photos': photos
|
57 |
+
}
|
58 |
+
|
59 |
+
return output
|
config.json
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"APP_NAME": "TinderMessagesDumper",
|
3 |
+
"APP_LOGO": "https://raw.githubusercontent.com/coqui-ai/TTS/main/images/coqui-log-green-TTS.png",
|
4 |
+
"APP_DESCRIPTION": "Утилита позволяет сформировать дамп сообщений и фотографий из переписок Tinder"
|
5 |
+
}
|