├── config.ini ├── top ├── api │ ├── __init__.py │ ├── rest │ │ ├── TimeGetRequest.py │ │ ├── AppipGetRequest.py │ │ ├── HttpdnsGetRequest.py │ │ ├── OpenuidGetRequest.py │ │ ├── TopIpoutGetRequest.py │ │ ├── TmcQueueGetRequest.py │ │ ├── OpenuidGetBytradeRequest.py │ │ ├── TmcUserTopicsGetRequest.py │ │ ├── JuItemsSearchRequest.py │ │ ├── TopSecretRegisterRequest.py │ │ ├── OpenuidGetBymixnickRequest.py │ │ ├── TbkContentEffectGetRequest.py │ │ ├── AlipayXiaodaiUserPermitRequest.py │ │ ├── TopAuthTokenRefreshRequest.py │ │ ├── OpenuidChangeRequest.py │ │ ├── TopAuthTokenCreateRequest.py │ │ ├── FilesGetRequest.py │ │ ├── TbkCouponGetRequest.py │ │ ├── TbkDgVegasTljInstanceReportRequest.py │ │ ├── TopSdkFeedbackUploadRequest.py │ │ ├── TbkItemInfoGetRequest.py │ │ ├── WangwangClientidBindRequest.py │ │ ├── KfcKeywordSearchRequest.py │ │ ├── WangwangClientidUnbindRequest.py │ │ ├── TmcMsgSendrecordRequest.py │ │ ├── TopSecretGetRequest.py │ │ ├── TbkTpwdCreateRequest.py │ │ ├── TbkItemRecommendGetRequest.py │ │ ├── TbkShopRecommendGetRequest.py │ │ ├── TbkUatmFavoritesGetRequest.py │ │ ├── TbkJuTqgGetRequest.py │ │ ├── TbkActivitylinkGetRequest.py │ │ ├── TbkDgNewuserOrderGetRequest.py │ │ ├── TbkDgNewuserOrderSumRequest.py │ │ ├── TbkUatmFavoritesItemGetRequest.py │ │ ├── TbkContentGetRequest.py │ │ ├── TbkDgOptimusMaterialRequest.py │ │ ├── TbkDgVegasTljCreateRequest.py │ │ ├── TbkShopGetRequest.py │ │ ├── TbkDgMaterialOptionalRequest.py │ │ └── __init__.py │ └── base.py └── __init__.py ├── requirements.txt ├── README.md ├── LICENSE ├── demo.py ├── .gitignore └── .idea └── workspace.xml /config.ini: -------------------------------------------------------------------------------- 1 | 2 | [taobao] 3 | appkey = xxx 4 | secret = xxx 5 | -------------------------------------------------------------------------------- /top/api/__init__.py: -------------------------------------------------------------------------------- 1 | from top.api.rest import * 2 | from top.api.base import FileItem -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2019.9.11 2 | chardet==3.0.4 3 | idna==2.8 4 | requests==2.22.0 5 | urllib3==1.25.6 6 | virtualenv==16.6.2 7 | virtualenvwrapper-win==1.2.5 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # taobao-sdk-python 2 | 淘宝联盟pythonsdk修复python3版本,此版本只支持python3 3 | 4 | 使用方法: 5 | 6 | 执行 pip install -r requirements.txt安装依赖,此项目用了requests进行网络请求 7 | 8 | 根目录创建.ini配置文件 9 | 10 | ```python 11 | [taobao] 12 | appkey = xxx 13 | secret = xxx 14 | ``` 15 | -------------------------------------------------------------------------------- /top/api/rest/TimeGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TimeGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | 9 | def getapiname(self): 10 | return 'taobao.time.get' 11 | -------------------------------------------------------------------------------- /top/api/rest/AppipGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class AppipGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | 9 | def getapiname(self): 10 | return 'taobao.appip.get' 11 | -------------------------------------------------------------------------------- /top/api/rest/HttpdnsGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class HttpdnsGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | 9 | def getapiname(self): 10 | return 'taobao.httpdns.get' 11 | -------------------------------------------------------------------------------- /top/api/rest/OpenuidGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.10.17 3 | ''' 4 | from top.api.base import RestApi 5 | class OpenuidGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | 9 | def getapiname(self): 10 | return 'taobao.openuid.get' 11 | -------------------------------------------------------------------------------- /top/api/rest/TopIpoutGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.08.07 3 | ''' 4 | from top.api.base import RestApi 5 | class TopIpoutGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | 9 | def getapiname(self): 10 | return 'taobao.top.ipout.get' 11 | -------------------------------------------------------------------------------- /top/api/rest/TmcQueueGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TmcQueueGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.group_name = None 9 | 10 | def getapiname(self): 11 | return 'taobao.tmc.queue.get' 12 | -------------------------------------------------------------------------------- /top/api/rest/OpenuidGetBytradeRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.10.17 3 | ''' 4 | from top.api.base import RestApi 5 | class OpenuidGetBytradeRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.tid = None 9 | 10 | def getapiname(self): 11 | return 'taobao.openuid.get.bytrade' 12 | -------------------------------------------------------------------------------- /top/api/rest/TmcUserTopicsGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.12.22 3 | ''' 4 | from top.api.base import RestApi 5 | class TmcUserTopicsGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.nick = None 9 | 10 | def getapiname(self): 11 | return 'taobao.tmc.user.topics.get' 12 | -------------------------------------------------------------------------------- /top/api/rest/JuItemsSearchRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class JuItemsSearchRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.param_top_item_query = None 9 | 10 | def getapiname(self): 11 | return 'taobao.ju.items.search' 12 | -------------------------------------------------------------------------------- /top/api/rest/TopSecretRegisterRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TopSecretRegisterRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.user_id = None 9 | 10 | def getapiname(self): 11 | return 'taobao.top.secret.register' 12 | -------------------------------------------------------------------------------- /top/api/rest/OpenuidGetBymixnickRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.10.21 3 | ''' 4 | from top.api.base import RestApi 5 | class OpenuidGetBymixnickRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.mix_nick = None 9 | 10 | def getapiname(self): 11 | return 'taobao.openuid.get.bymixnick' 12 | -------------------------------------------------------------------------------- /top/api/rest/TbkContentEffectGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkContentEffectGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.option = None 9 | 10 | def getapiname(self): 11 | return 'taobao.tbk.content.effect.get' 12 | -------------------------------------------------------------------------------- /top/api/rest/AlipayXiaodaiUserPermitRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class AlipayXiaodaiUserPermitRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.user_id = None 9 | 10 | def getapiname(self): 11 | return 'alipay.xiaodai.user.permit' 12 | -------------------------------------------------------------------------------- /top/api/rest/TopAuthTokenRefreshRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TopAuthTokenRefreshRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.refresh_token = None 9 | 10 | def getapiname(self): 11 | return 'taobao.top.auth.token.refresh' 12 | -------------------------------------------------------------------------------- /top/api/rest/OpenuidChangeRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.10.26 3 | ''' 4 | from top.api.base import RestApi 5 | class OpenuidChangeRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.open_uid = None 9 | self.target_app_key = None 10 | 11 | def getapiname(self): 12 | return 'taobao.openuid.change' 13 | -------------------------------------------------------------------------------- /top/api/rest/TopAuthTokenCreateRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TopAuthTokenCreateRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.code = None 9 | self.uuid = None 10 | 11 | def getapiname(self): 12 | return 'taobao.top.auth.token.create' 13 | -------------------------------------------------------------------------------- /top/api/rest/FilesGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class FilesGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.end_date = None 9 | self.start_date = None 10 | self.status = None 11 | 12 | def getapiname(self): 13 | return 'taobao.files.get' 14 | -------------------------------------------------------------------------------- /top/api/rest/TbkCouponGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkCouponGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.activity_id = None 9 | self.item_id = None 10 | self.me = None 11 | 12 | def getapiname(self): 13 | return 'taobao.tbk.coupon.get' 14 | -------------------------------------------------------------------------------- /top/api/rest/TbkDgVegasTljInstanceReportRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.09.11 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgVegasTljInstanceReportRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.rights_id = None 9 | 10 | def getapiname(self): 11 | return 'taobao.tbk.dg.vegas.tlj.instance.report' 12 | -------------------------------------------------------------------------------- /top/api/rest/TopSdkFeedbackUploadRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TopSdkFeedbackUploadRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.content = None 9 | self.type = None 10 | 11 | def getapiname(self): 12 | return 'taobao.top.sdk.feedback.upload' 13 | -------------------------------------------------------------------------------- /top/api/rest/TbkItemInfoGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.10.12 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkItemInfoGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.ip = None 9 | self.num_iids = None 10 | self.platform = None 11 | 12 | def getapiname(self): 13 | return 'taobao.tbk.item.info.get' 14 | -------------------------------------------------------------------------------- /top/api/rest/WangwangClientidBindRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.26 3 | ''' 4 | from top.api.base import RestApi 5 | class WangwangClientidBindRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.app_name = None 9 | self.client_id = None 10 | 11 | def getapiname(self): 12 | return 'taobao.wangwang.clientid.bind' 13 | -------------------------------------------------------------------------------- /top/api/rest/KfcKeywordSearchRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.26 3 | ''' 4 | from top.api.base import RestApi 5 | class KfcKeywordSearchRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.apply = None 9 | self.content = None 10 | self.nick = None 11 | 12 | def getapiname(self): 13 | return 'taobao.kfc.keyword.search' 14 | -------------------------------------------------------------------------------- /top/api/rest/WangwangClientidUnbindRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.26 3 | ''' 4 | from top.api.base import RestApi 5 | class WangwangClientidUnbindRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.app_name = None 9 | self.client_id = None 10 | 11 | def getapiname(self): 12 | return 'taobao.wangwang.clientid.unbind' 13 | -------------------------------------------------------------------------------- /top/api/rest/TmcMsgSendrecordRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TmcMsgSendrecordRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.data_id = None 9 | self.group_name = None 10 | self.topic_name = None 11 | 12 | def getapiname(self): 13 | return 'taobao.tmc.msg.sendrecord' 14 | -------------------------------------------------------------------------------- /top/api/rest/TopSecretGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.02.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TopSecretGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.customer_user_id = None 9 | self.random_num = None 10 | self.secret_version = None 11 | 12 | def getapiname(self): 13 | return 'taobao.top.secret.get' 14 | -------------------------------------------------------------------------------- /top/api/rest/TbkTpwdCreateRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.09.27 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkTpwdCreateRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.ext = None 9 | self.logo = None 10 | self.text = None 11 | self.url = None 12 | self.user_id = None 13 | 14 | def getapiname(self): 15 | return 'taobao.tbk.tpwd.create' 16 | -------------------------------------------------------------------------------- /top/api/rest/TbkItemRecommendGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkItemRecommendGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.count = None 9 | self.fields = None 10 | self.num_iid = None 11 | self.platform = None 12 | 13 | def getapiname(self): 14 | return 'taobao.tbk.item.recommend.get' 15 | -------------------------------------------------------------------------------- /top/api/rest/TbkShopRecommendGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkShopRecommendGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.count = None 9 | self.fields = None 10 | self.platform = None 11 | self.user_id = None 12 | 13 | def getapiname(self): 14 | return 'taobao.tbk.shop.recommend.get' 15 | -------------------------------------------------------------------------------- /top/api/rest/TbkUatmFavoritesGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkUatmFavoritesGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.fields = None 9 | self.page_no = None 10 | self.page_size = None 11 | self.type = None 12 | 13 | def getapiname(self): 14 | return 'taobao.tbk.uatm.favorites.get' 15 | -------------------------------------------------------------------------------- /top/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from top.api.base import sign 3 | 4 | 5 | 6 | class appinfo(object): 7 | def __init__(self,appkey,secret): 8 | self.appkey = appkey 9 | self.secret = secret 10 | 11 | def getDefaultAppInfo(): 12 | pass 13 | 14 | 15 | def setDefaultAppInfo(appkey,secret): 16 | default = appinfo(appkey,secret) 17 | global getDefaultAppInfo 18 | getDefaultAppInfo = lambda: default 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /top/api/rest/TbkJuTqgGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2018.07.25 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkJuTqgGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.end_time = None 10 | self.fields = None 11 | self.page_no = None 12 | self.page_size = None 13 | self.start_time = None 14 | 15 | def getapiname(self): 16 | return 'taobao.tbk.ju.tqg.get' 17 | -------------------------------------------------------------------------------- /top/api/rest/TbkActivitylinkGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.03 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkActivitylinkGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.platform = None 10 | self.promotion_scene_id = None 11 | self.relation_id = None 12 | self.sub_pid = None 13 | self.union_id = None 14 | 15 | def getapiname(self): 16 | return 'taobao.tbk.activitylink.get' 17 | -------------------------------------------------------------------------------- /top/api/rest/TbkDgNewuserOrderGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgNewuserOrderGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.activity_id = None 9 | self.adzone_id = None 10 | self.end_time = None 11 | self.page_no = None 12 | self.page_size = None 13 | self.start_time = None 14 | 15 | def getapiname(self): 16 | return 'taobao.tbk.dg.newuser.order.get' 17 | -------------------------------------------------------------------------------- /top/api/rest/TbkDgNewuserOrderSumRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgNewuserOrderSumRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.activity_id = None 9 | self.adzone_id = None 10 | self.page_no = None 11 | self.page_size = None 12 | self.settle_month = None 13 | self.site_id = None 14 | 15 | def getapiname(self): 16 | return 'taobao.tbk.dg.newuser.order.sum' 17 | -------------------------------------------------------------------------------- /top/api/rest/TbkUatmFavoritesItemGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkUatmFavoritesItemGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.favorites_id = None 10 | self.fields = None 11 | self.page_no = None 12 | self.page_size = None 13 | self.platform = None 14 | self.unid = None 15 | 16 | def getapiname(self): 17 | return 'taobao.tbk.uatm.favorites.item.get' 18 | -------------------------------------------------------------------------------- /top/api/rest/TbkContentGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkContentGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.before_timestamp = None 10 | self.cid = None 11 | self.content_set = None 12 | self.count = None 13 | self.image_height = None 14 | self.image_width = None 15 | self.type = None 16 | 17 | def getapiname(self): 18 | return 'taobao.tbk.content.get' 19 | -------------------------------------------------------------------------------- /top/api/rest/TbkDgOptimusMaterialRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.10.18 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgOptimusMaterialRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.content_id = None 10 | self.content_source = None 11 | self.device_encrypt = None 12 | self.device_type = None 13 | self.device_value = None 14 | self.item_id = None 15 | self.material_id = None 16 | self.page_no = None 17 | self.page_size = None 18 | 19 | def getapiname(self): 20 | return 'taobao.tbk.dg.optimus.material' 21 | -------------------------------------------------------------------------------- /top/api/rest/TbkDgVegasTljCreateRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.12 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgVegasTljCreateRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.campaign_type = None 10 | self.item_id = None 11 | self.name = None 12 | self.per_face = None 13 | self.security_switch = None 14 | self.send_end_time = None 15 | self.send_start_time = None 16 | self.total_num = None 17 | self.use_end_time = None 18 | self.use_end_time_mode = None 19 | self.use_start_time = None 20 | self.user_total_win_num_limit = None 21 | 22 | def getapiname(self): 23 | return 'taobao.tbk.dg.vegas.tlj.create' 24 | -------------------------------------------------------------------------------- /top/api/rest/TbkShopGetRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.07.04 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkShopGetRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.end_auction_count = None 9 | self.end_commission_rate = None 10 | self.end_credit = None 11 | self.end_total_action = None 12 | self.fields = None 13 | self.is_tmall = None 14 | self.page_no = None 15 | self.page_size = None 16 | self.platform = None 17 | self.q = None 18 | self.sort = None 19 | self.start_auction_count = None 20 | self.start_commission_rate = None 21 | self.start_credit = None 22 | self.start_total_action = None 23 | 24 | def getapiname(self): 25 | return 'taobao.tbk.shop.get' 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 冯金琪 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /demo.py: -------------------------------------------------------------------------------- 1 | import os 2 | from configparser import ConfigParser 3 | BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),'config.ini') 4 | 5 | import top.api 6 | conf = ConfigParser() 7 | conf.read(BASE_DIR) 8 | 9 | 10 | req=top.api.TbkUatmFavoritesGetRequest('https://eco.taobao.com/router/rest') 11 | req.set_app_info(top.appinfo(conf.get('taobao','appkey'),conf.get('taobao','secret'))) 12 | 13 | req.page_no=1 14 | req.page_size=20 15 | req.fields="favorites_title,favorites_id,type" 16 | req.type=-1 17 | 18 | try: 19 | resp= req.getResponse() 20 | print(resp) 21 | except Exception as e: 22 | print(e) 23 | 24 | req=top.api.TbkDgOptimusMaterialRequest('https://eco.taobao.com/router/rest') 25 | req.set_app_info(top.appinfo(conf.get('taobao','appkey'),conf.get('taobao','secret'))) 26 | 27 | req.page_size=100 28 | req.adzone_id=109594100407 29 | req.page_no=1 30 | req.material_id=3756 31 | req.device_value="xxx" 32 | req.device_encrypt="MD5" 33 | req.device_type="IMEI" 34 | req.content_id=323 35 | req.content_source="xxx" 36 | req.item_id=33243 37 | try: 38 | resp= req.getResponse() 39 | print(resp) 40 | except Exception as e: 41 | print(e) -------------------------------------------------------------------------------- /top/api/rest/TbkDgMaterialOptionalRequest.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created by auto_sdk on 2019.10.18 3 | ''' 4 | from top.api.base import RestApi 5 | class TbkDgMaterialOptionalRequest(RestApi): 6 | def __init__(self,domain='gw.api.taobao.com',port=80): 7 | RestApi.__init__(self,domain, port) 8 | self.adzone_id = None 9 | self.cat = None 10 | self.device_encrypt = None 11 | self.device_type = None 12 | self.device_value = None 13 | self.end_ka_tk_rate = None 14 | self.end_price = None 15 | self.end_tk_rate = None 16 | self.has_coupon = None 17 | self.include_good_rate = None 18 | self.include_pay_rate_30 = None 19 | self.include_rfd_rate = None 20 | self.ip = None 21 | self.is_overseas = None 22 | self.is_tmall = None 23 | self.itemloc = None 24 | self.lock_rate_end_time = None 25 | self.lock_rate_start_time = None 26 | self.material_id = None 27 | self.need_free_shipment = None 28 | self.need_prepay = None 29 | self.npx_level = None 30 | self.page_no = None 31 | self.page_size = None 32 | self.platform = None 33 | self.q = None 34 | self.sort = None 35 | self.start_dsr = None 36 | self.start_ka_tk_rate = None 37 | self.start_price = None 38 | self.start_tk_rate = None 39 | 40 | def getapiname(self): 41 | return 'taobao.tbk.dg.material.optional' 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *.ini 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | db.sqlite3 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # mypy 105 | .mypy_cache/ 106 | -------------------------------------------------------------------------------- /top/api/rest/__init__.py: -------------------------------------------------------------------------------- 1 | from top.api.rest.WangwangClientidBindRequest import WangwangClientidBindRequest 2 | from top.api.rest.TbkDgNewuserOrderGetRequest import TbkDgNewuserOrderGetRequest 3 | from top.api.rest.TbkTpwdCreateRequest import TbkTpwdCreateRequest 4 | from top.api.rest.TbkDgMaterialOptionalRequest import TbkDgMaterialOptionalRequest 5 | from top.api.rest.TmcQueueGetRequest import TmcQueueGetRequest 6 | from top.api.rest.OpenuidGetRequest import OpenuidGetRequest 7 | from top.api.rest.TbkUatmFavoritesGetRequest import TbkUatmFavoritesGetRequest 8 | from top.api.rest.TbkDgVegasTljInstanceReportRequest import TbkDgVegasTljInstanceReportRequest 9 | from top.api.rest.OpenuidGetBytradeRequest import OpenuidGetBytradeRequest 10 | from top.api.rest.FilesGetRequest import FilesGetRequest 11 | from top.api.rest.TbkDgVegasTljCreateRequest import TbkDgVegasTljCreateRequest 12 | from top.api.rest.TbkContentGetRequest import TbkContentGetRequest 13 | from top.api.rest.TbkDgNewuserOrderSumRequest import TbkDgNewuserOrderSumRequest 14 | from top.api.rest.WangwangClientidUnbindRequest import WangwangClientidUnbindRequest 15 | from top.api.rest.OpenuidChangeRequest import OpenuidChangeRequest 16 | from top.api.rest.TopAuthTokenCreateRequest import TopAuthTokenCreateRequest 17 | from top.api.rest.JuItemsSearchRequest import JuItemsSearchRequest 18 | from top.api.rest.AlipayXiaodaiUserPermitRequest import AlipayXiaodaiUserPermitRequest 19 | from top.api.rest.TopAuthTokenRefreshRequest import TopAuthTokenRefreshRequest 20 | from top.api.rest.TmcMsgSendrecordRequest import TmcMsgSendrecordRequest 21 | from top.api.rest.TbkContentEffectGetRequest import TbkContentEffectGetRequest 22 | from top.api.rest.TopSdkFeedbackUploadRequest import TopSdkFeedbackUploadRequest 23 | from top.api.rest.TopSecretRegisterRequest import TopSecretRegisterRequest 24 | from top.api.rest.TmcUserTopicsGetRequest import TmcUserTopicsGetRequest 25 | from top.api.rest.OpenuidGetBymixnickRequest import OpenuidGetBymixnickRequest 26 | from top.api.rest.TopSecretGetRequest import TopSecretGetRequest 27 | from top.api.rest.TbkShopRecommendGetRequest import TbkShopRecommendGetRequest 28 | from top.api.rest.KfcKeywordSearchRequest import KfcKeywordSearchRequest 29 | from top.api.rest.TbkCouponGetRequest import TbkCouponGetRequest 30 | from top.api.rest.TimeGetRequest import TimeGetRequest 31 | from top.api.rest.TopIpoutGetRequest import TopIpoutGetRequest 32 | from top.api.rest.TbkUatmFavoritesItemGetRequest import TbkUatmFavoritesItemGetRequest 33 | from top.api.rest.HttpdnsGetRequest import HttpdnsGetRequest 34 | from top.api.rest.TbkShopGetRequest import TbkShopGetRequest 35 | from top.api.rest.TbkItemInfoGetRequest import TbkItemInfoGetRequest 36 | from top.api.rest.TbkJuTqgGetRequest import TbkJuTqgGetRequest 37 | from top.api.rest.AppipGetRequest import AppipGetRequest 38 | from top.api.rest.TbkActivitylinkGetRequest import TbkActivitylinkGetRequest 39 | from top.api.rest.TbkItemRecommendGetRequest import TbkItemRecommendGetRequest 40 | from top.api.rest.TbkDgOptimusMaterialRequest import TbkDgOptimusMaterialRequest 41 | -------------------------------------------------------------------------------- /top/api/base.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | ''' 3 | Created on 2019-10-20 4 | 5 | @author: fengjinqi 6 | ''' 7 | 8 | try: import httplib 9 | except ImportError: 10 | import http.client as httplib 11 | 12 | import urllib 13 | import time 14 | import hashlib 15 | import json 16 | import top 17 | import itertools 18 | import mimetypes 19 | import requests 20 | from urllib.parse import urlencode 21 | ''' 22 | 定义一些系统变量 23 | ''' 24 | 25 | SYSTEM_GENERATE_VERSION = "taobao-sdk-python-fengjinqi" 26 | 27 | P_APPKEY = "app_key" 28 | P_API = "method" 29 | P_SESSION = "session" 30 | P_ACCESS_TOKEN = "access_token" 31 | P_VERSION = "v" 32 | P_FORMAT = "format" 33 | P_TIMESTAMP = "timestamp" 34 | P_SIGN = "sign" 35 | P_SIGN_METHOD = "sign_method" 36 | P_PARTNER_ID = "partner_id" 37 | 38 | P_CODE = 'code' 39 | P_SUB_CODE = 'sub_code' 40 | P_MSG = 'msg' 41 | P_SUB_MSG = 'sub_msg' 42 | 43 | 44 | N_REST = '/router/rest' 45 | 46 | def sign(secret, parameters): 47 | #=========================================================================== 48 | # '''签名方法 49 | # @param secret: 签名需要的密钥 50 | # @param parameters: 支持字典和string两种 51 | # ''' 52 | #=========================================================================== 53 | # 如果parameters 是字典类的话 54 | if hasattr(parameters, "items"): 55 | keys = list(parameters.keys()) 56 | keys.sort() 57 | 58 | parameters = "%s%s%s" % (secret, 59 | str().join('%s%s' % (key, parameters[key]) for key in keys), 60 | secret) 61 | sign = hashlib.md5(parameters.encode('utf8')).hexdigest().upper() 62 | return sign 63 | 64 | def mixStr(pstr): 65 | if(isinstance(pstr, str)): 66 | return pstr 67 | #elif(isinstance(pstr, unicode)): 68 | # return pstr.encode('utf-8') 69 | elif (isinstance(pstr, bytes)): 70 | # return pstr.encode('utf-8') 71 | return pstr.decode('utf-8') 72 | else: 73 | return str(pstr) 74 | 75 | class FileItem(object): 76 | def __init__(self,filename=None,content=None): 77 | self.filename = filename 78 | self.content = content 79 | 80 | class MultiPartForm(object): 81 | """Accumulate the data to be used when posting a form.""" 82 | 83 | def __init__(self): 84 | self.form_fields = [] 85 | self.files = [] 86 | self.boundary = "PYTHON_SDK_BOUNDARY" 87 | return 88 | 89 | def get_content_type(self): 90 | return 'multipart/form-data; boundary=%s' % self.boundary 91 | 92 | def add_field(self, name, value): 93 | """Add a simple field to the form data.""" 94 | self.form_fields.append((name, str(value))) 95 | return 96 | 97 | def add_file(self, fieldname, filename, fileHandle, mimetype=None): 98 | """Add a file to be uploaded.""" 99 | body = fileHandle.read() 100 | if mimetype is None: 101 | mimetype = mimetypes.guess_type(filename)[0] or 'application/octet-stream' 102 | self.files.append((mixStr(fieldname), mixStr(filename), mixStr(mimetype), mixStr(body))) 103 | return 104 | 105 | def __str__(self): 106 | """Return a string representing the form data, including attached files.""" 107 | # Build a list of lists, each containing "lines" of the 108 | # request. Each part is separated by a boundary string. 109 | # Once the list is built, return a string where each 110 | # line is separated by '\r\n'. 111 | parts = [] 112 | part_boundary = '--' + self.boundary 113 | 114 | # Add the form fields 115 | parts.extend( 116 | [ part_boundary, 117 | 'Content-Disposition: form-data; name="%s"' % name, 118 | 'Content-Type: text/plain; charset=UTF-8', 119 | '', 120 | value, 121 | ] 122 | for name, value in self.form_fields 123 | ) 124 | 125 | # Add the files to upload 126 | parts.extend( 127 | [ part_boundary, 128 | 'Content-Disposition: file; name="%s"; filename="%s"' % \ 129 | (field_name, filename), 130 | 'Content-Type: %s' % content_type, 131 | 'Content-Transfer-Encoding: binary', 132 | '', 133 | body, 134 | ] 135 | for field_name, filename, content_type, body in self.files 136 | ) 137 | 138 | # Flatten the list and add closing boundary marker, 139 | # then return CR+LF separated data 140 | flattened = list(itertools.chain(*parts)) 141 | flattened.append('--' + self.boundary + '--') 142 | flattened.append('') 143 | return '\r\n'.join(flattened) 144 | 145 | class TopException(Exception): 146 | #=========================================================================== 147 | # 业务异常类 148 | #=========================================================================== 149 | def __init__(self): 150 | self.errorcode = None 151 | self.message = None 152 | self.subcode = None 153 | self.submsg = None 154 | self.application_host = None 155 | self.service_host = None 156 | 157 | def __str__(self, *args, **kwargs): 158 | sb = "errorcode=" + mixStr(self.errorcode) +\ 159 | " message=" + mixStr(self.message) +\ 160 | " subcode=" + mixStr(self.subcode) +\ 161 | " submsg=" + mixStr(self.submsg) +\ 162 | " application_host=" + mixStr(self.application_host) +\ 163 | " service_host=" + mixStr(self.service_host) 164 | return sb 165 | 166 | class RequestException(Exception): 167 | #=========================================================================== 168 | # 请求连接异常类 169 | #=========================================================================== 170 | pass 171 | 172 | class RestApi(object): 173 | #=========================================================================== 174 | # Rest api的基类 175 | #=========================================================================== 176 | 177 | def __init__(self, domain='gw.api.taobao.com', port = 80): 178 | #======================================================================= 179 | # 初始化基类 180 | # Args @param domain: 请求的域名或者ip 181 | # @param port: 请求的端口 182 | #======================================================================= 183 | self.__domain = domain 184 | self.__port = port 185 | self.__httpmethod = "POST" 186 | if(top.getDefaultAppInfo()): 187 | self.__app_key = top.getDefaultAppInfo().appkey 188 | self.__secret = top.getDefaultAppInfo().secret 189 | 190 | def get_request_header(self): 191 | return { 192 | 'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8', 193 | "Cache-Control": "no-cache", 194 | "Connection": "Keep-Alive", 195 | } 196 | 197 | def set_app_info(self, appinfo): 198 | #======================================================================= 199 | # 设置请求的app信息 200 | # @param appinfo: import top 201 | # appinfo top.appinfo(appkey,secret) 202 | #======================================================================= 203 | self.__app_key = appinfo.appkey 204 | self.__secret = appinfo.secret 205 | 206 | def getapiname(self): 207 | return "" 208 | 209 | def getMultipartParas(self): 210 | return [] 211 | 212 | def getTranslateParas(self): 213 | return {} 214 | 215 | def _check_requst(self): 216 | pass 217 | 218 | def getTime(self): 219 | localTime = time.localtime(time.time()) 220 | strTime = time.strftime("%Y-%m-%d %H:%M:%S", localTime) 221 | return strTime 222 | 223 | def getResponse(self, authrize=None, timeout=30): 224 | #======================================================================= 225 | # 获取response结果 226 | #======================================================================= 227 | sys_parameters = { 228 | P_FORMAT: 'json', 229 | P_APPKEY: self.__app_key, 230 | P_SIGN_METHOD: "md5", 231 | P_VERSION: '2.0', 232 | P_TIMESTAMP: str(self.getTime()), 233 | P_PARTNER_ID: SYSTEM_GENERATE_VERSION, 234 | P_API: self.getapiname(), 235 | } 236 | if authrize is not None: 237 | sys_parameters[P_SESSION] = authrize 238 | application_parameter = self.getApplicationParameters() 239 | sign_parameter = sys_parameters.copy() 240 | sign_parameter.update(application_parameter) 241 | sys_parameters[P_SIGN] = sign(self.__secret, sign_parameter) 242 | sys_parameters.update(sign_parameter) 243 | 244 | header = self.get_request_header() 245 | result = requests.request(self.__httpmethod,self.__domain,data=sys_parameters,headers=header,timeout=timeout) 246 | 247 | if result.status_code is not 200: 248 | raise RequestException('invalid http status ' + str(result.status_code) + ',detail body:' + result.text) 249 | jsonobj = result.json() 250 | 251 | if 'error_response' in jsonobj: 252 | error = TopException() 253 | if P_CODE in jsonobj["error_response"]: 254 | error.errorcode = jsonobj["error_response"][P_CODE] 255 | if P_MSG in jsonobj["error_response"]: 256 | error.message = jsonobj["error_response"][P_MSG] 257 | if P_SUB_CODE in jsonobj["error_response"]: 258 | error.subcode = jsonobj["error_response"][P_SUB_CODE] 259 | if P_SUB_MSG in jsonobj["error_response"]: 260 | error.submsg = jsonobj["error_response"][P_SUB_MSG] 261 | error.application_host = result.headers.get("Application-Host", "") 262 | error.service_host = result.headers.get("Location-Host", "") 263 | raise error 264 | return jsonobj 265 | 266 | 267 | def getApplicationParameters(self): 268 | application_parameter = {} 269 | for key, value in self.__dict__.items(): 270 | if not key.startswith("__") and not key in self.getMultipartParas() and not key.startswith("_RestApi__") and value is not None : 271 | if(key.startswith("_")): 272 | application_parameter[key[1:]] = value 273 | else: 274 | application_parameter[key] = value 275 | #查询翻译字典来规避一些关键字属性 276 | translate_parameter = self.getTranslateParas() 277 | for key, value in application_parameter.items(): 278 | if key in translate_parameter: 279 | application_parameter[translate_parameter[key]] = application_parameter[key] 280 | del application_parameter[key] 281 | return application_parameter 282 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 68 | 69 | 70 | 72 | 73 | 82 | 83 | 84 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 |