Skip to content

Commit 7bf83ee

Browse files
author
artem
committed
v1.1.0: chart, state, proxy
1 parent d1303a1 commit 7bf83ee

File tree

6 files changed

+79
-45
lines changed

6 files changed

+79
-45
lines changed

GUI/Widget.py

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from PySide2.QtCore import Slot, Qt
1+
from PySide2.QtCore import Slot, Qt, QDateTime, QSettings
22
from PySide2.QtGui import QPainter, QColor
33
from PySide2.QtCharts import QtCharts
44
from PySide2.QtWidgets import (QWidget, QTableWidget, QHBoxLayout, QTableWidgetItem,
55
QHeaderView, QLineEdit, QVBoxLayout, QPushButton)
66
from time import time
7+
from ast import literal_eval
78

89
from helpers import CONSTANTS
910
from helpers.Bridge import Bridge
@@ -15,13 +16,14 @@ def __init__(self):
1516

1617
self.row = 0
1718
self.coins_sum = 0
18-
self.define_table()
19+
self.settings = QSettings('NoneCompany', 'freebot')
1920

2021
VBoxLayout = QVBoxLayout() # Right
2122
HBoxLayout = QHBoxLayout() # Left
2223

2324
self.create_form()
2425
self.set_placeholders()
26+
self.define_table()
2527

2628
FormLayout = QHBoxLayout()
2729
FormLayout.addWidget(self.form_login)
@@ -78,6 +80,27 @@ def define_table(self):
7880
self.table.setHorizontalHeaderLabels(CONSTANTS.TABLE_COLUMNS)
7981
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
8082

83+
if self.settings.contains('key'):
84+
self.form_key.setText( self.get_settings('key') )
85+
86+
if self.settings.contains('table'):
87+
for row in literal_eval(self.get_settings('table')):
88+
self.add_account(*row, False)
89+
90+
def set_settings(self, key, value):
91+
if key == 'table':
92+
if self.settings.contains('table'):
93+
table = literal_eval(self.get_settings('table'))
94+
table.append(value)
95+
value = table
96+
else:
97+
value = [value]
98+
99+
self.settings.setValue(key, str(value))
100+
101+
def get_settings(self, key):
102+
return self.settings.value(key)
103+
81104
@Slot(int, list)
82105
def change_column_color(self, row, RGB):
83106
for col in range( len(CONSTANTS.TABLE_COLUMNS) ):
@@ -89,15 +112,16 @@ def change_column_text(self, row, text):
89112

90113
@Slot()
91114
def clear_table(self):
115+
self.settings.clear()
92116
self.table.setRowCount(0)
93117
self.row = 0
94118

95119
@Slot()
96-
def fillin_table(self):
120+
def fillin_table(self, settings=False):
97121
if self.check_form_state():
98122
return
99123

