Revert "Created branch develop"
This commit is contained in:
@@ -14,11 +14,11 @@ import time
|
||||
import urllib
|
||||
|
||||
from cache import Cache
|
||||
from core import logger
|
||||
from dispatcher import Dispatcher
|
||||
from file import File
|
||||
from handler import Handler
|
||||
from monitor import Monitor
|
||||
from platformcode import logger
|
||||
from resume_data import ResumeData
|
||||
from server import Server
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import StringIO
|
||||
import binascii
|
||||
import hashlib
|
||||
import base64
|
||||
import os
|
||||
import binascii
|
||||
import StringIO
|
||||
from array import array
|
||||
|
||||
|
||||
@@ -28,7 +30,7 @@ def evpKDF(passwd, salt, key_size=8, iv_size=4, iterations=1, hash_algorithm="md
|
||||
|
||||
derived_bytes += block[0: min(len(block), (target_key_size - number_of_derived_words) * 4)]
|
||||
|
||||
number_of_derived_words += len(block) / 4
|
||||
number_of_derived_words += len(block)/4
|
||||
|
||||
return {
|
||||
"key": derived_bytes[0: key_size * 4],
|
||||
@@ -61,7 +63,6 @@ class PKCS7Encoder(object):
|
||||
padding method is well-defined if and only if k < 256;
|
||||
methods for larger k are an open issue for further study.
|
||||
'''
|
||||
|
||||
def __init__(self, k=16):
|
||||
self.k = k
|
||||
|
||||
@@ -97,12 +98,11 @@ class PKCS7Encoder(object):
|
||||
# http://www.python.org/dev/peps/pep-0272/
|
||||
MODE_ECB = 1
|
||||
MODE_CBC = 2
|
||||
# MODE_CTR = 6
|
||||
#MODE_CTR = 6
|
||||
|
||||
block_size = 16
|
||||
key_size = None
|
||||
|
||||
|
||||
def new(key, mode, IV=None):
|
||||
if mode == MODE_ECB:
|
||||
return ECBMode(AES(key))
|
||||
@@ -114,7 +114,6 @@ def new(key, mode, IV=None):
|
||||
else:
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
#### AES cipher implementation
|
||||
|
||||
class AES(object):
|
||||
@@ -185,7 +184,7 @@ class AES(object):
|
||||
exkey.extend(word)
|
||||
|
||||
# Last key expansion cycle always finishes here
|
||||
if len(exkey) >= (self.rounds + 1) * self.block_size:
|
||||
if len(exkey) >= (self.rounds+1) * self.block_size:
|
||||
break
|
||||
|
||||
# Special substitution step for 256-bit key
|
||||
@@ -214,7 +213,7 @@ class AES(object):
|
||||
for i in xrange(16):
|
||||
block[i] ^= exkey[offset + i]
|
||||
|
||||
# print 'AddRoundKey:', block
|
||||
#print 'AddRoundKey:', block
|
||||
|
||||
def sub_bytes(self, block, sbox):
|
||||
"""SubBytes step, apply S-box to all bytes
|
||||
@@ -226,7 +225,7 @@ class AES(object):
|
||||
for i in xrange(16):
|
||||
block[i] = sbox[block[i]]
|
||||
|
||||
# print 'SubBytes :', block
|
||||
#print 'SubBytes :', block
|
||||
|
||||
def shift_rows(self, b):
|
||||
"""ShiftRows step. Shifts 2nd row to left by 1, 3rd row by 2, 4th row by 3
|
||||
@@ -240,20 +239,20 @@ class AES(object):
|
||||
3 7 11 15 -> 15 3 7 11 -- shifted by 3
|
||||
"""
|
||||
|
||||
b[1], b[5], b[9], b[13] = b[5], b[9], b[13], b[1]
|
||||
b[2], b[6], b[10], b[14] = b[10], b[14], b[2], b[6]
|
||||
b[3], b[7], b[11], b[15] = b[15], b[3], b[7], b[11]
|
||||
b[1], b[5], b[ 9], b[13] = b[ 5], b[ 9], b[13], b[ 1]
|
||||
b[2], b[6], b[10], b[14] = b[10], b[14], b[ 2], b[ 6]
|
||||
b[3], b[7], b[11], b[15] = b[15], b[ 3], b[ 7], b[11]
|
||||
|
||||
# print 'ShiftRows :', b
|
||||
#print 'ShiftRows :', b
|
||||
|
||||
def shift_rows_inv(self, b):
|
||||
"""Similar to shift_rows above, but performed in inverse for decryption."""
|
||||
|
||||
b[5], b[9], b[13], b[1] = b[1], b[5], b[9], b[13]
|
||||
b[10], b[14], b[2], b[6] = b[2], b[6], b[10], b[14]
|
||||
b[15], b[3], b[7], b[11] = b[3], b[7], b[11], b[15]
|
||||
b[ 5], b[ 9], b[13], b[ 1] = b[1], b[5], b[ 9], b[13]
|
||||
b[10], b[14], b[ 2], b[ 6] = b[2], b[6], b[10], b[14]
|
||||
b[15], b[ 3], b[ 7], b[11] = b[3], b[7], b[11], b[15]
|
||||
|
||||
# print 'ShiftRows :', b
|
||||
#print 'ShiftRows :', b
|
||||
|
||||
def mix_columns(self, block):
|
||||
"""MixColumns step. Mixes the values in each column"""
|
||||
@@ -267,22 +266,22 @@ class AES(object):
|
||||
for i in xrange(4):
|
||||
col = i * 4
|
||||
|
||||
# v0, v1, v2, v3 = block[col : col+4]
|
||||
#v0, v1, v2, v3 = block[col : col+4]
|
||||
v0, v1, v2, v3 = (block[col], block[col + 1], block[col + 2],
|
||||
block[col + 3])
|
||||
|
||||
block[col] = mul_by_2[v0] ^ v3 ^ v2 ^ mul_by_3[v1]
|
||||
block[col + 1] = mul_by_2[v1] ^ v0 ^ v3 ^ mul_by_3[v2]
|
||||
block[col + 2] = mul_by_2[v2] ^ v1 ^ v0 ^ mul_by_3[v3]
|
||||
block[col + 3] = mul_by_2[v3] ^ v2 ^ v1 ^ mul_by_3[v0]
|
||||
block[col ] = mul_by_2[v0] ^ v3 ^ v2 ^ mul_by_3[v1]
|
||||
block[col+1] = mul_by_2[v1] ^ v0 ^ v3 ^ mul_by_3[v2]
|
||||
block[col+2] = mul_by_2[v2] ^ v1 ^ v0 ^ mul_by_3[v3]
|
||||
block[col+3] = mul_by_2[v3] ^ v2 ^ v1 ^ mul_by_3[v0]
|
||||
|
||||
# print 'MixColumns :', block
|
||||
#print 'MixColumns :', block
|
||||
|
||||
def mix_columns_inv(self, block):
|
||||
"""Similar to mix_columns above, but performed in inverse for decryption."""
|
||||
|
||||
# Cache global multiplication tables (see below)
|
||||
mul_9 = gf_mul_by_9
|
||||
mul_9 = gf_mul_by_9
|
||||
mul_11 = gf_mul_by_11
|
||||
mul_13 = gf_mul_by_13
|
||||
mul_14 = gf_mul_by_14
|
||||
@@ -294,14 +293,14 @@ class AES(object):
|
||||
|
||||
v0, v1, v2, v3 = (block[col], block[col + 1], block[col + 2],
|
||||
block[col + 3])
|
||||
# v0, v1, v2, v3 = block[col:col+4]
|
||||
#v0, v1, v2, v3 = block[col:col+4]
|
||||
|
||||
block[col] = mul_14[v0] ^ mul_9[v3] ^ mul_13[v2] ^ mul_11[v1]
|
||||
block[col + 1] = mul_14[v1] ^ mul_9[v0] ^ mul_13[v3] ^ mul_11[v2]
|
||||
block[col + 2] = mul_14[v2] ^ mul_9[v1] ^ mul_13[v0] ^ mul_11[v3]
|
||||
block[col + 3] = mul_14[v3] ^ mul_9[v2] ^ mul_13[v1] ^ mul_11[v0]
|
||||
block[col ] = mul_14[v0] ^ mul_9[v3] ^ mul_13[v2] ^ mul_11[v1]
|
||||
block[col+1] = mul_14[v1] ^ mul_9[v0] ^ mul_13[v3] ^ mul_11[v2]
|
||||
block[col+2] = mul_14[v2] ^ mul_9[v1] ^ mul_13[v0] ^ mul_11[v3]
|
||||
block[col+3] = mul_14[v3] ^ mul_9[v2] ^ mul_13[v1] ^ mul_11[v0]
|
||||
|
||||
# print 'MixColumns :', block
|
||||
#print 'MixColumns :', block
|
||||
|
||||
def encrypt_block(self, block):
|
||||
"""Encrypts a single block. This is the main AES function"""
|
||||
@@ -329,7 +328,7 @@ class AES(object):
|
||||
self.add_round_key(block, self.rounds)
|
||||
|
||||
# count rounds down from 15 ... 1
|
||||
for round in xrange(self.rounds - 1, 0, -1):
|
||||
for round in xrange(self.rounds-1, 0, -1):
|
||||
self.shift_rows_inv(block)
|
||||
self.sub_bytes(block, aes_inv_sbox)
|
||||
self.add_round_key(block, round)
|
||||
@@ -364,9 +363,9 @@ class ECBMode(object):
|
||||
data = array('B', data)
|
||||
|
||||
for offset in xrange(0, len(data), block_size):
|
||||
block = data[offset: offset + block_size]
|
||||
block = data[offset : offset+block_size]
|
||||
block_func(block)
|
||||
data[offset: offset + block_size] = block
|
||||
data[offset : offset+block_size] = block
|
||||
|
||||
return data.tostring()
|
||||
|
||||
@@ -380,7 +379,6 @@ class ECBMode(object):
|
||||
|
||||
return self.ecb(data, self.cipher.decrypt_block)
|
||||
|
||||
|
||||
#### CBC mode
|
||||
|
||||
class CBCMode(object):
|
||||
@@ -409,14 +407,14 @@ class CBCMode(object):
|
||||
IV = self.IV
|
||||
|
||||
for offset in xrange(0, len(data), block_size):
|
||||
block = data[offset: offset + block_size]
|
||||
block = data[offset : offset+block_size]
|
||||
|
||||
# Perform CBC chaining
|
||||
for i in xrange(block_size):
|
||||
block[i] ^= IV[i]
|
||||
|
||||
self.cipher.encrypt_block(block)
|
||||
data[offset: offset + block_size] = block
|
||||
data[offset : offset+block_size] = block
|
||||
IV = block
|
||||
|
||||
self.IV = IV
|
||||
@@ -433,24 +431,23 @@ class CBCMode(object):
|
||||
IV = self.IV
|
||||
|
||||
for offset in xrange(0, len(data), block_size):
|
||||
ctext = data[offset: offset + block_size]
|
||||
ctext = data[offset : offset+block_size]
|
||||
block = ctext[:]
|
||||
self.cipher.decrypt_block(block)
|
||||
|
||||
# Perform CBC chaining
|
||||
# for i in xrange(block_size):
|
||||
#for i in xrange(block_size):
|
||||
# data[offset + i] ^= IV[i]
|
||||
for i in xrange(block_size):
|
||||
block[i] ^= IV[i]
|
||||
data[offset: offset + block_size] = block
|
||||
data[offset : offset+block_size] = block
|
||||
|
||||
IV = ctext
|
||||
# data[offset : offset+block_size] = block
|
||||
#data[offset : offset+block_size] = block
|
||||
|
||||
self.IV = IV
|
||||
return data.tostring()
|
||||
|
||||
|
||||
####
|
||||
|
||||
def galois_multiply(a, b):
|
||||
@@ -466,12 +463,11 @@ def galois_multiply(a, b):
|
||||
|
||||
return p & 0xff
|
||||
|
||||
|
||||
# Precompute the multiplication tables for encryption
|
||||
gf_mul_by_2 = array('B', [galois_multiply(x, 2) for x in range(256)])
|
||||
gf_mul_by_3 = array('B', [galois_multiply(x, 3) for x in range(256)])
|
||||
gf_mul_by_2 = array('B', [galois_multiply(x, 2) for x in range(256)])
|
||||
gf_mul_by_3 = array('B', [galois_multiply(x, 3) for x in range(256)])
|
||||
# ... for decryption
|
||||
gf_mul_by_9 = array('B', [galois_multiply(x, 9) for x in range(256)])
|
||||
gf_mul_by_9 = array('B', [galois_multiply(x, 9) for x in range(256)])
|
||||
gf_mul_by_11 = array('B', [galois_multiply(x, 11) for x in range(256)])
|
||||
gf_mul_by_13 = array('B', [galois_multiply(x, 13) for x in range(256)])
|
||||
gf_mul_by_14 = array('B', [galois_multiply(x, 14) for x in range(256)])
|
||||
@@ -485,45 +481,45 @@ gf_mul_by_14 = array('B', [galois_multiply(x, 14) for x in range(256)])
|
||||
# More information: http://en.wikipedia.org/wiki/Rijndael_S-box
|
||||
|
||||
aes_sbox = array('B',
|
||||
'637c777bf26b6fc53001672bfed7ab76'
|
||||
'ca82c97dfa5947f0add4a2af9ca472c0'
|
||||
'b7fd9326363ff7cc34a5e5f171d83115'
|
||||
'04c723c31896059a071280e2eb27b275'
|
||||
'09832c1a1b6e5aa0523bd6b329e32f84'
|
||||
'53d100ed20fcb15b6acbbe394a4c58cf'
|
||||
'd0efaafb434d338545f9027f503c9fa8'
|
||||
'51a3408f929d38f5bcb6da2110fff3d2'
|
||||
'cd0c13ec5f974417c4a77e3d645d1973'
|
||||
'60814fdc222a908846eeb814de5e0bdb'
|
||||
'e0323a0a4906245cc2d3ac629195e479'
|
||||
'e7c8376d8dd54ea96c56f4ea657aae08'
|
||||
'ba78252e1ca6b4c6e8dd741f4bbd8b8a'
|
||||
'703eb5664803f60e613557b986c11d9e'
|
||||
'e1f8981169d98e949b1e87e9ce5528df'
|
||||
'8ca1890dbfe6426841992d0fb054bb16'.decode('hex')
|
||||
)
|
||||
'637c777bf26b6fc53001672bfed7ab76'
|
||||
'ca82c97dfa5947f0add4a2af9ca472c0'
|
||||
'b7fd9326363ff7cc34a5e5f171d83115'
|
||||
'04c723c31896059a071280e2eb27b275'
|
||||
'09832c1a1b6e5aa0523bd6b329e32f84'
|
||||
'53d100ed20fcb15b6acbbe394a4c58cf'
|
||||
'd0efaafb434d338545f9027f503c9fa8'
|
||||
'51a3408f929d38f5bcb6da2110fff3d2'
|
||||
'cd0c13ec5f974417c4a77e3d645d1973'
|
||||
'60814fdc222a908846eeb814de5e0bdb'
|
||||
'e0323a0a4906245cc2d3ac629195e479'
|
||||
'e7c8376d8dd54ea96c56f4ea657aae08'
|
||||
'ba78252e1ca6b4c6e8dd741f4bbd8b8a'
|
||||
'703eb5664803f60e613557b986c11d9e'
|
||||
'e1f8981169d98e949b1e87e9ce5528df'
|
||||
'8ca1890dbfe6426841992d0fb054bb16'.decode('hex')
|
||||
)
|
||||
|
||||
# This is the inverse of the above. In other words:
|
||||
# aes_inv_sbox[aes_sbox[val]] == val
|
||||
|
||||
aes_inv_sbox = array('B',
|
||||
'52096ad53036a538bf40a39e81f3d7fb'
|
||||
'7ce339829b2fff87348e4344c4dee9cb'
|
||||
'547b9432a6c2233dee4c950b42fac34e'
|
||||
'082ea16628d924b2765ba2496d8bd125'
|
||||
'72f8f66486689816d4a45ccc5d65b692'
|
||||
'6c704850fdedb9da5e154657a78d9d84'
|
||||
'90d8ab008cbcd30af7e45805b8b34506'
|
||||
'd02c1e8fca3f0f02c1afbd0301138a6b'
|
||||
'3a9111414f67dcea97f2cfcef0b4e673'
|
||||
'96ac7422e7ad3585e2f937e81c75df6e'
|
||||
'47f11a711d29c5896fb7620eaa18be1b'
|
||||
'fc563e4bc6d279209adbc0fe78cd5af4'
|
||||
'1fdda8338807c731b11210592780ec5f'
|
||||
'60517fa919b54a0d2de57a9f93c99cef'
|
||||
'a0e03b4dae2af5b0c8ebbb3c83539961'
|
||||
'172b047eba77d626e169146355210c7d'.decode('hex')
|
||||
)
|
||||
'52096ad53036a538bf40a39e81f3d7fb'
|
||||
'7ce339829b2fff87348e4344c4dee9cb'
|
||||
'547b9432a6c2233dee4c950b42fac34e'
|
||||
'082ea16628d924b2765ba2496d8bd125'
|
||||
'72f8f66486689816d4a45ccc5d65b692'
|
||||
'6c704850fdedb9da5e154657a78d9d84'
|
||||
'90d8ab008cbcd30af7e45805b8b34506'
|
||||
'd02c1e8fca3f0f02c1afbd0301138a6b'
|
||||
'3a9111414f67dcea97f2cfcef0b4e673'
|
||||
'96ac7422e7ad3585e2f937e81c75df6e'
|
||||
'47f11a711d29c5896fb7620eaa18be1b'
|
||||
'fc563e4bc6d279209adbc0fe78cd5af4'
|
||||
'1fdda8338807c731b11210592780ec5f'
|
||||
'60517fa919b54a0d2de57a9f93c99cef'
|
||||
'a0e03b4dae2af5b0c8ebbb3c83539961'
|
||||
'172b047eba77d626e169146355210c7d'.decode('hex')
|
||||
)
|
||||
|
||||
# The Rcon table is used in AES's key schedule (key expansion)
|
||||
# It's a pre-computed table of exponentation of 2 in AES's finite field
|
||||
@@ -531,20 +527,20 @@ aes_inv_sbox = array('B',
|
||||
# More information: http://en.wikipedia.org/wiki/Rijndael_key_schedule
|
||||
|
||||
aes_Rcon = array('B',
|
||||
'8d01020408102040801b366cd8ab4d9a'
|
||||
'2f5ebc63c697356ad4b37dfaefc59139'
|
||||
'72e4d3bd61c29f254a943366cc831d3a'
|
||||
'74e8cb8d01020408102040801b366cd8'
|
||||
'ab4d9a2f5ebc63c697356ad4b37dfaef'
|
||||
'c5913972e4d3bd61c29f254a943366cc'
|
||||
'831d3a74e8cb8d01020408102040801b'
|
||||
'366cd8ab4d9a2f5ebc63c697356ad4b3'
|
||||
'7dfaefc5913972e4d3bd61c29f254a94'
|
||||
'3366cc831d3a74e8cb8d010204081020'
|
||||
'40801b366cd8ab4d9a2f5ebc63c69735'
|
||||
'6ad4b37dfaefc5913972e4d3bd61c29f'
|
||||
'254a943366cc831d3a74e8cb8d010204'
|
||||
'08102040801b366cd8ab4d9a2f5ebc63'
|
||||
'c697356ad4b37dfaefc5913972e4d3bd'
|
||||
'61c29f254a943366cc831d3a74e8cb'.decode('hex')
|
||||
)
|
||||
'8d01020408102040801b366cd8ab4d9a'
|
||||
'2f5ebc63c697356ad4b37dfaefc59139'
|
||||
'72e4d3bd61c29f254a943366cc831d3a'
|
||||
'74e8cb8d01020408102040801b366cd8'
|
||||
'ab4d9a2f5ebc63c697356ad4b37dfaef'
|
||||
'c5913972e4d3bd61c29f254a943366cc'
|
||||
'831d3a74e8cb8d01020408102040801b'
|
||||
'366cd8ab4d9a2f5ebc63c697356ad4b3'
|
||||
'7dfaefc5913972e4d3bd61c29f254a94'
|
||||
'3366cc831d3a74e8cb8d010204081020'
|
||||
'40801b366cd8ab4d9a2f5ebc63c69735'
|
||||
'6ad4b37dfaefc5913972e4d3bd61c29f'
|
||||
'254a943366cc831d3a74e8cb8d010204'
|
||||
'08102040801b366cd8ab4d9a2f5ebc63'
|
||||
'c697356ad4b37dfaefc5913972e4d3bd'
|
||||
'61c29f254a943366cc831d3a74e8cb'.decode('hex')
|
||||
)
|
||||
@@ -1,16 +1,16 @@
|
||||
import base64
|
||||
import sys
|
||||
import json
|
||||
import random
|
||||
import struct
|
||||
import time
|
||||
import urllib
|
||||
from threading import Thread
|
||||
|
||||
from Crypto.Cipher import AES
|
||||
from file import File
|
||||
from handler import Handler
|
||||
from platformcode import logger
|
||||
from server import Server
|
||||
from core import logger
|
||||
|
||||
|
||||
class Client(object):
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
import os
|
||||
|
||||
from core import logger
|
||||
from nmb.NetBIOS import NetBIOS
|
||||
from platformcode import logger
|
||||
from smb.SMBConnection import SMBConnection
|
||||
|
||||
remote = None
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
try:
|
||||
from selenium.webdriver import PhantomJS
|
||||
from contextlib import closing
|
||||
|
||||
linkbucks_support = True
|
||||
except:
|
||||
linkbucks_support = False
|
||||
@@ -11,16 +10,16 @@ try:
|
||||
from urllib.request import urlsplit, urlparse
|
||||
except:
|
||||
from urlparse import urlsplit, urlparse
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
from base64 import b64decode
|
||||
|
||||
import os
|
||||
import requests
|
||||
|
||||
import time
|
||||
import json
|
||||
from base64 import b64decode
|
||||
import random
|
||||
|
||||
class UnshortenIt(object):
|
||||
|
||||
_headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
|
||||
'Accept-Encoding': 'gzip,deflate,sdch',
|
||||
'Accept-Language': 'en-US,en;q=0.8',
|
||||
@@ -40,7 +39,7 @@ class UnshortenIt(object):
|
||||
|
||||
if re.search(self._adfly_regex, domain, re.IGNORECASE) or type == 'adfly':
|
||||
return self._unshorten_adfly(uri)
|
||||
if re.search(self._adfocus_regex, domain, re.IGNORECASE) or type == 'adfocus':
|
||||
if re.search(self._adfocus_regex, domain, re.IGNORECASE) or type =='adfocus':
|
||||
return self._unshorten_adfocus(uri)
|
||||
if re.search(self._linkbucks_regex, domain, re.IGNORECASE) or type == 'linkbucks':
|
||||
if linkbucks_support:
|
||||
@@ -60,7 +59,7 @@ class UnshortenIt(object):
|
||||
# p.ost.im uses meta http refresh to redirect.
|
||||
if domain == 'p.ost.im':
|
||||
r = requests.get(uri, headers=self._headers, timeout=self._timeout)
|
||||
uri = re.findall(r'.*url\=(.*?)\"\.*', r.text)[0]
|
||||
uri = re.findall(r'.*url\=(.*?)\"\.*',r.text)[0]
|
||||
return uri, 200
|
||||
r = requests.head(uri, headers=self._headers, timeout=self._timeout)
|
||||
while True:
|
||||
@@ -86,7 +85,7 @@ class UnshortenIt(object):
|
||||
left = ''
|
||||
right = ''
|
||||
|
||||
for c in [ysmm[i:i + 2] for i in range(0, len(ysmm), 2)]:
|
||||
for c in [ysmm[i:i+2] for i in range(0, len(ysmm), 2)]:
|
||||
left += c[0]
|
||||
right = c[1] + right
|
||||
|
||||
@@ -203,10 +202,9 @@ class UnshortenIt(object):
|
||||
time.sleep(5)
|
||||
|
||||
payload = {'adSessionId': session_id, 'callback': 'c'}
|
||||
r = requests.get('http://sh.st/shortest-url/end-adsession', params=payload, headers=http_header,
|
||||
timeout=self._timeout)
|
||||
r = requests.get('http://sh.st/shortest-url/end-adsession', params=payload, headers=http_header, timeout=self._timeout)
|
||||
response = r.content[6:-2].decode('utf-8')
|
||||
|
||||
|
||||
if r.status_code == 200:
|
||||
resp_uri = json.loads(response)['destinationUrl']
|
||||
if resp_uri is not None:
|
||||
|
||||
Reference in New Issue
Block a user