📜 ⬆️ ⬇️

Flightstats API: We write our board of arrivals with Boeing and Airbus

Introduction


Everyone reading this post - hello.
Aviation is my hobby, I already wrote about it. I am ready to stand for hours and photograph planes, watch a video about them, read the blogs of pilots, monitor traffic on fr24.com . And I also like the fact that in aviation there are only a few abbreviations: ECAM, CDA, ACESS, APU, and so on. In general, the magic. But almost all people from my environment are indifferent to aviation: “Well, an airplane is like an airplane. Great, yes. What? Boeing 777-300ER? Well, clear, clear ... ". But nothing can be done, the taste and color of all the markers are different.
How did the idea of ​​fasting come to me? It so happened that I live 20 minutes from Sheremetyevo Airport. Somehow I had a free hour and came to take some pictures. During the time I was there, about 10 aircraft flew past me. Almost all - Aeroflot. I do not argue, Aeroflot has interesting boards. For example, Dobrolet or Khokhloma . But that day I was not lucky, I did not see anything like it. And then I thought that it would be very useful to plan such trips. This is how the idea of ​​fasting was born. I wanted to have the following functionality: a table of departures - arrivals for the selected airport, highlighting of both interesting and not very bots in color, export to pdf.

Getting started!

So, first of all you need to go to https://developer.flightstats.com , register, go to the Dashboard and click on the button "Create a new application". This is necessary to get the AppId + AppKey bundle, without which access to the API is impossible. In general, it is paid, but there is also a free tariff plan - the " Evaluation Plan ", its capabilities for our needs will be enough in full. After that, boldly go " Get Started " -> " Flex API Reference " -> " Flight Status & Track API " -> " Flight Status & Track by Airport ". At the bottom of the page there is a section " Interactive Documentation ", select " Airport status (departures) ". This request has 7 required fields that must be filled in as follows:
appIdappKeyairportyearmonthdayhourOfDay
Your appIdYour appKeySvo2013127ten


After a couple of seconds, an answer will appear.

In other words, we asked to give us information about flights that will take off on December 7, 2014 after 10 hours from Sheremetyevo Airport. Yes, SVO - Sheremetyevo. And also UUEE - also Sheremetyevo. Remember, a little higher I talked about cuts? Here, we stumbled upon the first.
')

Airport codes. IATA vs. ICAO


IATA - International Air Transport Association, IATA (eng. International Air Transport Association) is an international non-governmental organization. The Association acts as the coordinator and representative of the interests of the air transport industry in such areas as flight safety, flight operations, tariff policy, maintenance, aviation safety, the development of international standards in cooperation with ICAO, etc.

ICAO - The International Civil Aviation Organization is a specialized UN agency that establishes international standards for civil aviation and coordinates its development in order to increase safety and efficiency.

Both IATA and ICAO have their own airport codes. They are different because the IATA codes are chosen to be consonant with the airport name, and the ICAO code is based on where the airport is located. That is why the Sheremetevo IATA code is SVO, and ICAO has UUEE, for Pulkovo, for example, LED and ULLI, respectively. The only exceptions are US airports (added "K" to the IATA code: Los Angeles - LAX - KLAX) and Canada (added "C": Toronto - YYZ - CYYZ).

Answer flightstats


With this request, the answer has the following structure:
{   } "appendix": { "airlines": {...} "airports": {...} "equipments": {...} "flightStatuses": {...} } 