100-
self.add_account(self.form_login.text(),
124+
self.add_account(self.form_login.text(),
101125
self.form_password.text(),
102126
self.form_proxy.text())
103127

@@ -109,15 +133,17 @@ def fillin_table(self):
109133
def update_chart(self, data, init=False):
110134
self.coins_sum += data[1]
111135

136+
MStime_now = float(QDateTime.currentDateTime().toMSecsSinceEpoch())
137+
112138
if init:
113-
self.series.append(time(), self.coins_sum)
139+
self.series.append(MStime_now, self.coins_sum)
114140
for i in range(6):
115141
if i and not i % 2:
116-
self.series.append(time() + ((i / 100) + 0.000001), self.coins_sum)
142+
self.series.append(MStime_now + (i * 1), self.coins_sum)
117143
else:
118-
self.series.append(time() + ((i / 100) + 0.000001), 0.00000001)
144+
self.series.append(MStime_now + (i * 1), 0.00000001)
119145
else:
120-
self.series.append(data[0], self.coins_sum)
146+
self.series.append(MStime_now, self.coins_sum)
121147

122148
chart = QtCharts.QChart()
123149
chart.addSeries(self.series)
@@ -133,7 +159,8 @@ def update_chart(self, data, init=False):
133159
self.series.attachAxis(axisX)
134160

135161
axisY = QtCharts.QValueAxis()
136-
axisY.setLabelFormat('%i')
162+
axisY.setTickCount(5)
163+
axisY.setLabelFormat('%.8f')
137164
axisY.setTitleText('coins')
138165
chart.addAxis(axisY, Qt.AlignLeft)
139166
self.series.attachAxis(axisY)
@@ -143,9 +170,12 @@ def update_chart(self, data, init=False):
143170
@Slot()
144171
def init_threads(self):
145172
self.start_button.setEnabled(False)
173+
self.set_settings('key', self.form_key.text())
174+
146175
self.threads = [Bridge(self, row,
147176
self.table.item(row, 0).text(),
148177
self.table.item(row, 1).text(),
178+
self.table.item(row, 2).text(),
149179
self.form_key.text())
150180
for row in range(self.table.rowCount())]
151181

@@ -154,12 +184,16 @@ def check_form_state(self):
154184
or not self.form_password.text() \
155185
or not self.form_proxy.text()
156186

157-
def add_account(self, login, password, proxy):
187+
def add_account(self, login, password, proxy, record=True):
158188
self.table.insertRow(self.row)
159189

160190
self.table.setItem(self.row, 0, QTableWidgetItem(login))
161191
self.table.setItem(self.row, 1, QTableWidgetItem(password))
162192
self.table.setItem(self.row, 2, QTableWidgetItem(proxy))
163193
self.table.setItem(self.row, 3, QTableWidgetItem('?'))
164194

195+
if record:
196+
self.set_settings('key', self.form_key.text())
197+
self.set_settings('table', [login, password, proxy])
198+
165199
self.row += 1

freebitcoin/API.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,28 @@
99

1010

1111
class API:
12-
def __init__(self, login, password, key):
12+
def __init__(self, login, password, proxy, api_key):
1313
self.session = requests.Session()
1414
self.session.headers.update({
1515
'user-agent': CONSTANTS.USER_AGENT
1616
})
1717

18-
self.key = key
18+
self.captcha_key = api_key
19+
20+
self.update_proxy(proxy)
1921
self.parse_token()
2022
self.auth(login, password)
2123

2224
def parse_token(self):
2325
with self.session as s:
24-
r = s.get('https://freebitco.in/?op=signup_page')
25-
r.raise_for_status()
26-
27-
self.csrf_token = r.cookies.get('csrf_token')
26+
self.csrf_token = s.get('https://freebitco.in/?op=signup_page').cookies.get('csrf_token')
2827

2928
def parse_hash(self, token):
3029
with self.session as s:
31-
r = s.get(f'https://freebitco.in/cgi-bin/fp_check.pl?s={token}&csrf_token={self.csrf_token}', headers={
30+
return s.get(f'https://freebitco.in/cgi-bin/fp_check.pl?s={token}&csrf_token={self.csrf_token}', headers={
3231
'x-csrf-token': self.csrf_token,
3332
'X-Requested-With': 'XMLHttpRequest'
34-
})
35-
r.raise_for_status()
36-
37-
return r.text
33+
}).text
3834

3935
def auth(self, login, password):
4036
with self.session as s:
@@ -48,7 +44,6 @@ def auth(self, login, password):
4844
'btc_address': login,
4945
'password': password
5046
})
51-
r.raise_for_status()
5247

5348
try:
5449
for cookie in [requests.cookies.create_cookie(name, value, domain='freebitco.in', path='/')
@@ -64,7 +59,6 @@ def auth(self, login, password):
6459
def create_data(self) -> dict:
6560
with self.session as s:
6661
r = s.get('https://freebitco.in')
67-
r.raise_for_status()
6862

6963
soup = BeautifulSoup(r.text, 'html.parser')
7064

@@ -85,18 +79,15 @@ def create_data(self) -> dict:
8579

8680
data[token_key1] = token_val1
8781
data[token_key2] = token_val2
88-
data['g_recaptcha_response'] = RucaptchaAPI.solve_captcha(self.key)
82+
data['g_recaptcha_response'] = RucaptchaAPI.solve_captcha(self.captcha_key)
8983

9084
return data
9185

9286
def parse_coins(self):
9387
with self.session as s:
9488
r = s.get('https://freebitco.in/?op=home')
95-
r.raise_for_status()
9689

97-
soup = BeautifulSoup(r.text, 'html.parser')
98-
99-
return soup.find(id='balance_small').text
90+
return BeautifulSoup(r.text, 'html.parser').find(id='balance_small').text
10091

10192
def collect_coins(self, data) -> tuple:
10293
with self.session as s:
@@ -105,6 +96,16 @@ def collect_coins(self, data) -> tuple:
10596
'x-csrf-token': self.csrf_token,
10697
'x-requested-with': 'XMLHttpRequest'
10798
}, data=data)
108-
r.raise_for_status()
10999

