我正在为Discord创建一个简单的USPS跟踪机器人。
使用Discord中的!usps TRACKING NUMBER
命令
代码如下:
import shippo
import discord
import asyncio
import datetime
token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
client = discord.Client()
shippo.config.api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
@client.event
async def on_ready():
print('-------------------------')
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('-------------------------')
@client.event
async def on_message(message):
if message.author.bot:
return
if message.content.startswith('!help'):
embed = discord.Embed(title="Help", description="Use `!uSps TRACKING NUMBER` to get started!", color=0x8B4513)
embed.set_author(name="USPS Tracking", url="https://www.usps.com/", icon_url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
embed.set_thumbnail(url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
await message.channel.send(embed=embed)
if message.content.startswith('!'):
cmd = message.content.split()[0].lower()[1:]
args = message.content.split()[1:]
packageTrack = ' '.join(args)
tracking_number = packageTrack
carrier_token = 'usps'
tracking = shippo.Track.get_status(carrier_token, tracking_number)
d1 = datetime.datetime.strptime(tracking['tracking_status']['status_date'], "%Y-%m-%dT%H:%M:%SZ")
new_format = "%m-%d-%Y" + " at " + "%H:%M"
uspsStatus = tracking['tracking_status']['status_details'] + " - " + tracking['tracking_status']['status']
uspsCity = tracking['tracking_status']['location']['city']
uspsState = tracking['tracking_status']['location']['state']
uspsZip = tracking['tracking_status']['location']['zip']
uspsDate = d1.strftime(new_format)
if uspsCity is None:
print("Unavailable")
elif uspsZip is None:
print("Unavailable")
elif uspsState is None:
print("Unavailable")
if cmd == 'usps':
embed = discord.Embed(title="Tracking", color=0x8B4513)
embed.set_author(name="USPS Tracking", url="https://tools.usps.com/go/TrackConfirmAction?tLabels={}".format(str(tracking_number)), icon_url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
embed.set_thumbnail(url="https://www.freepnglogos.com/uploads/usps-png-logo/bridgeport-apartments-usps-png-logo-2.png")
embed.add_field(name="Tracking Number: ", value="{}".format(str(tracking_number)), inline=False)
embed.add_field(name="Status: ", value="{}".format(str(uspsStatus)), inline=False)
embed.add_field(name="Date & Time: ", value="{}".format(str(uspsDate)), inline=False)
embed.add_field(name="Location: ", value="{}".format(str(uspsCity) + ", " + str(uspsState) + " " + str(uspsZip)), inline=False)
await message.channel.send(embed=embed)
client.run(token)
在Line 40
上,uspsCity = tracking['tracking_status']['location']['city']
出现了TypeError: 'NoneType' object is not subscriptable
错误。如您所见,我试图以我认为可行的方式解决它,但它仍然会写入错误。列表和字典仍然让我有些困惑,所以这可能就是为什么我没有得到它的原因。
答案 0 :(得分:0)
此错误表示您尝试获取所有内容(无)。
tracking = shippo.Track.get_status(carrier_token, tracking_number)
我猜这个函数返回None。为了避免这种情况,请添加例如if语句(也可以尝试/捕获):
if tracking not None:
uspsStatus = tracking['tracking_status']['status_details'] + " - " + tracking['tracking_status']['status']
uspsCity = tracking['tracking_status']['location']['city']
uspsState = tracking['tracking_status']['location']['state']
uspsZip = tracking['tracking_status']['location']['zip']