The airlines , airports and equipments sections contain descriptions of airlines, airports and types of aircraft that are present in the flightStatuses section.
The “airlines” section is extremely simple:
 "airlines": [ { "fs": "SU", "iata": "SU", "icao": "AFL", "name": "Aeroflot", "active": true }, ... 

The "fs" field contains the airline code in the flightStats database. It almost always coincides with the IATA code.

The “airports” section is more complicated:
 "airports": [ { "fs": "BUD", "iata": "BUD", "icao": "LHBP", "name": "Liszt Ferenc International Airport", "city": "Budapest", "cityCode": "BUD", "countryCode": "HU", "countryName": "Hungary", "regionName": "Europe", "timeZoneRegionName": "Europe/Budapest", "localTime": "2013-12-06T20:51:56.974", "utcOffsetHours": 1, "latitude": 47.433037, "longitude": 19.261621, "elevationFeet": 495, "classification": 2, "active": true, "delayIndexUrl": "https://api.flightstats.com/flex/delayindex/rest/v1/json/airports/BUD?codeType=fs", "weatherUrl": "https://api.flightstats.com/flex/weather/rest/v1/json/all/BUD?codeType=fs" }, ... 

It contains all the necessary information, except for the weather and the delay coefficient, which must be requested separately.

Section "equipments".
 "equipments": [ { "iata": "319", "name": "Airbus Industrie A319", "turboProp": false, "jet": true, "widebody": false, "regional": false }, ... 

Describes the basic characteristics of the aircraft.

Distract again from the API.

Learning to distinguish between types of aircraft


It is not difficult at all. I prepared a small scheme (clickable), which will help you easily navigate the world of flying machines. Plus an additional guide from Rascko

And now the confirmation of my words:
Airbus A380 vs. Boeing 747


IL-96 vs. Airbus A340


Boeing 737 vs. Airbus A320


Boeing 757 vs. Boeing 767


Airbus A330 vs. Boeing 777


Yak-42 vs. Tu-154 vs. McDonnel Douglas MD-11



Parse the flightStatus


Contents of flightStatus. Long so hidden
 { "flightId": 317846653, "carrierFsCode": "SU", "flightNumber": "2030", "departureAirportFsCode": "SVO", "arrivalAirportFsCode": "BUD", "departureDate": { "dateLocal": "2013-12-07T10:50:00.000", "dateUtc": "2013-12-07T06:50:00.000Z" }, "arrivalDate": { "dateLocal": "2013-12-07T10:35:00.000", "dateUtc": "2013-12-07T09:35:00.000Z" }, "status": "L", "schedule": { "flightType": "J", "serviceClasses": "RJY", "restrictions": "" }, "operationalTimes": { "publishedDeparture": { "dateLocal": "2013-12-07T10:50:00.000", "dateUtc": "2013-12-07T06:50:00.000Z" }, "publishedArrival": { "dateLocal": "2013-12-07T10:35:00.000", "dateUtc": "2013-12-07T09:35:00.000Z" }, "scheduledGateDeparture": { "dateLocal": "2013-12-07T10:50:00.000", "dateUtc": "2013-12-07T06:50:00.000Z" }, "estimatedGateDeparture": { "dateLocal": "2013-12-07T10:50:00.000", "dateUtc": "2013-12-07T06:50:00.000Z" }, "actualGateDeparture": { "dateLocal": "2013-12-07T11:27:00.000", "dateUtc": "2013-12-07T07:27:00.000Z" }, "scheduledGateArrival": { "dateLocal": "2013-12-07T10:35:00.000", "dateUtc": "2013-12-07T09:35:00.000Z" }, "estimatedGateArrival": { "dateLocal": "2013-12-07T11:12:00.000", "dateUtc": "2013-12-07T10:12:00.000Z" }, "actualGateArrival": { "dateLocal": "2013-12-07T10:43:00.000", "dateUtc": "2013-12-07T09:43:00.000Z" } }, "delays": { "departureGateDelayMinutes": 37, "arrivalGateDelayMinutes": 8 }, "flightDurations": { "scheduledBlockMinutes": 165, "blockMinutes": 136 }, "airportResources": { "departureTerminal": "D", "departureGate": "28", "arrivalTerminal": "2" }, "flightEquipment": { "scheduledEquipmentIataCode": "320", "actualEquipmentIataCode": "A320", "tailNumber": "VP-BWI" } }, ... 


The purpose of the fields in most cases is obvious. I will describe in detail only those whose contents are not entirely obvious. And why? That's right, because the reduction.
This is the part of the answer:
 "status": "L", "schedule": { "flightType": "J", "serviceClasses": "RJY", "restrictions": "" }, 

FieldDescription
statusCurrent flight status
A - Active
C - Canceled
D - Diverted - The destination was changed (for example, according to weather conditions)
DN - Data source needed - Nowhere to get status information
L - Landed
NO - Not Operational
R - Redirected
S - Scheduled
U - Unknown
flightTypeFlight type There are 23 of them in total. For example,
J - Scheduled Passanger - Passenger Schedule
M - Scheduled Cargo / Mail (MailOnly) - Freight, but only with letters.
W - Military - Military
serviceClassesService options provided on the flight according to IATA classification. Read more here - http://en.wikipedia.org/wiki/IATA_class_codes
restrictionsRestrictions on the classification of IATA. Learn more - http://www.flyerguide.com/wiki/index.php/Traffic_Restriction_Codes ( ( AA)


Programming


At the moment I am using python 2.7, urllib2 and simplejson.

The first thing to do is connect the necessary libraries and initialize the variables.
 import urllib2 import simplejson appId = " appId " appKey = " appKey " #  .        flightstats,     ICAO  IATA requestedAirport = "SVO" #    . arr - , dep -  flightsType = "arr" #  requestedDate = "2013/12/7" # ,        requestedHour = "15" #  ,      requestedNumHours = "6" 


The next step is to package these variables in the url, send the request and wait for the answer.
 #    url = "https://api.flightstats.com/flex/flightstatus/rest/v2/json/" \ "airport/status/%s/%s/%s/%s?appId=%s&appKey=%s&utc=false&numHours=%s" #      url = url %(requestedAirport, flightsType, requestedDate, requestedHour, appId, appKey, requestedNumHours) #     JSON- req = urllib2.Request(url, None) opener = urllib2.build_opener() f = opener.open(req) response = simplejson.load(f) 


Then parse the auxiliary fields. We need them in order to substitute the detailed names of aircraft and airplanes in the list.
 #     airports = response["appendix"]["airports"] #        (dictionary) airportsDict = dict() #      [ flightstats]:[] for airport in airports: airportsDict[airport["fs"]] = airport["name"] #     ... equipments = response["appendix"]["equipments"] equipmentsDict = dict() for equipment in equipments: equipmentsDict[equipment["iata"]] = equipment["name"], equipment["iata"] #...    airlines = response["appendix"]["airlines"] airlinesDict = dict() for airline in airlines: airlinesDict[airline["fs"]] = airline["name"] 


The result of our code should be this table:
FlightCarrierEquipmentRegistrationFromStdATDToStaStd
XQ114SunExpressBoeing 737-800 PassengerD-ASXAAntalya3:00 p.m.---CGN17: 55: 00.000---


The output will be in HTML.
 #    webPage = "<html><body><table border=\"1\"> \ <tr><th>Flight</th><th>Carrier</th><th>Equipment</th><th>Registration</th><th>From</th><th>STD</th> \ <th>ATD</th><th>To</th><th>STA</th><th>ETA</th></tr>" #     templateRow = "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td> \ <td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>" f = open("./list.html", "w") 


Next, you need to write an auxiliary function.
The values ​​we need are at different depths. For example, carrierFsCode , airport code, at zero depth. And in order to get time, the actual time of departure, you need to operationalTimes --> actualGateDeparture --> dateLocal" down to the second depth: operationalTimes --> actualGateDeparture --> dateLocal" . For this, you need the first auxiliary function.
 def getProperty(status, propertyNames): #     try: #     propertyNames for propertyName in propertyNames: #   status = status[propertyName] #   ! return status except #   ,    return "---" 


Now the most interesting: you need to choose what interests you most in traffic. This is contained in three arrays:
 interestingCarriers = ["RU", # AirBridgeCargo "CU", # Cubana de Aviacion "ME", # China Eastern Airlines "KE", # Korean Air Lines ] interestingEquipments = ["SU9"] # Sukhoi Superjet 100 interestingTailNumbers = ["VP-BGB"] #   Boeing 777-300ER   


And now, actually, the parser:
 for flightStatus in flightStatuses: newRow = templateRow %(getProperty(flightStatus, ["carrierFsCode"]) + getProperty(flightStatus, ["flightNumber"]), airlinesDict[getProperty(flightStatus, ["carrierFsCode"])], getProperty(flightStatus, ["flightEquipment", "scheduledEquipmentIataCode"]), getProperty(flightStatus, ["flightEquipment", "tailNumber"]), str(airportsDict[getProperty(flightStatus, ["departureAirportFsCode"])]).replace("Airport", ""), str(getProperty(flightStatus, ["departureDate", "dateLocal"])).split("T")[-1], str(getProperty(flightStatus, ["operationalTimes", "actualGateDeparture", "dateLocal"])).split("T")[-1], str(airportsDict[getProperty(flightStatus, ["arrivalAirportFsCode"])]).replace("Airport", "") str(getProperty(flightStatus, ["arrivalDate", "dateLocal"])).split("T")[-1], str(getProperty(flightStatus, ["operationalTimes", "estimatedGateArrival", "dateLocal"])).split("T")[-1]) #    if (getProperty(flightStatus, ["carrierFsCode"]) in interestingCarriers) or \ (getProperty(flightStatus, ["flightEquipment", "scheduledEquipmentIataCode"]) in interestingEquipments) or \ (getProperty(flightStatus, ["flightEquipment", "tailNumber"]) in interestingTailNumbers): newRow = newRow.replace("<tr>", "<tr bgcolor=\"#FF0000\">") #     webPage += newRow 


The final touch is to add tags to the bottom of the page and close the file.
 webPage = webPage + "</table></body></html>" f.write(webPage) f.close() 

Work result

FlightCarrierEquipmentRegistrationFromStdATDToStaETA
SU155Aeroflot332VQ-BBECancun international12: 30: 00.00013: 17: 00.000Sheremetyevo International10: 30: 00.00011: 03: 00.000
DL466Delta air lines76W---John F. Kennedy International16: 15: 00.00016: 14: 00.000Sheremetyevo International10:50 am10: 12: 00.000
SU111Aeroflot332VP-BLXMiami international17: 35: 00.00018: 35: 00.000Sheremetyevo International1:45 p.m.13: 46: 00.000
SU103Aeroflot333VP-BDEJohn F. Kennedy International19: 05: 00.000---Sheremetyevo International13: 25: 00.00013: 34: 00.000
UN576Transaero Airlines744EI-XLJPunta cana international19: 55: 00.00021: 18: 00.000Sheremetyevo International14: 50: 00.00015: 35: 00.000
RU566Airbridgecargo74Y---Frankfurt am Main04: 45: 00.000---Sheremetyevo International11: 00: 00.000---
RU498Airbridgecargo74N---Shanghai Pudong International05: 00: 00.000---Sheremetyevo International10:45: 00.000---
SU233Aeroflot332---Indira Gandhi International05: 05: 00.00005: 26: 00.000Sheremetyevo International10: 10: 00.00010: 13: 00.000
RU506Airbridgecargo74N---Milano malpensa05: 30: 00.000---Sheremetyevo International12: 00: 00.000---
SU1827Aeroflot320VQ-BAZSimferopol06: 00: 00.00006: 25: 00.000Sheremetyevo International10: 15: 00.00010: 40: 00.000
SU2437Aeroflot320VP-BLHDusseldorf International06: 05: 00.00006: 27: 00.000Sheremetyevo International12: 25: 00.00012: 24: 00.000
RU440Airbridgecargo74NVP-BIMHong Kong International06: 15: 00.00006: 15: 00.000Sheremetyevo International12: 25: 00.000---
KE529Korean Air Lines74YHL7466Incheon International06: 25: 00.00007: 07: 00.000Sheremetyevo International10: 40: 00.000---
JU650Jat airways733---Belgrad Nikola Tesla06: 45: 00.00006: 45: 00.000Sheremetyevo International12: 35: 00.00012: 39: 00.000
PS561UIA73NUR-GAPKiev / Kyiv - Borispol07: 00: 00.00007: 00: 00.000Sheremetyevo International10: 35: 00.00010: 35: 00.000
SU1009Aeroflot321VQ-BEDKaliningrad07: 10: 00.00007: 36: 00.000Sheremetyevo International10: 00: 00.00010: 26: 00.000
AF1644Air france319F-GRHLCharles de Gaulle07: 15: 00.00007: 13: 00.000Sheremetyevo International13: 55: 00.00013: 52: 00.000
SU1867Aeroflot320VP-BQPZvartnots International08: 10: 00.00008: 21: 00.000Sheremetyevo International11: 00: 00.00011: 11: 00.000
5N502Nordavia Regional Airlines735---Syktyvkar08: 20: 00.00008: 27: 00.000Sheremetyevo International10: 15: 00.00010: 11: 00.000
KC893Air Astana320P4-KBCAstana08: 40: 00.00008: 36: 00.000Sheremetyevo International10: 20: 00.00010: 49: 00.000
SU3Aeroflot321VP-BWOPulkovo08: 55: 00.00009: 04: 00.000Sheremetyevo International10: 20: 00.00010: 29: 00.000
SU1513Aeroflot319VP-BWASurgut09: 00: 00.00008: 59: 00.000Sheremetyevo International10: 35: 00.00010: 34: 00.000
SU1293Aeroflot320VQ-BIVKazan09: 00: 00.00009: 27: 00.000Sheremetyevo International10: 30: 00.00010:50 am
SU1229Aeroflot320VP-BDKNizhniy Novgorod09: 05: 00.00009: 21: 00.000Sheremetyevo International10: 25: 00.00010: 41: 00.000
SU1309Aeroflot319VP-BDOSamara09: 15: 00.00009: 20: 00.000Sheremetyevo International10: 55: 00.00011: 00: 00.000
AY153Finnair319OH-LVIHelsinki-Vantaa09: 25: 00.00009: 29: 00.000Sheremetyevo International13: 05: 00.00012: 57: 00.000
OK892CSA319---Vaclav Havel Prague09: 30: 00.00009: 31: 00.000Sheremetyevo International15: 10: 00.00015: 05: 00.000
SU2005Aeroflot320VP-BWIJ. Paul II International Krakow-Balice09: 35: 00.00009: 56: 00.000Sheremetyevo International14: 40: 00.00014: 49: 00.000
SU1121Aeroflot320VP-BTIAdler / Sochi09: 50: 00.00009: 55: 00.000Sheremetyevo International12:20 pm12: 25: 00.000
SU2685Aeroflot320VQ-BCMSchoenefeld09: 50: 00.00010: 44: 00.000Sheremetyevo International15: 25: 00.00016: 15: 00.000
SU5Aeroflot320VQ-BAXPulkovo09: 55: 00.00010: 20: 00.000Sheremetyevo International11: 15: 00.00011: 40: 00.000
SU1839AeroflotSU9RA-89010Kharkov09: 55: 00.00010: 10: 00.000Sheremetyevo International13: 30: 00.00013: 20: 00.000
SU2321Aeroflot320VQ-BHLFranz Josef Strauss10: 00: 00.00010: 16: 00.000Sheremetyevo International4:00 p.m.16: 16: 00.000
SU1001Aeroflot320VP-BLLKaliningrad10: 05: 00.00010: 25: 00.000Sheremetyevo International12:55 pm13: 15: 00.000
R25807Orrenair738---Barnaul10: 10: 00.00010: 15: 00.000Sheremetyevo International11: 30: 00.00011: 35: 00.000
SU1307Aeroflot320VP-BKXTolmachevo10: 15: 00.00010: 19: 00.000Sheremetyevo International11: 25: 00.00011: 29: 00.000
SU1701Aeroflot333VQ-BNSVladivostok International10: 20: 00.00010: 24: 00.000Sheremetyevo International12: 25: 00.00012: 29: 00.000
SU1805Aeroflot321VP-BOEKiev / Kyiv - Borispol10: 20: 00.00011: 00: 00.000Sheremetyevo International13: 50: 00.00014: 30: 00.000
SU2137Aeroflot321VQ-BHKIstanbul Ataturk10: 20: 00.00011: 03: 00.000Sheremetyevo International15: 15: 00.00015: 26: 00.000
SK734SAS320OY-KAPCopenhagen10: 20: 00.00010: 46: 00.000Sheremetyevo International15:45: 00.00016: 02: 00.000
SU7Aeroflot320---Pulkovo10: 25: 00.00010: 43: 00.000Sheremetyevo International11:45 am: 00.00012: 03: 00.000
SU1813Aeroflot320VP-BRXDonetsk10: 30: 00.00010: 31: 00.000Sheremetyevo International14: 25: 00.00014: 26: 00.000
SU1831Aeroflot320---Minsk International 210:50 am11: 40: 00.000Sheremetyevo International13: 15: 00.00014: 05: 00.000
SU2107Aeroflot320VP-BZSTallinn10:50 am10: 54: 00.000Sheremetyevo International14: 30: 00.00014: 18: 00.000
SU1479Aeroflot319VP-BDMAbakan10: 55: 00.00010: 55: 00.000Sheremetyevo International11:55 am11:55 am
SU1483Aeroflot77WVP-BGBKrasnojarsk11: 00: 00.00011: 13: 00.000Sheremetyevo International11: 35: 00.00011: 48: 00.000
SU2683Aeroflot319VQ-BCORiga11: 00: 00.00011: 24: 00.000Sheremetyevo International14: 35: 00.00014: 44: 00.000
D95399Donavia319VP-BNNStavropol11: 15: 00.00011: 17: 00.000Sheremetyevo International13: 30: 00.00013: 32: 00.000
SU2035AeroflotSU9RA-89008Otopeni International11: 15: 00.00011: 28: 00.000Sheremetyevo International15: 35: 00.00015: 33: 00.000
SU11Aeroflot320---Pulkovo11: 30: 00.00011: 49: 00.000Sheremetyevo International12:45 pm13: 04: 00.000
SU1139Aeroflot321VQ-BKUAdler / Sochi11: 35: 00.00011:55 amSheremetyevo International2:00 p.m.14: 20: 00.000
SU1211Aeroflot320VQ-BITSamara11: 40: 00.00012: 13: 00.000Sheremetyevo International13: 25: 00.00013: 42: 00.000
SU1759AeroflotSU9VP-BZQVolgograd11:45 am: 00.00011: 53: 00.000Sheremetyevo International13: 35: 00.00013: 43: 00.000
SU1255Aeroflot319VP-BDNBegishevo11: 50: 00.00012: 03: 00.000Sheremetyevo International13: 40: 00.00013: 53: 00.000
SU1643Aeroflot320VQ-BIWAstrakhan11: 50: 00.00011:55 amSheremetyevo International14: 10: 00.00014: 15: 00.000
SU1305Aeroflot320VP-BLPMineralnye vody11: 50: 00.00012: 08: 00.000Sheremetyevo International14: 15: 00.00014: 33: 00.000
SU1761Aeroflot738VP-BRHChita11:55 am12: 10: 00.000Sheremetyevo International12:45 pm1:00 p.m.
SU1221Aeroflot320VP-BMFNizhniy Novgorod12: 05: 00.00012: 12: 00.000Sheremetyevo International13: 10: 00.00013: 17: 00.000
SU1743Aeroflot333VQ-BQXYuzhno-Sakhalinsk12: 10: 00.00012:20 pmSheremetyevo International14: 05: 00.00014: 15: 00.000
D95301Donavia734VQ-BCSRostov12: 15: 00.00012: 28: 00.000Sheremetyevo International14: 15: 00.00014: 28: 00.000
SU13Aeroflot319---Pulkovo12:20 pm12: 50: 00.000Sheremetyevo International13: 35: 00.00014: 05: 00.000
5N117Nordavia Regional Airlines735---Arkhangelsk12:20 pm12: 25: 00.000Sheremetyevo International14: 05: 00.00014: 10: 00.000
SU1191Aeroflot320VQ-BEAKazan12: 25: 00.00013: 04: 00.000Sheremetyevo International13: 55: 00.00014: 34: 00.000
SU1751Aeroflot738VP-BRFYakutsk12: 30: 00.00012: 58: 00.000Sheremetyevo International13: 15: 00.00013: 43: 00.000
SU1547AeroflotSU9---Anapa12: 30: 00.00012: 50: 00.000Sheremetyevo International2:45 pm15: 05: 00.000
D95377Donavia319---Mineralnye vody12:45 pm13: 03: 00.000Sheremetyevo International15: 10: 00.00015: 28: 00.000
D95363Donavia319VP-BQKRostov13: 05: 00.00013: 20: 00.000Sheremetyevo International15: 05: 00.00015: 20: 00.000
SU1411Aeroflot321VQ-BOIKoltsovo International13: 15: 00.00013: 43: 00.000Sheremetyevo International13: 40: 00.00014: 08: 00.000
SU1731Aeroflot333VQ-BCQPetropavlovsk-Kamchatsky13: 30: 00.00013: 44: 00.000Sheremetyevo International14: 30: 00.00014: 44: 00.000
SU15Aeroflot320---Pulkovo13: 30: 00.00013: 39: 00.000Sheremetyevo International2:45 pm14: 52: 00.000
SU1231Aeroflot320VP-BLRUfa13: 55: 00.00014: 19: 00.000Sheremetyevo International2:00 p.m.14: 24: 00.000
SU1421Aeroflot320VP-BNLChelyabinsk13: 55: 00.00013: 56: 00.000Sheremetyevo International14: 20: 00.00014: 21: 00.000
R25803Orrenair738---Irkutsk14: 05: 00.00014: 30: 00.000Sheremetyevo International14: 50: 00.00015: 15: 00.000
SU1201AeroflotSU9---Perm14: 10: 00.000---Sheremetyevo International14: 25: 00.00014: 25: 00.000
5N9134Nordavia Regional Airlines------Kazan14: 10: 00.00015: 07: 00.000Sheremetyevo International15: 30: 00.000---
SU17Aeroflot320---Pulkovo14: 25: 00.00014: 56: 00.000Sheremetyevo International15: 40: 00.00016: 11: 00.000


Future work


Source: https://habr.com/ru/post/205210/


All Articles