110-
return (r.text.split(':')[2], r.text.split(':')[3])
100+
result = r.text.split(':')
101+
102+
if len(result) < 4:
103+
raise ValueError(f'{r.text}')
104+
105+
return (result[2], result[3])
106+
107+
def update_proxy(self, proxy):
108+
if not proxy == '-':
109+
self.session.proxies.update({
110+
proxy.split('://')[0]: proxy
111+
})

freebitcoin/User.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ class User(QObject):
1111
signal_update_column_text = Signal(int, str)
1212
signal_update_chart = Signal(list)
1313

14-
def __init__(self, index, login, password, key):
14+
def __init__(self, index, login, password, proxy, key):
1515
QObject.__init__(self)
1616

1717
self.key = key
1818
self.index = index
1919
self.login = login
2020
self.password = password
21+
self.proxy = proxy
2122

2223
def alert_user(self, success):
2324
self.signal_update_column_color.emit(self.index, [20, 200, 20] if success else [200, 20, 20])
@@ -30,7 +31,7 @@ def update_balance(self, balance):
3031

3132
def run(self):
3233
try:
33-
self.api = API(self.login, self.password, self.key)
34+
self.api = API(self.login, self.password, self.proxy, self.key)
3435
self.update_balance( self.api.parse_coins() )
3536
self.alert_user(True)
3637

helpers/Bridge.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44

55

66
class Bridge(QObject):
7-
def __init__(self, widget, index, login, password, key):
7+
def __init__(self, widget, index, login, password, proxy, key):
88
QObject.__init__(self)
99

1010
self.thread = QThread()
11-
self.user = User(index, login, password, key)
11+
self.user = User(index, login, password, proxy, key)
1212
self.user.moveToThread(self.thread)
13+
self.init_signal_connections(widget)
14+
self.thread.started.connect(self.user.run)
15+
self.thread.start()
16+
17+
def init_signal_connections(self, widget):
1318
self.user.signal_update_column_color.connect(widget.change_column_color)
1419
self.user.signal_update_column_text.connect(widget.change_column_text)
15-
self.user.signal_update_chart.connect(widget.update_chart)
16-
self.thread.started.connect(self.user.run)
17-
self.thread.start()
20+
self.user.signal_update_chart.connect(widget.update_chart)

helpers/CONSTANTS.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
APP_VERSION = '1.0.1'
1+
APP_VERSION = '1.1.0'
22
APP_NAME = 'freebot'
33

44
TABLE_COLUMNS = ['Login', 'Password', 'Proxy', 'Balance']

helpers/RucaptchaAPI.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,9 @@ def solve_captcha(cls, key, interval=10):
1515
'googlekey': CONSTANTS.CAPTHCA_KEY,
1616
'pageurl': CONSTANTS.CAPTCHA_DOMAIN
1717
})
18-
r.raise_for_status()
1918

20-
id = r.json()['request']
21-
22-
while True:
23-
sleep(interval)
24-
answer = cls.get_answer(key, id)
19+
while sleep(interval) or True:
20+
answer = cls.get_answer(key, r.json()['request'])
2521
if int(answer['status']) == 1:
2622
return answer['request']
2723

@@ -30,6 +26,5 @@ def get_answer(key, id):
3026
r = rq.get('https://rucaptcha.com/res.php', params={
3127
'json': '1', 'key': key, 'action': 'get', 'id': id
3228
})
33-
r.raise_for_status()
3429

3530
return r.json()

0 commit comments

Comments
 (0)