From 1622eb6a77309497bd650f38bfec4b0a9447bf80 Mon Sep 17 00:00:00 2001 From: alekssamos Date: Sun, 25 Apr 2021 17:27:31 +0300 Subject: [PATCH] add iOS API --- README.md | 5 +++++ example/example1.py | 2 +- setup.py | 2 +- tests/.coverage | Bin 0 -> 53248 bytes tests/test_translate.py | 6 ++++++ yandexfreetranslate/__init__.py | 23 ++++++++++++++++++----- 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 tests/.coverage diff --git a/README.md b/README.md index e23c38d..3c6666c 100644 --- a/README.md +++ b/README.md @@ -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!")) diff --git a/example/example1.py b/example/example1.py index 2830b15..5cb233a 100644 --- a/example/example1.py +++ b/example/example1.py @@ -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) diff --git a/setup.py b/setup.py index 59b4491..783cb6a 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name="yandexfreetranslate", - version="1.4", + version="1.5", author="alekssamos", author_email="aleks-samos@yandex.ru", url="https://github.com/alekssamos/yandexfreetranslate/", diff --git a/tests/.coverage b/tests/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..aea9e4f3f636629230f9f49d1229e652c12d242f GIT binary patch literal 53248 zcmeI)&2QUe90zbaPnI-kf(KOTMPJ zRzvymYx(U9t1D}(a&6`Gxm6i2lZT6vrulifB7N_g>?mKh?6#7&+q4^2XuIn&+)!!g zZlIdH$D?Jm&*Oj#QGA{=?Iy(v)jB27@omTQx8)~ldoBu)Y%Nq`pC z`mFR-OZm!es36Y8VY@k7oW1#3F<+UO&~K@zOqSoE$M`^LXhE+iXIhj{!}FV*`?_zr zjSUsdNo%)+4Uh7<6~?9YJ?CiX$+qoA#dHHZv^`gicj@5PTt6jBQ`E#-tb1o`|>&;0n1hs%y#&eYu6S_vNQf&oS z+w{fDw7Q`eeKx7`%^JOwK7Vm6UzwTFZ(WTV3iFtCI}CPb3ImO1ckz&>!|R8)8}228 zjf8tqyDhy|)MYrfj4Ov)bAO*XnqpW!cQolG0V$`?wY70(DG##V_UeOeEow1=q7Fi1 zK^m;pbsOAO0xm1Qw^t!+!JA$Xre#Z(oNDkPvD6m!cx?$9Q z`D4^PdEe8^Z=68yb81haW~1QLy=g`jMpP(x1p4V2E8}AY*;F*9nWd}0a z^y53Dlf5*8ZBAo-vl?Y3-KX&AzD9j5?N&77IF{Q?c2m6fjZ>u|pZg?lCmuT}qO4M1 z45(*5l4hD{vX%#`H2sARQE;k`)r@;N*F|57*EZB+$;CUNcdSr_wxc8mi82$lr)yRq z8@{5IvEFa+O#(j+*m>>WF2tWV=5P$## zAOHafKmY;|7(D@@XY@QD|7VSFG~;LE2jhF1!2|&aKmY;|fB*y_009U<00Izzz_S!6 zWyQ3S-kh=cvJjI?d~?FF#bdSk#ijY$l3aXqnI5m5C}+gfL~?2W_`>m5buoQ5y(8np zYN&$HGy}V7hMr0HfzVwN)j7KDBXru;kN774tZ`Q}?izm>zZ<_j%K~Cs5P$##AOHaf zKmY;|fB*y_009X6TY-|8*3+{F*)cJx^GO3SE~fP43_)gGOc&DA1AP5o7#B6;N8>iV zVS)ezAOHafKmY;|fB*y_009U^dn3!w$8%a^w4?+(;f%UAp-MsCoie-hYpSvR!X z0bQ9tkrCSVKH{0C?b>vCpQ0}5LUV>h<$C~vOMBc2z}NqU@quRiWPC|)m>>WF2tWV= z5P$##AOHafKmY;|*pI*)BG88%jPG?$AU*yU%VK*!@%oPcGfToL4B6z+&IRQcU3zYf#zivFx=z$3W5P$##AOHafKmY;|fB*y_ z0D%z{5Taa&fB%0+GyXDuG470DAyFg&KY<*b70`u<-ZGgiodSri|7&z^022ft009U<00Izz00bZa z0SG_<0;4Oy*Z*<+Kf3jcl0g6h5P$##AOHafKmY;|fB*zofPepw<9|lL1OW&@00Izz S00bZa0SG_<0uUHofqwwZa?tqz literal 0 HcmV?d00001 diff --git a/tests/test_translate.py b/tests/test_translate.py index 992519a..dd26936 100644 --- a/tests/test_translate.py +++ b/tests/test_translate.py @@ -47,6 +47,7 @@ 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 @@ -54,6 +55,11 @@ def test_translate(self): 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() diff --git a/yandexfreetranslate/__init__.py b/yandexfreetranslate/__init__.py index cde3acf..e7a1dd9 100644 --- a/yandexfreetranslate/__init__.py +++ b/yandexfreetranslate/__init__.py @@ -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" @@ -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") @@ -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 @@ -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=""): @@ -149,9 +164,7 @@ 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") @@ -159,7 +172,7 @@ def translate(self, source = "auto", target="", text=""): 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)