-
Notifications
You must be signed in to change notification settings - Fork 0
/
captcha.py
157 lines (121 loc) · 4.91 KB
/
captcha.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import requests
from time import sleep
#from svglib.svglib import svg2rlg
#from reportlab.graphics import renderPM
import base64
import smtplib
import ssl
#from email import encoders
#from email.mime.base import MIMEBase
#from email.mime.multipart import MIMEMultipart
#from email.mime.text import MIMEText
try:
import polyinterface
except ImportError:
import pgc_interface as polyinterface
PG_CLOUD_ONLY = True
LOGGER = polyinterface.LOGGER
# It goes to say this work takes effort so please use my referral to support my work
# https://2captcha.com?from=12244449
# The link above allows you to create a acount with 2captcha
CAPTCHA_ENABLE = True
def getCaptcha(headers, cookies):
# Captcha is session based so use the same headers
LOGGER.debug('Getting captcha')
try:
catpcha = requests.get('https://auth.tesla.com/captcha', headers=headers, cookies=cookies)
# Save captch as .png image to send 2Captcha service locally
file = open('captcha.svg', 'wb')
file.write(catpcha.content)
file.close()
drawing = svg2rlg('captcha.svg')
renderPM.drawToFile(drawing, 'captcha.png', fmt='PNG')
return('captcha.png')
except Exception as e:
LOGGER.error('Exception getCaptcha: '+ str(e))
def solveCaptcha(captchaFile, captchaApiKey):
# Encode image base 64
with open(captchaFile, 'rb') as image_file:
encoded_string = base64.b64encode(image_file.read())
# Now use the image file saved locally to post to captcha service and wait for response
# here we post site key to 2captcha to get captcha ID (and we parse it here too)
current_url = 'http://2captcha.com/in.php'
data = {
'key': captchaApiKey,
'method': 'base64',
'body': encoded_string,
'regsense': 1,
'textinstructions': 'text',
}
#files = open(captchaFile, 'rb')
resp = requests.post(current_url, data=data)
if 'OK' in resp.text:
captcha_id = resp.text.split('|',1)[1]
else:
LOGGER.error('error posting captcha')
return(None)
# Change data to be getting the answer from 2captcha
data = {
'key': captchaApiKey,
'action': 'get',
'id': captcha_id
}
answer_url = 'http://2captcha.com/res.php'
resp = requests.get(answer_url, params=data)
captcha_answer = resp.text
while 'CAPCHA_NOT_READY' in captcha_answer:
sleep(5)
resp = requests.get(answer_url, params=data)
captcha_answer = resp.text
#print (captcha_answer)
if 'OK' in captcha_answer:
captcha_answer = captcha_answer.split('|',1)[1]
else:
LOGGER.error('error getting captcha answer')
return(None)
LOGGER.info('captcha = '+ captcha_answer)
return (captcha_answer)
# if captcha not enabled just return empty string
def sendEmailCaptcha(captchaFile, email):
subject = 'Please solve captcha image'
body = 'This is an email with captcha image from TeslaPowerWall login. Input data to polisy CONFIGURATION'
sender_email = '[email protected]'
receiver_email = email
password = 'isy123ISY!@#'
# Create a multipart message and set headers
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = subject
#message["Bcc"] = receiver_email # Recommended for mass emails
# Add body to email
message.attach(MIMEText(body, 'plain'))
filename = captchaFile # In same directory as script
# Open PDF file in binary mode
with open(filename, 'rb') as attachment:
# Add file as application/octet-stream
# Email client can usually download this automatically as attachment
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
# Encode file in ASCII characters to send by email
encoders.encode_base64(part)
# Add header as key/value pair to attachment part
part.add_header(
'Content-Disposition',
f'attachment; filename= {filename}',
)
# Add attachment to message and convert message to string
message.attach(part)
text = message.as_string()
# Log in to server using secure context and send email
context = ssl.create_default_context()
try:
with smtplib.SMTP('smtp-mail.outlook.com', 587) as smtp:
smtp.ehlo() # Say EHLO to server
smtp.starttls(context=context) # Puts the connection in TLS mode.
smtp.ehlo()
smtp.login(sender_email, password)
smtp.sendmail(sender_email, receiver_email, text)
LOGGER.info('captcha email sent')
except Exception as e:
LOGGER.error('Exception sendEmailCaptcha: ' + str(e))