diff --git a/README.md b/README.md
index 27f830b..ac1f6e4 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,7 @@ Examples of API requests for different captcha types are available on the [Pytho
- [VKCaptcha](#vkcaptcha)
- [CaptchaFox](#captchafox)
- [Prosopo](#prosopo)
+ - [Temu](#temu)
- [CyberSiARA](#cybersiara)
- [Other methods](#other-methods)
- [send / get\_result](#send--get_result)
@@ -498,6 +499,19 @@ result = solver.prosopo(sitekey='5EZVvsHMrKCFKp5NYNoTyDjTjetoVo1Z4UNNb1DkVLS0Jbq
)
```
+### Temu
+
+[API method description.](https://2captcha.com/ru/2captcha-api#temucaptcha)
+
+This method can be used to solve Temu captcha. Returns a coordinates.
+
+```python
+result = solver.temu(body="data:image/png;base64,iVBORw0KG...",
+ part1="data:image/png;base64,iVBORw0KG...",
+ part2="data:image/png;base64,iVBORw0KG...",
+ part3="data:image/png;base64,iVBORw0KG...")
+```
+
### CyberSiARA
[API method description.](https://2captcha.com/2captcha-api#cybersiara)
diff --git a/examples/async/async_temu.py b/examples/async/async_temu.py
new file mode 100644
index 0000000..57a38d2
--- /dev/null
+++ b/examples/async/async_temu.py
@@ -0,0 +1,47 @@
+import asyncio
+import os
+import sys
+from base64 import b64encode
+
+import aiofiles
+
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
+
+from twocaptcha import AsyncTwoCaptcha
+
+# in this example we store the API key inside environment variables that can be set like:
+# export APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Linux or macOS
+# set APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Windows
+# you can just set the API key directly to it's value like:
+# api_key="1abc234de56fab7c89012d34e56fa7b8"
+
+api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
+
+solver = AsyncTwoCaptcha(api_key)
+
+
+async def solve_captcha():
+ # Read file and convert to base64
+ with open('../images/temu_main.png', 'rb') as f:
+ body = b64encode(f.read()).decode('utf-8')
+ with open('../images/temu_part1.png', 'rb') as f:
+ part1 = b64encode(f.read()).decode('utf-8')
+ with open('../images/temu_part2.png', 'rb') as f:
+ part2 = b64encode(f.read()).decode('utf-8')
+ with open('../images/temu_part3.png', 'rb') as f:
+ part3 = b64encode(f.read()).decode('utf-8')
+
+ try:
+ return await solver.temu(
+ body,
+ part1,
+ part2,
+ part3
+ )
+ except Exception as e:
+ sys.exit(e)
+
+
+if __name__ == '__main__':
+ result = asyncio.run(solve_captcha())
+ sys.exit('result: ' + str(result))
diff --git a/examples/images/temu_main.png b/examples/images/temu_main.png
new file mode 100644
index 0000000..e45ed92
Binary files /dev/null and b/examples/images/temu_main.png differ
diff --git a/examples/images/temu_part1.png b/examples/images/temu_part1.png
new file mode 100644
index 0000000..792f6de
Binary files /dev/null and b/examples/images/temu_part1.png differ
diff --git a/examples/images/temu_part2.png b/examples/images/temu_part2.png
new file mode 100644
index 0000000..de5a603
Binary files /dev/null and b/examples/images/temu_part2.png differ
diff --git a/examples/images/temu_part3.png b/examples/images/temu_part3.png
new file mode 100644
index 0000000..be84dba
Binary files /dev/null and b/examples/images/temu_part3.png differ
diff --git a/examples/sync/temu.py b/examples/sync/temu.py
new file mode 100644
index 0000000..72fe506
--- /dev/null
+++ b/examples/sync/temu.py
@@ -0,0 +1,38 @@
+import sys
+import os
+from base64 import b64encode
+
+sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
+
+from twocaptcha import TwoCaptcha
+
+# in this example we store the API key inside environment variables that can be set like:
+# export APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Linux or macOS
+# set APIKEY_2CAPTCHA=1abc234de56fab7c89012d34e56fa7b8 on Windows
+# you can just set the API key directly to it's value like:
+# api_key="1abc234de56fab7c89012d34e56fa7b8"
+
+api_key = os.getenv('APIKEY_2CAPTCHA', 'YOUR_API_KEY')
+
+solver = TwoCaptcha(api_key)
+
+with open('../images/temu_main.png', 'rb') as f:
+ body = b64encode(f.read()).decode('utf-8')
+with open('../images/temu_part1.png', 'rb') as f:
+ part1 = b64encode(f.read()).decode('utf-8')
+with open('../images/temu_part2.png', 'rb') as f:
+ part2 = b64encode(f.read()).decode('utf-8')
+with open('../images/temu_part3.png', 'rb') as f:
+ part3 = b64encode(f.read()).decode('utf-8')
+
+try:
+ result = solver.temu(body,
+ part1,
+ part2,
+ part3)
+
+except Exception as e:
+ sys.exit(str(e))
+
+else:
+ sys.exit('result: ' + str(result))
diff --git a/tests/async/test_async_temu.py b/tests/async/test_async_temu.py
new file mode 100644
index 0000000..fe9ee52
--- /dev/null
+++ b/tests/async/test_async_temu.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+
+import unittest
+
+try:
+ from .abstract_async import AsyncAbstractTest
+except ImportError:
+ from abstract_async import AsyncAbstractTest
+
+
+class AsyncTemuTest(AsyncAbstractTest):
+ def test_all_params(self):
+ params = {
+ 'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+ }
+
+ sends = {
+ 'method': 'temuimage',
+ 'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+ }
+
+ self.send_return(sends, self.solver.lemin, **params)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/sync/test_temu.py b/tests/sync/test_temu.py
new file mode 100644
index 0000000..070cb6c
--- /dev/null
+++ b/tests/sync/test_temu.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+
+import unittest
+
+try:
+ from .abstract import AbstractTest
+
+except ImportError:
+ from abstract import AbstractTest
+
+
+class TemuTest(AbstractTest):
+
+ def test_all_params(self):
+ params = {
+ 'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+ }
+
+ sends = {
+ 'method': 'temuimage',
+ 'body': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part1': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part2': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
+ 'part3': 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
+ }
+
+ return self.send_return(sends, self.solver.temu, **params)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/twocaptcha/async_solver.py b/twocaptcha/async_solver.py
index 1806f6e..ed04de3 100644
--- a/twocaptcha/async_solver.py
+++ b/twocaptcha/async_solver.py
@@ -897,6 +897,29 @@ async def prosopo(self, sitekey, pageurl, **kwargs):
**kwargs)
return result
+ async def temu(self, body, part1, part2, part3, **kwargs):
+ '''Wrapper for solving Temu captcha .
+
+ Parameters
+ __________
+ body : str
+ Main captcha image as a base64 string.
+ part1 : str
+ Tile element as a base64 string.
+ part2 : str
+ Tile element as a base64 string.
+ part3 : str
+ Tile element as a base64 string.
+ '''
+
+ result = await self.solve(method='temuimage',
+ body=body,
+ part1=part1,
+ part2=part2,
+ part3=part3,
+ **kwargs)
+ return result
+
async def datadome(self, captcha_url, pageurl, userAgent, proxy, **kwargs):
"""Wrapper for solving DataDome Captcha.
diff --git a/twocaptcha/solver.py b/twocaptcha/solver.py
index d186f9d..8931ad7 100755
--- a/twocaptcha/solver.py
+++ b/twocaptcha/solver.py
@@ -1027,6 +1027,29 @@ def prosopo(self, sitekey, pageurl, **kwargs):
**kwargs)
return result
+ def temu(self, body, part1, part2, part3, **kwargs):
+ '''Wrapper for solving Temu captcha .
+
+ Parameters
+ __________
+ body : str
+ Main captcha image as a base64 string.
+ part1 : str
+ Tile element as a base64 string.
+ part2 : str
+ Tile element as a base64 string.
+ part3 : str
+ Tile element as a base64 string.
+ '''
+
+ result = self.solve(method='temuimage',
+ body=body,
+ part1=part1,
+ part2=part2,
+ part3=part3,
+ **kwargs)
+ return result
+
def datadome(self, captcha_url, pageurl, userAgent, proxy, **kwargs):
"""Wrapper for solving DataDome Captcha.