├── requirements.txt ├── README.md ├── main.py ├── Dockerfile ├── timer.py ├── LICENSE ├── .gitignore ├── db.py ├── bot.py └── api.py /requirements.txt: -------------------------------------------------------------------------------- 1 | pyTelegramBotAPI==2.3.1 2 | requests==2.12.5 3 | MarkupSafe==1.0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PackageTracker Bot 2 | 3 | --- 4 | ## Quick start 5 | ```bash 6 | docker run -e BOT_ID=YOUR_ID -v /data/ptb:/usr/app/db indexyz/packagetrackerbot 7 | ``` 8 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import telebot 3 | import timer 4 | import bot 5 | import os 6 | 7 | logging.basicConfig(level=logging.INFO, 8 | format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') 9 | 10 | logging.info("Begin start server.") 11 | tgBot = telebot.TeleBot(os.getenv("BOT_ID", "")) 12 | 13 | bot.getTracker(tgBot, logging)() 14 | 15 | timer.getTimer(tgBot, logging)("Timer").start() 16 | 17 | logging.info("Start polling") 18 | def _pull(): 19 | try: 20 | tgBot.polling(none_stop=True, interval=1) 21 | except Exception as e: 22 | _pull() 23 | 24 | _pull() 25 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:2.7.14-alpine3.6 2 | MAINTAINER FAN VINGA Indexyz 3 | 4 | ADD . /usr/app 5 | 6 | RUN apk update && apk add --virtual .build-deps \ 7 | git \ 8 | tar \ 9 | autoconf \ 10 | automake \ 11 | make \ 12 | build-base \ 13 | linux-headers && \ 14 | apk add --virtual runtime-tools \ 15 | openssl-dev \ 16 | libffi-dev && \ 17 | mkdir -p /usr/app/db && \ 18 | pip install requests[security] && \ 19 | pip install -r /usr/app/requirements.txt && \ 20 | apk del .build-deps && rm -rf /var/cache/apk/* 21 | 22 | WORKDIR "/usr/app/db" 23 | ENTRYPOINT ["python"] 24 | CMD ["/usr/app/main.py"] 25 | -------------------------------------------------------------------------------- /timer.py: -------------------------------------------------------------------------------- 1 | import threading 2 | import time 3 | import api 4 | import db 5 | 6 | DATABASE = db.getDb("bot.db") 7 | 8 | 9 | def getTimer(bot, logger): 10 | class Timer(threading.Thread): 11 | def __init__(self, threadName): 12 | super(Timer, self).__init__(name=threadName) 13 | 14 | def run(self): 15 | while True: 16 | for item in DATABASE.getAllPackages(): 17 | information = api.TrackerApi.getPackageInformation(item[0], item[3]) 18 | if information["data"] and information["data"][0]["time"] != item[4]: 19 | logger.info("Found update: " + item[0]) 20 | bot.send_message(item[2], item[5] + "\n" + information["data"][0]["data"] + "\nStatus: " + 21 | api.getStatusFromCode(information["status"])) 22 | DATABASE.update(item[2], item[0], information["status"], information["data"][0]["time"]) 23 | logger.info("Timer sleeping.") 24 | time.sleep(60 * 10) 25 | 26 | return Timer 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 ITelegramBot 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv/ 83 | ENV/ 84 | 85 | # Spyder project settings 86 | .spyderproject 87 | 88 | # Rope project settings 89 | .ropeproject 90 | 91 | # Ignore db 92 | *.db -------------------------------------------------------------------------------- /db.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sqlite3 3 | 4 | DB_TABEL = "packages" 5 | 6 | 7 | def getDb(path): 8 | def getCursor(func): 9 | def __call(*args, **kwargs): 10 | conn = sqlite3.connect(path) 11 | ret = func(conn, *args, **kwargs) 12 | conn.commit() 13 | conn.close() 14 | return ret 15 | return __call 16 | 17 | def getCs(func): 18 | def __call(*args, **kwargs): 19 | conn = sqlite3.connect(path) 20 | cs = conn.cursor() 21 | ret = func(cs, *args, **kwargs) 22 | conn.commit() 23 | 24 | cs.close() 25 | conn.close() 26 | return ret 27 | return __call 28 | 29 | class TrackerDb(object): 30 | def __init__(self): 31 | pass 32 | 33 | @staticmethod 34 | @getCursor 35 | def init(conn): 36 | conn.execute( 37 | "CREATE TABLE IF NOT EXISTS " + DB_TABEL + "(num char, status int, user char, pType char, lastDate " 38 | "char, packageName char) " 39 | ) 40 | 41 | @staticmethod 42 | @getCs 43 | def getAllPackages(cs): 44 | cs.execute( 45 | "SELECT * FROM " + DB_TABEL 46 | ) 47 | return cs.fetchall() 48 | 49 | @staticmethod 50 | @getCs 51 | def getUnfinishAll(cs): 52 | cs.execute( 53 | "SELECT * FROM " + DB_TABEL + " WHERE status=1 AND status=0" 54 | ) 55 | return cs.fetchall() 56 | 57 | @staticmethod 58 | @getCs 59 | def getUserAll(cs, user): 60 | cs.execute( 61 | "SELECT * FROM " + DB_TABEL + " WHERE user='" + str(user) + "'" 62 | ) 63 | return cs.fetchall() 64 | 65 | @staticmethod 66 | @getCs 67 | def checkDump(cs, user, num, pType): 68 | cs.execute( 69 | "SELECT * FROM " + DB_TABEL + " WHERE num='" + str(num) + "' AND user='" + str(user) 70 | + "' AND pType='" + pType + "\'" 71 | ) 72 | return len(cs.fetchall()) == 0 73 | 74 | @staticmethod 75 | @getCs 76 | def newPackage(cs, user, num, pType, lastDate, packageName, status): 77 | if not TrackerDb.checkDump(user, num, pType): 78 | raise ValueError("Dump") 79 | cs.execute( 80 | "INSERT INTO " + DB_TABEL + " values (?,?,?,?,?,?)", (num, status, user, pType, lastDate, unicode( 81 | packageName)) 82 | ) 83 | 84 | @staticmethod 85 | @getCs 86 | def removePackage(cs, user, num): 87 | cs.execute( 88 | "DELETE FROM " + DB_TABEL + " WHERE num='" + str(num) + "' AND user='" + str(user) + "'" 89 | ) 90 | 91 | @staticmethod 92 | @getCs 93 | def update(cs, user, num, status, lastDate): 94 | cs.execute( 95 | "UPDATE " + DB_TABEL + " SET status='" + str(status) + "', lastDate='" + 96 | str(lastDate) + "' WHERE user='" + str(user) + "' AND num='" + str(num) + "'" 97 | ) 98 | 99 | obj = TrackerDb() 100 | obj.init() 101 | return obj 102 | -------------------------------------------------------------------------------- /bot.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from markupsafe import Markup, escape 3 | import telebot 4 | import api 5 | import sys 6 | import db 7 | 8 | reload(sys) 9 | sys.setdefaultencoding('utf8') 10 | DATABASE = db.getDb("bot.db") 11 | 12 | 13 | def getTracker(bot, logger): 14 | """ 15 | Get the tracker 16 | 17 | :type bot: telebot.TeleBot 18 | :param bot: The TeleBot 19 | :return: the Package Tracker 20 | """ 21 | 22 | class PackagerTracker(object): 23 | def __init__(self): 24 | pass 25 | 26 | @staticmethod 27 | @bot.message_handler(commands=['start']) 28 | def send_welcome(message): 29 | logger.info(str(message.chat.id) + " is start") 30 | bot.reply_to(message, "Hi") 31 | 32 | @staticmethod 33 | @bot.message_handler(commands=['new']) 34 | def create_query(message): 35 | message.text = " ".join(filter(lambda x: x != "", str(message.text).split(' '))) 36 | if len(str(str(message.text).encode("utf-8")).split(" ")[1:]) == 0: 37 | bot.send_message(message.chat.id, u"错误: 请输入单号") 38 | return 39 | 40 | packageID = str(escape(str(message.text).split(" ")[1])) 41 | packageProvider = "" 42 | packageName = u"包裹 %s" % str(packageID)[:4] 43 | packageStatus = 0 44 | 45 | if len(str(message.text).split(" ")[1:]) >= 2: 46 | packageName = str(escape(str(message.text).encode("utf-8").split(" ")[2])) 47 | 48 | if len(str(message.text).split(" ")[1:]) == 3: 49 | packageProvider = str(escape(str(message.text).split(" ")[3])) 50 | 51 | try: 52 | packageProvider = api.TrackerApi.getPackageProvider(packageID) 53 | except ValueError: 54 | if packageProvider == "" or (): 55 | bot.send_message(message.chat.id, u"错误: 包裹未找到, 请检查或者强制添加.") 56 | return 57 | 58 | lastDate = "" 59 | try: 60 | data = api.TrackerApi.getPackageInformation(packageID, packageProvider) 61 | if data["data"]: 62 | lastDate = data["data"][0]["time"] 63 | packageStatus = data["status"] 64 | except ValueError: 65 | pass 66 | 67 | if int(packageStatus) == 0 and packageProvider == "": 68 | bot.send_message(message.chat.id, u"错误: 包裹未找到, 请检查或者强制添加.") 69 | return 70 | 71 | try: 72 | DATABASE.newPackage(message.chat.id, packageID, packageProvider, lastDate, packageName, packageStatus) 73 | except ValueError: 74 | bot.send_message(message.chat.id, u"请不要添加相同的快递!") 75 | return 76 | try: 77 | api.getProvider(packageProvider) 78 | except KeyError: 79 | packageProvider = api.getProviderFromString(packageProvider) 80 | logger.info("Starting a new package: " + packageID) 81 | bot.send_message(message.chat.id, u"你的快递 \'%s[%s]\' 已被保存" % (packageName, 82 | api.getProvider(packageProvider))) 83 | 84 | @staticmethod 85 | @bot.message_handler(commands=['list']) 86 | def list_package(message): 87 | message.text = " ".join(filter(lambda x: x != "", str(message.text).split(' '))) 88 | messages = "" 89 | for package in DATABASE.getUserAll(message.chat.id): 90 | messages += "\n" + package[5] + " - " + package[0] + " - " + api.getStatusFromCode(package[1]) + \ 91 | " - " + api.TrackerApi.getLastMessage(package[0], package[3]) 92 | bot.send_message(message.chat.id, u"你的快递:" + messages) 93 | 94 | @staticmethod 95 | @bot.message_handler(commands=['remove']) 96 | def remove_package(message): 97 | message.text = " ".join(filter(lambda x: x != "", str(message.text).split(' '))) 98 | if len(str(message.text).split(" ")[1:]) == 0: 99 | bot.send_message(message.chat.id, u"错误: 请输入单号") 100 | return 101 | 102 | packageID = str(escape(str(message.text).split(" ")[1])) 103 | 104 | DATABASE.removePackage(message.chat.id, packageID) 105 | 106 | logger.info(u"删除了快递: " + packageID) 107 | 108 | bot.send_message(message.chat.id, u"删除了快递: " + packageID) 109 | 110 | @staticmethod 111 | @bot.message_handler(commands=['fetch']) 112 | def fetch_package(message): 113 | message.text = " ".join(filter(lambda x: x != "", str(message.text).split(' '))) 114 | if len(str(message.text).split(" ")[1:]) == 0: 115 | bot.send_message(message.chat.id, u"错误: 请输入单号") 116 | return 117 | 118 | packageID = str(escape(str(message.text).split(" ")[1])) 119 | 120 | logger.info(u"查找快递: " + packageID) 121 | info = api.TrackerApi.getPackageInformation(packageID) 122 | messages = u"\n包裹状态: " + api.getStatusFromCode(info["status"]) 123 | if info["data"]: 124 | for item in info["data"]: 125 | messages += ("\n" + item["data"] + " - " + item["time"]) 126 | else: 127 | bot.send_message(message.chat.id, u"错误: 包裹未找到") 128 | return 129 | bot.send_message(message.chat.id, u"查找快递: " + packageID + messages) 130 | 131 | return PackagerTracker 132 | -------------------------------------------------------------------------------- /api.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import requests 3 | 4 | PROVIDER_URL = "http://www.kuaidi100.com" 5 | HEADERS = { 6 | "X-Requested-With": "XMLHttpRequest", 7 | "Content-Type": "application/x-www-form-urlencoded", 8 | "User-Agent": "Package Tracker Bot/0.1", 9 | "Accept-Encoding": "gzip, deflate, sdch" 10 | } 11 | 12 | PROVIDER = { 13 | "shentong": u"申通快递", 14 | "ems": u"EMS", 15 | "shunfeng": u"顺丰速运", 16 | "yunda": u"韵达快递", 17 | "yuantong": u"圆通速递", 18 | "zhongtong": u"中通快递", 19 | "huitongkuaidi": u"百世快递", 20 | "tiantian": u"天天快递", 21 | "zhaijisong": u"宅急送", 22 | "xinhongyukuaidi": u"鑫飞鸿", 23 | "cces": u"CCES/国通快递", 24 | "quanyikuaidi": u"全一快递", 25 | "biaojikuaidi": u"彪记快递", 26 | "xingchengjibian": u"星晨急便", 27 | "yafengsudi": u"亚风速递", 28 | "yuanweifeng": u"源伟丰", 29 | "quanritongkuaidi": u"全日通", 30 | "anxindakuaixi": u"安信达", 31 | "minghangkuaidi": u"民航快递", 32 | "fenghuangkuaidi": u"凤凰快递", 33 | "jinguangsudikuaijian": u"京广速递", 34 | "peisihuoyunkuaidi": u"配思货运", 35 | "ztky": u"中铁物流", 36 | "ups": u"UPS", 37 | "fedex": u"FedEx-国际件", 38 | "dhl": u"DHL-中国件", 39 | "aae": u"AAE-中国件", 40 | "datianwuliu": u"大田物流", 41 | "debangwuliu": u"德邦物流", 42 | "xinbangwuliu": u"新邦物流", 43 | "longbanwuliu": u"龙邦速递", 44 | "yibangwuliu": u"一邦速递", 45 | "suer": u"速尔快递", 46 | "lianhaowuliu": u"联昊通", 47 | "guangdongyouzhengwuliu": u"广东邮政", 48 | "zhongyouwuliu": u"中邮物流", 49 | "tiandihuayu": u"天地华宇", 50 | "shenghuiwuliu": u"盛辉物流", 51 | "changyuwuliu": u"长宇物流", 52 | "feikangda": u"飞康达", 53 | "yuanzhijiecheng": u"元智捷诚", 54 | "youzhengguonei": u"邮政包裹/平邮", 55 | "youzhengguoji": u"国际包裹", 56 | "wanjiawuliu": u"万家物流", 57 | "yuanchengwuliu": u"远成物流", 58 | "xinfengwuliu": u"信丰物流", 59 | "wenjiesudi": u"文捷航空", 60 | "quanchenkuaidi": u"全晨快递", 61 | "jiayiwuliu": u"佳怡物流", 62 | "youshuwuliu": u"优速物流", 63 | "kuaijiesudi": u"快捷速递", 64 | "dsukuaidi": u"D速快递", 65 | "quanjitong": u"全际通", 66 | "ganzhongnengda": u"能达速递", 67 | "anjiekuaidi": u"青岛安捷快递", 68 | "yuefengwuliu": u"越丰物流", 69 | "dpex": u"DPEX", 70 | "jixianda": u"急先达", 71 | "baifudongfang": u"百福东方", 72 | "bht": u"BHT", 73 | "wuyuansudi": u"伍圆速递", 74 | "lanbiaokuaidi": u"蓝镖快递", 75 | "coe": u"COE", 76 | "nanjing": u"南京100", 77 | "hengluwuliu": u"恒路物流", 78 | "jindawuliu": u"金大物流", 79 | "huaxialongwuliu": u"华夏龙", 80 | "yuntongkuaidi": u"运通中港", 81 | "jiajiwuliu": u"佳吉快运", 82 | "shengfengwuliu": u"盛丰物流", 83 | "yuananda": u"源安达", 84 | "jiayunmeiwuliu": u"加运美", 85 | "wanxiangwuliu": u"万象物流", 86 | "hongpinwuliu": u"宏品物流", 87 | "gls": u"GLS", 88 | "shangda": u"上大物流", 89 | "zhongtiewuliu": u"中铁快运", 90 | "yuanfeihangwuliu": u"原飞航", 91 | "haiwaihuanqiu": u"海外环球", 92 | "santaisudi": u"三态速递", 93 | "jinyuekuaidi": u"晋越快递", 94 | "lianbangkuaidi": u"联邦快递", 95 | "feikuaida": u"飞快达", 96 | "quanfengkuaidi": u"全峰快递", 97 | "rufengda": u"如风达", 98 | "lejiedi": u"乐捷递", 99 | "zhongxinda": u"忠信达", 100 | "zhimakaimen": u"芝麻开门", 101 | "saiaodi": u"赛澳递", 102 | "haihongwangsong": u"海红网送", 103 | "gongsuda": u"共速达", 104 | "jialidatong": u"嘉里大通", 105 | "ocs": u"OCS", 106 | "usps": u"USPS", 107 | "meiguokuaidi": u"美国快递", 108 | "lijisong": u"成都立即送", 109 | "yinjiesudi": u"银捷速递", 110 | "menduimen": u"门对门", 111 | "disifang": u"递四方", 112 | "zhengzhoujianhua": u"郑州建华", 113 | "hebeijianhua": u"河北建华", 114 | "weitepai": u"微特派", 115 | "dhlde": u"DHL-德国件(DHL Deutschland)", 116 | "tonghetianxia": u"通和天下", 117 | "emsguoji": u"EMS-国际件", 118 | "fedexus": u"FedEx-美国件", 119 | "fengxingtianxia": u"风行天下", 120 | "kangliwuliu": u"康力物流", 121 | "kuayue": u"跨越速运", 122 | "haimengsudi": u"海盟速递", 123 | "shenganwuliu": u"圣安物流", 124 | "yitongfeihong": u"一统飞鸿", 125 | "zhongsukuaidi": u"中速快递", 126 | "neweggozzo": u"新蛋奥硕", 127 | "ontrac": u"OnTrac", 128 | "sevendays": u"七天连锁", 129 | "mingliangwuliu": u"明亮物流", 130 | "vancl": u"凡客配送(作废)", 131 | "huaqikuaiyun": u"华企快运", 132 | "city100": u"城市100", 133 | "sxhongmajia": u"红马甲物流", 134 | "suijiawuliu": u"穗佳物流", 135 | "feibaokuaidi": u"飞豹快递", 136 | "chuanxiwuliu": u"传喜物流", 137 | "jietekuaidi": u"捷特快递", 138 | "longlangkuaidi": u"隆浪快递", 139 | "emsen": u"EMS-英文", 140 | "zhongtianwanyun": u"中天万运", 141 | "hkpost": u"香港(HongKong Post)", 142 | "bangsongwuliu": u"邦送物流", 143 | "guotongkuaidi": u"国通快递", 144 | "auspost": u"澳大利亚(Australia Post)", 145 | "canpost": u"加拿大(Canada Post)", 146 | "canpostfr": u"加拿大邮政", 147 | "upsen": u"UPS-全球件", 148 | "tnten": u"TNT-全球件", 149 | "dhlen": u"DHL-全球件", 150 | "shunfengen": u"顺丰-美国件", 151 | "huiqiangkuaidi": u"汇强快递", 152 | "xiyoutekuaidi": u"希优特", 153 | "haoshengwuliu": u"昊盛物流", 154 | "shangcheng": u"尚橙物流", 155 | "yilingsuyun": u"亿领速运", 156 | "dayangwuliu": u"大洋物流", 157 | "didasuyun": u"递达速运", 158 | "yitongda": u"易通达", 159 | "youbijia": u"邮必佳", 160 | "yishunhang": u"亿顺航", 161 | "feihukuaidi": u"飞狐快递", 162 | "xiaoxiangchenbao": u"潇湘晨报", 163 | "balunzhi": u"巴伦支", 164 | "aramex": u"Aramex", 165 | "minshengkuaidi": u"闽盛快递", 166 | "syjiahuier": u"佳惠尔", 167 | "minbangsudi": u"民邦速递", 168 | "shanghaikuaitong": u"上海快通", 169 | "xiaohongmao": u"北青小红帽", 170 | "gsm": u"GSM", 171 | "annengwuliu": u"安能物流", 172 | "kcs": u"KCS", 173 | "citylink": u"City-Link", 174 | "diantongkuaidi": u"店通快递", 175 | "fanyukuaidi": u"凡宇快递", 176 | "pingandatengfei": u"平安达腾飞", 177 | "guangdongtonglu": u"广东通路", 178 | "zhongruisudi": u"中睿速递", 179 | "kuaidawuliu": u"快达物流", 180 | "jiajikuaidi": u"佳吉快递", 181 | "adp": u"ADP国际快递", 182 | "fardarww": u"颿达国际快递", 183 | "fandaguoji": u"颿达国际快递-英文", 184 | "shlindao": u"林道国际快递", 185 | "sinoex": u"中外运速递-中文", 186 | "zhongwaiyun": u"中外运速递", 187 | "dechuangwuliu": u"深圳德创物流", 188 | "ldxpres": u"林道国际快递-英文", 189 | "ruidianyouzheng": u"瑞典(Sweden Post)", 190 | "postenab": u"PostNord(Posten AB)", 191 | "nuoyaao": u"偌亚奥国际快递", 192 | "chengjisudi": u"城际速递", 193 | "xianglongyuntong": u"祥龙运通物流", 194 | "pinsuxinda": u"品速心达快递", 195 | "yuxinwuliu": u"宇鑫物流", 196 | "peixingwuliu": u"陪行物流", 197 | "hutongwuliu": u"户通物流", 198 | "xianchengliansudi": u"西安城联速递", 199 | "yujiawuliu": u"煜嘉物流", 200 | "yiqiguojiwuliu": u"一柒国际物流", 201 | "fedexcn": u"Fedex-国际件-中文", 202 | "lianbangkuaidien": u"联邦快递-英文", 203 | "zhongtongphone": u"中通(带电话)", 204 | "saiaodimmb": u"赛澳递for买卖宝", 205 | "shanghaiwujiangmmb": u"上海无疆for买卖宝", 206 | "singpost": u"新加坡小包(Singapore Post)", 207 | "yinsu": u"音素快运", 208 | "ndwl": u"南方传媒物流", 209 | "sucheng": u"速呈宅配", 210 | "chuangyi": u"创一快递", 211 | "dianyi": u"云南滇驿物流", 212 | "cqxingcheng": u"重庆星程快递", 213 | "scxingcheng": u"四川星程快递", 214 | "gzxingcheng": u"贵州星程快递", 215 | "ytkd": u"运通中港快递(作废)", 216 | "gatien": u"Gati-英文", 217 | "gaticn": u"Gati-中文", 218 | "jcex": u"jcex", 219 | "peex": u"派尔快递", 220 | "kxda": u"凯信达", 221 | "advancing": u"安达信", 222 | "huiwen": u"汇文", 223 | "yxexpress": u"亿翔", 224 | "donghong": u"东红物流", 225 | "feiyuanvipshop": u"飞远配送", 226 | "hlyex": u"好运来", 227 | "dpexen": u"Toll", 228 | "zengyisudi": u"增益速递", 229 | "kuaiyouda": u"四川快优达速递", 230 | "riyuwuliu": u"日昱物流", 231 | "sutongwuliu": u"速通物流", 232 | "nanjingshengbang": u"晟邦物流", 233 | "anposten": u"爱尔兰(An Post)", 234 | "japanposten": u"日本(Japan Post)", 235 | "postdanmarken": u"丹麦(Post Denmark)", 236 | "brazilposten": u"巴西(Brazil Post/Correios)", 237 | "postnlcn": u"荷兰挂号信(PostNL international registered mail)", 238 | "postnl": u"荷兰挂号信(PostNL international registered mail)", 239 | "emsukrainecn": u"乌克兰EMS-中文(EMS Ukraine)", 240 | "emsukraine": u"乌克兰EMS(EMS Ukraine)", 241 | "ukrpostcn": u"乌克兰邮政包裹", 242 | "ukrpost": u"乌克兰小包、大包(UkrPost)", 243 | "haihongmmb": u"海红for买卖宝", 244 | "fedexuk": u"FedEx-英国件(FedEx UK)", 245 | "fedexukcn": u"FedEx-英国件", 246 | "dingdong": u"叮咚快递", 247 | "dpd": u"DPD", 248 | "upsfreight": u"UPS Freight", 249 | "abf": u"ABF", 250 | "purolator": u"Purolator", 251 | "bpost": u"比利时(Bpost)", 252 | "bpostinter": u"比利时国际(Bpost international)", 253 | "lasership": u"LaserShip", 254 | "parcelforce": u"英国大包、EMS(Parcel Force)", 255 | "parcelforcecn": u"英国邮政大包EMS", 256 | "yodel": u"YODEL", 257 | "dhlnetherlands": u"DHL-荷兰(DHL Netherlands)", 258 | "myhermes": u"MyHermes", 259 | "dpdgermany": u"DPD Germany", 260 | "fastway": u"Fastway Ireland", 261 | "chronopostfra": u"法国大包、EMS-法文(Chronopost France)", 262 | "selektvracht": u"Selektvracht", 263 | "lanhukuaidi": u"蓝弧快递", 264 | "belgiumpost": u"比利时(Belgium Post)", 265 | "upsmailinno": u"UPS Mail Innovations", 266 | "postennorge": u"挪威(Posten Norge)", 267 | "swisspostcn": u"瑞士邮政", 268 | "swisspost": u"瑞士(Swiss Post)", 269 | "royalmailcn": u"英国邮政小包", 270 | "royalmail": u"英国小包(Royal Mail)", 271 | "dhlbenelux": u"DHL Benelux", 272 | "novaposhta": u"Nova Poshta", 273 | "dhlpoland": u"DHL-波兰(DHL Poland)", 274 | "estes": u"Estes", 275 | "tntuk": u"TNT UK", 276 | "deltec": u"Deltec Courier", 277 | "opek": u"OPEK", 278 | "dpdpoland": u"DPD Poland", 279 | "italysad": u"Italy SDA", 280 | "mrw": u"MRW", 281 | "chronopostport": u"Chronopost Portugal", 282 | "correosdees": u"西班牙(Correos de Espa?a)", 283 | "directlink": u"Direct Link", 284 | "eltahell": u"ELTA Hellenic Post", 285 | "ceskaposta": u"捷克(?eská po?ta)", 286 | "siodemka": u"Siodemka", 287 | "seur": u"International Seur", 288 | "jiuyicn": u"久易快递", 289 | "hrvatska": u"克罗地亚(Hrvatska Posta)", 290 | "bulgarian": u"保加利亚(Bulgarian Posts)", 291 | "portugalseur": u"Portugal Seur", 292 | "ecfirstclass": u"EC-Firstclass", 293 | "dtdcindia": u"DTDC India", 294 | "safexpress": u"Safexpress", 295 | "koreapost": u"韩国(Korea Post)", 296 | "tntau": u"TNT Australia", 297 | "thailand": u"泰国(Thailand Thai Post)", 298 | "skynetmalaysia": u"SkyNet Malaysia", 299 | "malaysiapost": u"马来西亚小包(Malaysia Post(Registered))", 300 | "malaysiaems": u"马来西亚大包、EMS(Malaysia Post(parcel,EMS)", 301 | "jd": u"京东", 302 | "saudipost": u"沙特阿拉伯(Saudi Post)", 303 | "southafrican": u"南非(South African Post Office)", 304 | "ocaargen": u"OCA Argentina", 305 | "nigerianpost": u"尼日利亚(Nigerian Postal)", 306 | "chile": u"智利(Correos Chile)", 307 | "israelpost": u"以色列(Israel Post)", 308 | "tollpriority": u"Toll Priority(Toll Online)", 309 | "estafeta": u"Estafeta", 310 | "gdkd": u"港快速递", 311 | "mexico": u"墨西哥(Correos de Mexico)", 312 | "romanian": u"罗马尼亚(Posta Romanian)", 313 | "tntitaly": u"TNT Italy", 314 | "multipack": u"Mexico Multipack", 315 | "portugalctt": u"葡萄牙(Portugal CTT)", 316 | "interlink": u"Interlink Express", 317 | "dpduk": u"DPD UK", 318 | "hzpl": u"华航快递", 319 | "gatikwe": u"Gati-KWE", 320 | "redexpress": u"Red Express", 321 | "mexicodenda": u"Mexico Senda Express", 322 | "tcixps": u"TCI XPS", 323 | "hre": u"高铁速递", 324 | "speedpost": u"新加坡EMS、大包(Singapore Speedpost)", 325 | "emsinten": u"EMS-国际件-英文", 326 | "asendiausa": u"Asendia USA", 327 | "chronopostfren": u"法国大包、EMS-英文(Chronopost France)", 328 | "italiane": u"意大利(Poste Italiane)", 329 | "gda": u"冠达快递", 330 | "chukou1": u"出口易", 331 | "huangmajia": u"黄马甲", 332 | "anlexpress": u"新干线快递", 333 | "shipgce": u"飞洋快递", 334 | "xlobo": u"贝海国际速递", 335 | "emirates": u"阿联酋(Emirates Post)", 336 | "nsf": u"新顺丰(NSF)", 337 | "pakistan": u"巴基斯坦(Pakistan Post)", 338 | "shiyunkuaidi": u"世运快递", 339 | "ucs": u"合众速递(UCS)", 340 | "afghan": u"阿富汗(Afghan Post)", 341 | "belpost": u"白俄罗斯(Belpochta)", 342 | "quantwl": u"全通快运", 343 | "zhaijibian": u"宅急便", 344 | "efs": u"EFS Post", 345 | "tntpostcn": u"TNT Post", 346 | "gml": u"英脉物流", 347 | "gtongsudi": u"广通速递", 348 | "donghanwl": u"东瀚物流", 349 | "rpx": u"rpx", 350 | "rrs": u"日日顺物流", 351 | "yamato": u"黑猫雅玛多", 352 | "htongexpress": u"华通快运", 353 | "kyrgyzpost": u"吉尔吉斯斯坦(Kyrgyz Post)", 354 | "latvia": u"拉脱维亚(Latvijas Pasts)", 355 | "libanpost": u"黎巴嫩(Liban Post)", 356 | "lithuania": u"立陶宛(Lietuvos pa?tas)", 357 | "maldives": u"马尔代夫(Maldives Post)", 358 | "malta": u"马耳他(Malta Post)", 359 | "macedonia": u"马其顿(Macedonian Post)", 360 | "newzealand": u"新西兰(New Zealand Post)", 361 | "moldova": u"摩尔多瓦(Posta Moldovei)", 362 | "bangladesh": u"孟加拉国(EMS)", 363 | "serbia": u"塞尔维亚(PE Post of Serbia)", 364 | "cypruspost": u"塞浦路斯(Cyprus Post)", 365 | "tunisia": u"突尼斯EMS(Rapid-Poste)", 366 | "uzbekistan": u"乌兹别克斯坦(Post of Uzbekistan)", 367 | "caledonia": u"新喀里多尼亚[法国](New Caledonia)", 368 | "republic": u"叙利亚(Syrian Post)", 369 | "haypost": u"亚美尼亚(Haypost-Armenian Postal)", 370 | "yemen": u"也门(Yemen Post)", 371 | "india": u"印度(India Post)", 372 | "england": u"英国(大包,EMS)", 373 | "jordan": u"约旦(Jordan Post)", 374 | "vietnam": u"越南小包(Vietnam Posts)", 375 | "montenegro": u"黑山(Po?ta Crne Gore)", 376 | "correos": u"哥斯达黎加(Correos de Costa Rica)", 377 | "xilaikd": u"西安喜来快递", 378 | "greenland": u"格陵兰[丹麦](TELE Greenland A/S)", 379 | "phlpost": u"菲律宾(Philippine Postal)", 380 | "ecuador": u"厄瓜多尔(Correos del Ecuador)", 381 | "iceland": u"冰岛(Iceland Post)", 382 | "emonitoring": u"波兰小包(Poczta Polska)", 383 | "albania": u"阿尔巴尼亚(Posta shqipatre)", 384 | "aruba": u"阿鲁巴[荷兰](Post Aruba)", 385 | "egypt": u"埃及(Egypt Post)", 386 | "ireland": u"爱尔兰(An Post)", 387 | "omniva": u"爱沙尼亚(Eesti Post)", 388 | "leopard": u"云豹国际货运", 389 | "sinoairinex": u"中外运空运", 390 | "hyk": u"上海昊宏国际货物", 391 | "ckeex": u"城晓国际快递", 392 | "hungary": u"匈牙利(Magyar Posta)", 393 | "macao": u"澳门(Macau Post)", 394 | "postserv": u"台湾(中华邮政)", 395 | "bjemstckj": u"北京EMS", 396 | "kuaitao": u"快淘快递", 397 | "peru": u"秘鲁(SERPOST)", 398 | "indonesia": u"印度尼西亚EMS(Pos Indonesia-EMS)", 399 | "kazpost": u"哈萨克斯坦(Kazpost)", 400 | "lbbk": u"立白宝凯物流", 401 | "bqcwl": u"百千诚物流", 402 | "pfcexpress": u"皇家物流", 403 | "csuivi": u"法国(La Poste)", 404 | "austria": u"奥地利(Austrian Post)", 405 | "ukraine": u"乌克兰小包、大包(UkrPoshta)", 406 | "uganda": u"乌干达(Posta Uganda)", 407 | "azerbaijan": u"阿塞拜疆EMS(EMS AzerExpressPost)", 408 | "finland": u"芬兰(Itella Posti Oy)", 409 | "slovak": u"斯洛伐克(Slovenská Posta)", 410 | "ethiopia": u"埃塞俄比亚(Ethiopian postal)", 411 | "luxembourg": u"卢森堡(Luxembourg Post)", 412 | "mauritius": u"毛里求斯(Mauritius Post)", 413 | "brunei": u"文莱(Brunei Postal)", 414 | "quantium": u"Quantium", 415 | "tanzania": u"坦桑尼亚(Tanzania Posts)", 416 | "oman": u"阿曼(Oman Post)", 417 | "gibraltar": u"直布罗陀[英国]( Royal Gibraltar Post)", 418 | "byht": u"博源恒通", 419 | "vnpost": u"越南EMS(VNPost Express)", 420 | "anxl": u"安迅物流", 421 | "dfpost": u"达方物流", 422 | "huoban": u"兰州伙伴物流", 423 | "tianzong": u"天纵物流", 424 | "bohei": u"波黑(JP BH Posta)", 425 | "bolivia": u"玻利维亚", 426 | "cambodia": u"柬埔寨(Cambodia Post)", 427 | "bahrain": u"巴林(Bahrain Post)", 428 | "namibia": u"纳米比亚(NamPost)", 429 | "rwanda": u"卢旺达(Rwanda i-posita)", 430 | "lesotho": u"莱索托(Lesotho Post)", 431 | "kenya": u"肯尼亚(POSTA KENYA)", 432 | "cameroon": u"喀麦隆(CAMPOST)", 433 | "belize": u"伯利兹(Belize Postal)", 434 | "paraguay": u"巴拉圭(Correo Paraguayo)", 435 | "sfift": u"十方通物流", 436 | "hnfy": u"飞鹰物流", 437 | "iparcel": u"UPS i-parcel", 438 | "bjxsrd": u"鑫锐达", 439 | "mailikuaidi": u"麦力快递", 440 | "rfsd": u"瑞丰速递", 441 | "letseml": u"美联快递", 442 | "cnpex": u"CNPEX中邮快递", 443 | "xsrd": u"鑫世锐达", 444 | "chinatzx": u"同舟行物流", 445 | "qbexpress": u"秦邦快运", 446 | "idada": u"大达物流", 447 | "skynet": u"skynet", 448 | "nedahm": u"红马速递", 449 | "czwlyn": u"云南中诚", 450 | "wanboex": u"万博快递", 451 | "nntengda": u"腾达速递", 452 | "sujievip": u"郑州速捷", 453 | "gotoubi": u"UBI Australia", 454 | "ecmsglobal": u"ECMS Express", 455 | "fastgo": u"速派快递(FastGo)", 456 | "ecmscn": u"易客满", 457 | "eshunda": u"俄顺达", 458 | "suteng": u"广东速腾物流", 459 | "gdxp": u"新鹏快递", 460 | "yundaexus": u"美国云达", 461 | "toll": u"Toll", 462 | "szdpex": u"深圳DPEX", 463 | "baishiwuliu": u"百世物流", 464 | "postnlpacle": u"荷兰包裹(PostNL International Parcels)", 465 | "ltexp": u"乐天速递", 466 | "ztong": u"智通物流", 467 | "xtb": u"鑫通宝物流", 468 | "airpak": u"airpak expresss", 469 | "postnlchina": u"荷兰邮政-中国件", 470 | "colissimo": u"法国小包(colissimo)", 471 | "pcaexpress": u"PCA Express", 472 | "hanrun": u"韩润", 473 | "tnt": u"TNT", 474 | "cosco": u"中远e环球", 475 | "sundarexpress": u"顺达快递", 476 | "ajexpress": u"捷记方舟", 477 | "arkexpress": u"方舟速递", 478 | "adaexpress": u"明大快递", 479 | "changjiang": u"长江国际速递", 480 | "bdatong": u"八达通", 481 | "stoexpress": u"美国申通", 482 | "epanex": u"泛捷国际速递", 483 | "shunjiefengda": u"顺捷丰达", 484 | "nmhuahe": u"华赫物流", 485 | "deutschepost": u"德国(Deutsche Post)", 486 | "baitengwuliu": u"百腾物流", 487 | "pjbest": u"品骏快递", 488 | "quansutong": u"全速通", 489 | "zhongjiwuliu": u"中技物流", 490 | "jiuyescm": u"九曳供应链", 491 | "tykd": u"天翼快递", 492 | "dabei": u"德意思", 493 | "chengji": u"城际快递", 494 | "chengguangkuaidi": u"程光快递", 495 | "sagawa": u"佐川急便", 496 | "lantiankuaidi": u"蓝天快递", 497 | "yongchangwuliu": u"永昌物流", 498 | "birdex": u"笨鸟海淘", 499 | "yizhengdasuyun": u"一正达速运", 500 | "jdorder": u"京东订单", 501 | "sdyoupei": u"优配速运", 502 | "trakpak": u"TRAKPAK", 503 | "gts": u"GTS快递", 504 | "aolau": u"AOL澳通速递", 505 | "yiex": u"宜送物流", 506 | "tongdaxing": u"通达兴物流", 507 | "hkposten": u"香港(HongKong Post)英文", 508 | "suningorder": u"苏宁订单", 509 | "flysman": u"飞力士物流", 510 | "zhuanyunsifang": u"转运四方", 511 | "ilogen": u"logen路坚", 512 | "dongjun": u"成都东骏物流", 513 | "japanpost": u"日本郵便", 514 | "jiajiatong56": u"佳家通货运", 515 | "jrypex": u"吉日优派", 516 | "xaetc": u"西安胜峰", 517 | "doortodoor": u"CJ物流", 518 | "xintianjie": u"信天捷快递", 519 | "sd138": u"泰国138国际物流", 520 | "hjs": u"猴急送", 521 | "quanxintong": u"全信通快递", 522 | "amusorder": u"amazon-国际订单", 523 | "junfengguoji": u"骏丰国际速递", 524 | "kingfreight": u"货运皇", 525 | "ycexpress": u"远成快运", 526 | "subida": u"速必达", 527 | "sucmj": u"特急便物流", 528 | "yamaxunwuliu": u"亚马逊中国", 529 | "jinchengwuliu": u"锦程物流", 530 | "jgwl": u"景光物流", 531 | "yufeng": u"御风速运", 532 | "zhichengtongda": u"至诚通达快递", 533 | "rytsd": u"日益通速递", 534 | "hangyu": u"航宇快递", 535 | "pzhjst": u"急顺通", 536 | "yousutongda": u"优速通达", 537 | "qinyuan": u"秦远物流", 538 | "auexpress": u"澳邮中国快运", 539 | "zhdwl": u"众辉达物流", 540 | "fbkd": u"飞邦快递", 541 | "huada": u"华达快运", 542 | "fox": u"FOX国际快递", 543 | "huanqiu": u"环球速运", 544 | "huilian": u"辉联物流", 545 | "a2u": u"A2U速递", 546 | "ueq": u"UEQ快递", 547 | "scic": u"中加国际快递", 548 | "yidatong": u"易达通", 549 | "yisong": u"宜送", 550 | "ruexp": u"捷网俄全通", 551 | "htwd": u"华通务达物流", 552 | "speedoex": u"申必达", 553 | "lianyun": u"联运快递", 554 | "jieanda": u"捷安达", 555 | "shlexp": u"SHL畅灵国际物流", 556 | "ewe": u"EWE全球快递", 557 | "abcglobal": u"全球快运", 558 | "mangguo": u"芒果速递", 559 | "goldhaitao": u"金海淘", 560 | "jiguang": u"极光转运", 561 | "ftd": u"富腾达国际货运", 562 | "dcs": u"DCS", 563 | "chengda": u"成达国际速递", 564 | "zhonghuan": u"中环快递", 565 | "shunbang": u"顺邦国际物流", 566 | "qichen": u"启辰国际速递", 567 | "auex": u"澳货通", 568 | "aosu": u"澳速物流", 569 | "aus": u"澳世速递", 570 | "dangdang": u"当当", 571 | "tianma": u"天马迅达", 572 | "mjexp": u"美龙快递", 573 | "vipshop": u"唯品会(vip)", 574 | "chunfai": u"香港骏辉物流", 575 | "zenzen": u"三三国际物流", 576 | "mxe56": u"淼信快递", 577 | "hipito": u"海派通", 578 | "gome": u"国美", 579 | "pengcheng": u"鹏程快递", 580 | "guanting": u"冠庭国际物流", 581 | "yhdshop": u"1号店", 582 | "jinan": u"金岸物流", 583 | "haidaibao": u"海带宝", 584 | "cllexpress": u"澳通华人物流", 585 | "banma": u"斑马物流", 586 | "youjia": u"友家速递", 587 | "buytong": u"百通物流", 588 | "xingyuankuaidi": u"新元快递", 589 | "amcnorder": u"amazon-国内订单", 590 | "quansu": u"全速物流", 591 | "sunjex": u"新杰物流", 592 | "lutong": u"鲁通快运", 593 | "xynyc": u"新元国际", 594 | "xiaocex": u"小C海淘", 595 | "airgtc": u"航空快递", 596 | "dindon": u"叮咚澳洲转运", 597 | "hqtd": u"环球通达 ", 598 | "xiaomi": u"小米", 599 | "sfbest": u"顺丰优选", 600 | "haoyoukuai": u"好又快物流", 601 | "yongwangda": u"永旺达快递", 602 | "mchy": u"木春货运", 603 | "flyway": u"程光快递", 604 | "qzx56": u"全之鑫物流", 605 | "bsht": u"百事亨通", 606 | "ilyang": u"ILYANG", 607 | "xianfeng": u"先锋快递", 608 | "timedg": u"万家通快递", 609 | "meiquick": u"美快国际物流", 610 | "tny": u"泰中物流", 611 | "valueway": u"美通", 612 | "sunspeedy": u"新速航", 613 | "bphchina": u"速方", 614 | "yingchao": u"英超物流", 615 | "correoargentino": u"阿根廷(Correo Argentina)", 616 | "vanuatu": u"瓦努阿图(Vanuatu Post)", 617 | "barbados": u"巴巴多斯(Barbados Post)", 618 | "samoa": u"萨摩亚(Samoa Post)", 619 | "fiji": u"斐济(Fiji Post)", 620 | "edlogistics": u"益递物流", 621 | "esinotrans": u"中外运", 622 | "kuachangwuliu": u"跨畅(直邮易)", 623 | "cnausu": u"中澳速递", 624 | "gslhkd": u"联合快递", 625 | "ccd": u"河南次晨达", 626 | "benteng": u"奔腾物流", 627 | "mapleexpress": u"今枫国际快运", 628 | "topspeedex": u"中运全速", 629 | "yjxlm": u"宜家行", 630 | "otobv": u"中欧快运", 631 | "jmjss": u"金马甲", 632 | "onehcang": u"一号仓", 633 | "hfwuxi": u"和丰同城", 634 | "wtdchina": u"威时沛运货运", 635 | "shunjieda": u"顺捷达", 636 | "qskdyxgs": u"千顺快递", 637 | "tlky": u"天联快运", 638 | "cloudexpress": u"CE易欧通国际速递", 639 | "speeda": u"行必达", 640 | "zhongtongguoji": u"中通国际", 641 | "xipost": u"西邮寄", 642 | "nle": u"NLE", 643 | "nlebv": u"亚欧专线", 644 | "stkd": u"顺通快递", 645 | "sinatone": u"信联通", 646 | "auod": u"澳德物流", 647 | "ahdf": u"德方物流", 648 | "wzhaunyun": u"微转运", 649 | "lntjs": u"沈阳特急送", 650 | "iexpress": u"iExpress", 651 | "bcwelt": u"BCWELT", 652 | "euasia": u"欧亚专线", 653 | "ycgky": u"远成快运" 654 | } 655 | 656 | 657 | class TrackerApi(object): 658 | """ API 使用快递100的API """ 659 | 660 | def __init__(self): 661 | pass 662 | 663 | @staticmethod 664 | def getPackageProvider(packageID): 665 | req = requests.post(PROVIDER_URL + "/autonumber/autoComNum?text=" + str(packageID), headers=HEADERS) 666 | if not req.json()["auto"]: 667 | raise ValueError("Invalid Package Number!") 668 | else: 669 | return req.json()["auto"][0]["comCode"] 670 | 671 | @staticmethod 672 | def getPackageInformation(packageID, packageProvider=""): 673 | if not packageProvider: 674 | packageProvider = TrackerApi.getPackageProvider(packageID) 675 | req = requests.post(PROVIDER_URL + "/query?type=%s&postid=%s&valicode=" % ( 676 | packageProvider, packageID 677 | ), headers=HEADERS) 678 | if "status" in req.json() and req.json()["status"] == "201": 679 | return { 680 | "status": 0, 681 | "data": [] 682 | } 683 | # print req.json() 684 | code = int(req.json()["state"]) 685 | # print code 686 | if code in [1, 5, 0]: 687 | statusCode = 1 688 | elif code == 3: 689 | statusCode = 2 690 | else: 691 | statusCode = 3 692 | 693 | data = [] 694 | 695 | for item in req.json()["data"]: 696 | data.append({ 697 | "data": item["context"], 698 | "time": item["time"] 699 | }) 700 | 701 | return { 702 | "status": statusCode, 703 | "data": data 704 | } 705 | 706 | @staticmethod 707 | def getLastMessage(packageID, packageProvider=""): 708 | info = TrackerApi.getPackageInformation(packageID, packageProvider) 709 | if info["data"]: 710 | return info["data"][0]["data"] 711 | else: 712 | return "Unknown" 713 | 714 | 715 | def getStatusFromCode(code): 716 | return { 717 | 0: u"未知", 718 | 1: u"发送中", 719 | 2: u"已到达", 720 | 3: u"困难" 721 | }[code] 722 | 723 | 724 | def getProvider(code): 725 | return PROVIDER[code] 726 | 727 | 728 | def getProviderFromString(stri): 729 | return PROVIDER.keys()[PROVIDER.values().index(stri)] --------------------------------------------------------------------------------