微信公众号
蘑菇云创造


微信交流群

【项目介绍】利用计算机定期查询快递物流信息,有变动时主动提醒
欢迎小伙伴们来到第二部分,在前文中 Latest Linux Distributions on LattePanda and Kernel Customization 我们费尽周折配置好了相关环境,本文开始进入第二部分:Core Code to Track the Packages | 包裹监视追踪项目的核心代码。
在这里我们会用到以下知识:
1. Interaction between MPU and MCU on LattePanda with Firmata protocol | LattePanda上Linux和Arduino使用Firmata协议进行交互
2. Python GUI Programming with remi | Python图形化编程(使用remi)
3. Usage of TinyDB——a lightweight database | 介绍轻量级数据库TinyDB的使用
4. Wechat notification via ServerChan | 使用Server酱实现微信通知功能
5. Remote Development with Visual Studio Code | 使用VSC进行远程开发
这一部分将实现如下功能:
1. 网页前端添加待监视快递信息
2. 查询的所有快递历史记录
3. 自定义查询频率
4. 快递信息变动时微信通知
可能很多小伙伴要问了,我的淘宝、京东、菜鸟裹裹也可以帮我查快递,为啥还要弄这个哩?
1. 隐私性。现在的信息泄露太严重了,不想使用第三方软件。
2. 合并通知。希望有一个软件可以统一查询大多数的
3. 减少冗杂的程序。不希望安装过多软件,特别国内的一些软件太流氓,捆绑过多无用功能
4. 物流信息的订阅与实时追踪。一般的是服务端定时 push 物流信息到手机上,可能存在一定滞后性,而主动 pull 物流信息则可以更快获得相关信息。
另外我不知道大家是怎样,我有时候买到心仪的东西,特别盼着早点到货,然后隔一会就去打开手机客户端刷新一下查看快递信息,时间久了浪费生命,所以想着用电脑帮我查,有变动主动告诉我。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Code_Paintium'
import requests, time, sys
from tinydb import TinyDB, Query
db = TinyDB("/home/sjqlwy/Projects/kd/db.json")
parcel = Query()
# 填入自己的授权密钥,http://www.kdpt.net/express_api.html
# 支持快递公司列表 http://www.kdpt.net/index.html#companies
id = 'YOURIDKEY'
# 增加数据记录
def AddItem(name, com, postid):
if db.search(parcel.postid == postid) == []:
db.insert({'name': str(name), 'com': str(com), 'postid': str(postid), 'Fstatus': {}, 'Cstatus': {}, 'state': ''})
# 微信提醒
def fqtt(desp):
payload_ftqq = {'text': name, 'desp': str(desp)}
requests.get('https://sc.ftqq.com/YOURKEY.send', params=payload_ftqq)
# 检查快递状态
def check_status(com, postid, name, Cstatus):
payload_status = {'id': id, 'com': com, 'nu': postid}
r = requests.get('http://q.kdpt.net/api', params=payload_status).json()
if Cstatus != r['data'][0]:
Cstatus = r['data'][0]
desp = Cstatus['time'], Cstatus['context']
fqtt(desp)
db.update({'Cstatus': Cstatus, 'Fstatus': r['data'], 'state': r['state']}, parcel.postid == postid)
# Main,当没有输入参数时检查已有数据;正确输入参数时创建条目;错误输入时提示
if len(sys.argv) == 4:
AddItem(sys.argv[1], sys.argv[2], sys.argv[3])
elif len(sys.argv) == 1:
pass
else:
print("INVAIND INPUT! pls input name, companny, postid and try again.")
print("e.g., python3 kd.py Gaoda zhongtong zt1124991")
exit
# 仅检查未签收的项目,注意调用时间不小于1s
for item in db.search(parcel.state != '3'):
com = item['com']
postid = item['postid']
name = item['name']
Cstatus = item['Cstatus']
# print(Cstatus)
check_status(com, postid, name, Cstatus)
time.sleep(2)