Skip to content

Commit 4acf619

Browse files
committed
added Temu captcha
Signed-off-by: Maxim S <[email protected]>
1 parent ab0e37d commit 4acf619

File tree

11 files changed

+211
-0
lines changed

11 files changed

+211
-0
lines changed

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Examples of API requests for different captcha types are available on the [Pytho
4646
- [VKCaptcha](#vkcaptcha)
4747
- [CaptchaFox](#captchafox)
4848
- [Prosopo](#prosopo)
49+
- [Temu](#temu)
4950
- [CyberSiARA](#cybersiara)
5051
- [Other methods](#other-methods)
5152
- [send / get\_result](#send--get_result)
@@ -498,6 +499,19 @@ result = solver.prosopo(sitekey='5EZVvsHMrKCFKp5NYNoTyDjTjetoVo1Z4UNNb1DkVLS0Jbq
498499
)
499500
```
500501

502+
### Temu
503+
504+
<sup>[API method description.](https://2captcha.com/ru/2captcha-api#temucaptcha)</sup>
505+
506+
This method can be used to solve Temu captcha. Returns a coordinates.
507+
508+
```python
509+
result = solver.temu(body="data:image/png;base64,iVBORw0KG...",
510+
part1="data:image/png;base64,iVBORw0KG...",
511+
part2="data:image/png;base64,iVBORw0KG...",
512+
part3="data:image/png;base64,iVBORw0KG...")
513+
```
514+
501515
### CyberSiARA
502516

503517
<sup>[API method description.](https://2captcha.com/2captcha-api#cybersiara)</sup>

examples/async/async_temu.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import asyncio
2+
import os
3+
import sys
4+
from base64 import b64encode
5+
6+
import aiofiles
7+
8+
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
9+
10+
from twocaptcha import AsyncTwoCaptcha
11+
12+
# in this example we store the API key inside environment variables that can be set like:
13+
# export APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Linux or macOS
14+
# set APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Windows
15+
# you can just set the API key directly to it's value like:
16+
# api_key="1abc234de56fab7c89012d34e56fa7b8"
17+
18+
api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
19+
20+
solver = AsyncTwoCaptcha(api_key)
21+
22+
23+
async def solve_captcha():
24+
# Read file and convert to base64
25+
with open('../images/temu_main.png', 'rb') as f:
26+
body = b64encode(f.read()).decode('utf-8')
27+
with open('../images/temu_part1.png', 'rb') as f:
28+
part1 = b64encode(f.read()).decode('utf-8')
29+
with open('../images/temu_part2.png', 'rb') as f:
30+
part2 = b64encode(f.read()).decode('utf-8')
31+
with open('../images/temu_part3.png', 'rb') as f:
32+
part3 = b64encode(f.read()).decode('utf-8')
33+
34+
try:
35+
return await solver.temu(
36+
body,
37+
part1,
38+
part2,
39+
part3
40+
)
41+
except Exception as e:
42+
sys.exit(e)
43+
44+
45+
if __name__ == '__main__':
46+
result = asyncio.run(solve_captcha())
47+
sys.exit('result: ' + str(result))

examples/images/temu_main.png

819 KB
Loading

examples/images/temu_part1.png

15.9 KB
Loading

examples/images/temu_part2.png

16.5 KB
Loading

examples/images/temu_part3.png

8.27 KB
Loading

examples/sync/temu.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import sys
2+
import os
3+
from base64 import b64encode
4+
5+
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
6+
7+
from twocaptcha import TwoCaptcha
8+
9+
# in this example we store the API key inside environment variables that can be set like:
10+
# export APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Linux or macOS
11+
# set APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Windows
12+
# you can just set the API key directly to it's value like:
13+
# api_key="1abc234de56fab7c89012d34e56fa7b8"
14+
15+
api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
16+
17+
solver = TwoCaptcha(api_key)
18+
19+
with open('../images/temu_main.png', 'rb') as f:
20+
body = b64encode(f.read()).decode('utf-8')
21+
with open('../images/temu_part1.png', 'rb') as f:
22+
part1 = b64encode(f.read()).decode('utf-8')
23+
with open('../images/temu_part2.png', 'rb') as f:
24+
part2 = b64encode(f.read()).decode('utf-8')
25+
with open('../images/temu_part3.png', 'rb') as f:
26+
part3 = b64encode(f.read()).decode('utf-8')
27+
28+
try:
29+
result = solver.temu(body,
30+
part1,
31+
part2,
32+
part3)
33+
34+
except Exception as e:
35+
sys.exit(str(e))
36+
37+
else:
38+
sys.exit('result: ' + str(result))

tests/async/test_async_temu.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env python3
2+
3+
import unittest
4+
5+
try:
6+
from .abstract_async import AsyncAbstractTest
7+
except ImportError:
8+
from abstract_async import AsyncAbstractTest
9+
10+
11+
class AsyncTemuTest(AsyncAbstractTest):
12+
def test_all_params(self):
13+
params = {
14+
'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
15+
'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
16+
'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
17+
'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
18+
}
19+
20+
sends = {
21+
'method': 'temuimage',
22+
'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
23+
'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
24+
'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
25+
'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
26+
}
27+
28+
self.send_return(sends, self.solver.lemin, **params)
29+
30+
31+
if __name__ == '__main__':
32+
unittest.main()

tests/sync/test_temu.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python3
2+
3+
import unittest
4+
5+
try:
6+
from .abstract import AbstractTest
7+
8+
except ImportError:
9+
from abstract import AbstractTest
10+
11+
12+
class TemuTest(AbstractTest):
13+
14+
def test_all_params(self):
15+
params = {
16+
'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
17+
'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
18+
'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
19+
'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
20+
}
21+
22+
sends = {
23+
'method': 'temuimage',
24+
'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
25+
'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
26+
'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
27+
'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
28+
}
29+
30+
return self.send_return(sends, self.solver.temu, **params)
31+
32+
33+
if __name__ == '__main__':
34+
unittest.main()

twocaptcha/async_solver.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,29 @@ async def prosopo(self, sitekey, pageurl, **kwargs):
897897
**kwargs)
898898
return result
899899

900+
async def temu(self, body, part1, part2, part3, **kwargs):
901+
'''Wrapper for solving Temu captcha .
902+
903+
Parameters
904+
__________
905+
body : str
906+
Main captcha image as a base64 string.
907+
part1 : str
908+
Tile element as a base64 string.
909+
part2 : str
910+
Tile element as a base64 string.
911+
part3 : str
912+
Tile element as a base64 string.
913+
'''
914+
915+
result = await self.solve(method='temuimage',
916+
body=body,
917+
part1=part1,
918+
part2=part2,
919+
part3=part3,
920+
**kwargs)
921+
return result
922+
900923
async def datadome(self, captcha_url, pageurl, userAgent, proxy, **kwargs):
901924
"""Wrapper for solving DataDome Captcha.
902925

0 commit comments

Comments
 (0)