Skip to content

Instantly share code, notes, and snippets.

@stek29
Last active October 31, 2018 21:43
Show Gist options
  • Save stek29/82818f1bab1ae95fd471d7c0813fe74f to your computer and use it in GitHub Desktop.
Save stek29/82818f1bab1ae95fd471d7c0813fe74f to your computer and use it in GitHub Desktop.
TDesktop link generator
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5
from Crypto.PublicKey import RSA
from base64 import urlsafe_b64encode
from requests import get
def get_version_signature(version, private_key):
signed_data = b'TelegramBeta_%x'%int(version)
digest = SHA.new()
digest.update(signed_data)
signer = PKCS1_v1_5.new(private_key)
sig = signer.sign(digest)
sig64 = urlsafe_b64encode(sig).decode().replace('-', '8').replace('_', 'B')
return sig64[19:][:32]
def format_version(v):
s = str(v)
if len(s)%3 != 0:
s = s.rjust(len(s) + 3 - len(s)%3)
blocks = []
for d3, d2, d1 in zip(*[iter(s[::-1])]*3):
blocks.append(str(int(d1+d2+d3)))
return '.'.join(blocks[::-1])
if __name__ == '__main__':
update_feed = get('http://updates.tdesktop.com/current').json()
os = input('Enter OS ({}): '.format(', '.join(update_feed))).strip()
versions = update_feed[os]
print('Available versions:')
for k, v in versions.items():
print('{}: {} ({})'.format(k, format_version(v['released']), v['released']))
vers = input('Enter version ({}): '.format(', '.join(versions))).strip()
linkcontainer = versions[vers]
installer = input('Download installer instead of update package? [Yn] ').strip().lower() != 'n'
base = 'https://updates.tdesktop.com'
link = linkcontainer['link']
def_vers_code = linkcontainer['released']
user_vers_code = input('Enter version (or empty for {}): '.format(def_vers_code))
version_code = int(user_vers_code) if user_vers_code else def_vers_code
if vers == 'alpha':
with open ('tdbeta_key.pem') as f:
private_key = RSA.importKey(f.read())
signature = get_version_signature(version_code, private_key)
if not installer:
link = link.replace('{version}', str(version_code))
if vers == 'alpha':
link = link.replace('{signature}', signature)
else:
portable = False
if os == 'win' and vers != 'alpha':
portable = input('Download portable version? [yN] ').strip().lower() == 'y'
if os != 'win':
link = '/t{}/'.format(os)
else:
link = '/tsetup/'
if vers == 'alpha':
link = link + 'tbeta{}_{}.zip'.format(version_code, signature)
else:
pretty_version = format_version(version_code)
if vers == 'beta':
pretty_version = pretty_version + '.alpha'
if os == 'win':
ext = 'exe' if not portable else 'zip'
elif 'mac' in os:
ext = 'dmg'
elif 'linux' in os:
ext = 'tar.xz'
prefix = 'tsetup' if not portable else 'tportable'
link = link + '.'.join((prefix, pretty_version, ext))
print(base + link)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment