Skip to content

Commit

Permalink
add iOS API
Browse files Browse the repository at this point in the history
  • Loading branch information
alekssamos committed Apr 25, 2021
1 parent 3667ba5 commit 1622eb6
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 7 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@ or (или)

`python3 -m pip install yandexfreetranslate`
### Using (Использование)
> Если не работает, то при создании класса поменяйте API на "ios", по умолчанию используется "web".
> If it doesn't work, then when creating the class, change the API to "ios", use "web" by default.
```python3
from yandexfreetranslate import YandexFreeTranslate
yt = YandexFreeTranslate()
# yt = YandexFreeTranslate(api = "web")
# yt = YandexFreeTranslate(api = "ios")

# yt.set_proxy("socks5", "localhost", 9050, "username", "password")

print(yt.translate("en", "ru", "Hello, world!"))
Expand Down
2 changes: 1 addition & 1 deletion example/example1.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from yandexfreetranslate import YandexFreeTranslate
yt = YandexFreeTranslate()
yt = YandexFreeTranslate("ios")
print(yt.translate("auto", "ru", "Hello, my friend!"))

yt.set_proxy("socks5", "socks.zaborona.help", 1488)
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

setup(
name="yandexfreetranslate",
version="1.4",
version="1.5",
author="alekssamos",
author_email="[email protected]",
url="https://github.com/alekssamos/yandexfreetranslate/",
Expand Down
Binary file added tests/.coverage
Binary file not shown.
6 changes: 6 additions & 0 deletions tests/test_translate.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,19 @@ def read(self):
class yt_test_translate(unittest.TestCase):
def test_translate(self):
yt = yandexfreetranslate.YandexFreeTranslate()
self.assertTrue(yt.api, "web")
yt.set_proxy("socks5", "localhost", 9050)
self.assertTrue(yt.useProxy, True)
yt.useProxy = False
yt.set_proxy("https", "localhost", 9050)
self.assertTrue(yt.useProxy, True)
for i in range(1):
self.assertTrue(len(yt.translate("en", "ru", "hello")) > 1)
yt = yandexfreetranslate.YandexFreeTranslate(api="ios")
self.assertTrue(yt.api, "ios")
self.assertTrue(len(yt.translate("en", "ru", "hello")) > 1)
self.assertTrue(len(yt.key) > 1)


if __name__ == "__main__":
unittest.main()
23 changes: 18 additions & 5 deletions yandexfreetranslate/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class YandexFreeTranslate():
error_count = 0
siteurl = "https://translate.yandex.ru/"
apibaseurl = "https://translate.yandex.net/api/v1/tr.json/"
api=""
ua = r"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0"
key = ""
keysuffix = "-0-0"
Expand All @@ -41,6 +42,17 @@ class YandexFreeTranslate():
proxy_port = 0
proxy_username = ""
proxy_password = ""
def _getparams(self, **p):
params = {}
params["ios"] = {
"srv":"ios", "ucid":"9676696D-0B56-4F13-B4D5-4A3DA2A3344D",
"sid":"1A5A10A952AB4A3B82533F44B87EE696", "id":"1A5A10A952AB4A3B82533F44B87EE696-0-0"
}
params["web"] = {
"id":self.key, "srv":"tr-text", "reason":"paste", "options": 4
}
params[self.api].update(p)
return params[self.api]
def decode_response(self, response):
try:
res = response.decode("UTF8")
Expand Down Expand Up @@ -86,6 +98,7 @@ def _sid_to_key(self, sid):
for item in sid.split(splitter): l.append(item[::-1])
return splitter.join(l)+self.keysuffix
def _parse_sid(self):
if self.api != "web": ValueError("available only for web API. Now using "+self.api)
try:
if self.useProxy:
old_context = ssl._create_default_https_context
Expand Down Expand Up @@ -129,7 +142,9 @@ def regenerate_key(self):
os.rename(self.keyfilename, self.backfilename)
self.key = self._get_key()
return self.key
def __init__(self):
def __init__(self, api="web"):
api = api.lower()
self.api = api
if not os.path.isfile(self.keyfilename) and os.path.isfile(self.backfilename):
os.rename(self.backfilename, self.keyfilename)
def translate(self, source = "auto", target="", text=""):
Expand All @@ -149,17 +164,15 @@ def translate(self, source = "auto", target="", text=""):
else: lang = source+"-"+target
p=[]
for part in smartsplit(text, 500, 550):
req = self._create_request(self.apibaseurl+"translate?"+urllibparse.urlencode({
"id":self.key, "srv":"tr-text", "lang":lang, "reason":"paste"
}))
req = self._create_request(self.apibaseurl+"translate?"+urllibparse.urlencode(self._getparams(lang=lang)))
req.add_header("User-Agent", self.ua)
req.add_header("Accept", r"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 ")
req.add_header("Accept-Language", r"ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3")
req.add_header("DNT", "1")
req.add_header("Accept-Encoding", "gzip, deflate, br")
try:
response = self._create_opener().open(req, data = urllibparse.urlencode({
"options": 4, "text":part
"text":part
}).encode("UTF8")).read()
content = self.decode_response(response)
resp = json.loads(content)
Expand Down

0 comments on commit 1622eb6

Please sign in to comment.