-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4b257c5
commit f4304cf
Showing
6 changed files
with
84 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,11 +11,17 @@ or (или) | |
```python3 | ||
from yandexfreetranslate import YandexFreeTranslate | ||
yt = YandexFreeTranslate() | ||
# yt.set_proxy("socks5", "localhost", 9050, "username", "password") | ||
|
||
print(yt.translate("en", "ru", "Hello, world!")) | ||
``` | ||
Or from command line (Или из командной строки): | ||
```bash | ||
# for use socks4, socks5 or https proxy (Для использования socks4, socks5 или https proxy): | ||
export https_proxy=127.0.0.1:9050 | ||
# or (или) | ||
export https_proxy=username:[email protected]:9050 | ||
|
||
python3 yandexfreetranslate/__init__.py en ru "Hello, world!" | ||
# or (или) | ||
python3 yandexfreetranslate/__init__.py en ru in.txt | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
PySocks==1.7.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,7 +7,7 @@ | |
|
||
setup( | ||
name="yandexfreetranslate", | ||
version="1.0", | ||
version="1.1", | ||
author="alekssamos", | ||
author_email="[email protected]", | ||
url="https://github.com/alekssamos/yandexfreetranslate/", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,11 @@ | |
except ImportError: | ||
import urllib as urllibrequest | ||
import urllib as urllibparse | ||
|
||
sys.path.insert(0, os.path.dirname(__file__)) | ||
import socks | ||
try: from sockshandler import SocksiPyHandler | ||
except ImportError: from .sockshandler import SocksiPyHandler | ||
del sys.path[0] | ||
|
||
class YandexFreeTranslateError(Exception): pass | ||
|
||
|
@@ -25,19 +29,57 @@ class YandexFreeTranslate(): | |
keysuffix = "-0-0" | ||
keyfilename = os.path.join(os.path.expanduser("~"), ".YandexFreeTranslate.key") | ||
expiretime = 60*60*24*4 | ||
useProxy = False | ||
proxy_protocol = "" | ||
proxy_host = "" | ||
proxy_port = 0 | ||
proxy_username = "" | ||
proxy_password = "" | ||
def set_proxy(self, protocol, host, port, username="", password=""): | ||
self.useProxy = True | ||
self.proxy_protocol = protocol | ||
self.proxy_host = host | ||
self.proxy_port = int(port) | ||
self.proxy_username = username | ||
self.proxy_password = password | ||
|
||
def _create_opener(self): | ||
opener = urllibrequest.build_opener() | ||
if self.useProxy: | ||
if self.proxy_protocol == "socks4": | ||
opener = urllibrequest.build_opener(SocksiPyHandler(socks.SOCKS4, | ||
self.proxy_host, self.proxy_port, username=self.proxy_username, password=self.proxy_password)) | ||
if self.proxy_protocol == "socks5": | ||
opener = urllibrequest.build_opener(SocksiPyHandler(socks.SOCKS5, | ||
self.proxy_host, self.proxy_port, username=self.proxy_username, password=self.proxy_password)) | ||
return opener | ||
|
||
def _create_request(self, *ar, **kw): | ||
if len(ar) > 0 and "http" in ar[0]: url = ar[0] | ||
if "url" in kw: url = kw["url"] | ||
rq = urllibrequest.Request(*ar, **kw) | ||
if self.useProxy: | ||
if self.proxy_protocol == "http" or self.proxy_protocol == "https": | ||
fullHost = ":".join([self.proxy_host, str(self.proxy_port)]) | ||
if len(self.proxy_username) + len(self.proxy_password) > 0: | ||
fullHost = ":".join([self.proxy_username, self.proxy_password]) + "@" + fullHost | ||
rq.set_proxy(fullHost, self.proxy_protocol) | ||
rq.add_header("Host", urllibparse.urlparse(url)[1]) | ||
return rq | ||
|
||
def _sid_to_key(self, sid): | ||
splitter = "." | ||
l = [] | ||
for item in sid.split(splitter): l.append(item[::-1]) | ||
return splitter.join(l)+self.keysuffix | ||
def _parse_sid(self): | ||
req = urllibrequest.Request(self.siteurl) | ||
req = self._create_request(self.siteurl) | ||
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") | ||
page = urllibrequest.urlopen(req).read().decode("UTF8") | ||
page = self._create_opener().open(req).read().decode("UTF8") | ||
#open("page.html", "w", encoding="utf8").write(page) | ||
try: | ||
return re.search(r'''SID[\s]?[:][\s]?['"]([^'"]+)['"]''', page).group(1) | ||
|
@@ -75,7 +117,7 @@ def translate(self, source = "auto", target="", text=""): | |
else: lang = source+"-"+target | ||
p=[] | ||
for part in smartsplit(text, 500, 550): | ||
req = urllibrequest.Request(self.apibaseurl+"translate?"+urllibparse.urlencode({ | ||
req = self._create_request(self.apibaseurl+"translate?"+urllibparse.urlencode({ | ||
"id":self.key, "srv":"tr-text", "lang":lang, "reason":"paste" | ||
})) | ||
req.add_header("User-Agent", self.ua) | ||
|
@@ -101,8 +143,23 @@ def translate(self, source = "auto", target="", text=""): | |
print("usage: "+sys.argv[0]+" \t sourcelang \t targetlang \t text or file.txt \t [output_file_name.txt]") | ||
print('example: {0} "{1}" "{2}" "{3}"'.format(sys.argv[0], "en", "ru", "hello, world!")) | ||
print('example: {0} "{1}" "{2}" "{3}"'.format(sys.argv[0], "en", "ru", "in.txt")) | ||
print("\n") | ||
print("Install a proxy server: create an environment variable before calling:") | ||
print("\t export https_proxy=127.0.0.1:8080") | ||
print("\t export socks5_proxy=127.0.0.1:9050") | ||
print("\t export socks5_proxy=username:[email protected]:9050") | ||
sys.exit(0) | ||
yt = YandexFreeTranslate() | ||
for protocol in ["http", "https", "socks4", "socks5"]: | ||
if protocol in os.environ: | ||
if "@" in os.environ[protocol]: | ||
auth, hostport = os.environ[protocol].split("@") | ||
host, port = hostport.split(":") | ||
login, password = auth.split(":") | ||
else: | ||
host, port = hostport.split(":") | ||
login, password = ("", "") | ||
yt.setProxy(protocol, host, port, login, password) | ||
text = sys.argv[3] | ||
if len(text) < 150 and os.path.isfile(text): text = open(text, "r", encoding="utf8").read() | ||
tr_text = yt.translate(sys.argv[1], sys.argv[2], text) | ||
|