importer.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #!/usr/bin/env python3
  2. from http.client import HTTPSConnection
  3. import json
  4. import operator
  5. import time
  6. import oursql
  7. import db
  8. def insert_kill(c, kill):
  9. print('inserting', kill['killID'], end=' ')
  10. try:
  11. db.execute(c, 'INSERT INTO kills (kill_id, solar_system_id, kill_time, moon_id) VALUES(?, ?, ?, ?)',
  12. kill['killID'], kill['solarSystemID'], kill['killTime'], kill['moonID'])
  13. except oursql.IntegrityError as e:
  14. print('duplicate')
  15. if e.args[0] == oursql.errnos['ER_DUP_ENTRY']:
  16. return
  17. raise
  18. victim = kill['victim']
  19. parambatch = [(
  20. kill['killID'], 1, victim['characterID'], victim['characterName'], victim['shipTypeID'],
  21. victim['allianceID'], victim['allianceName'], victim['corporationID'], victim['corporationName'], victim['factionID'], victim['factionName'],
  22. victim['damageTaken'], None, None, None,
  23. )]
  24. for attacker in kill['attackers']:
  25. parambatch.append((
  26. kill['killID'], 0, attacker['characterID'], attacker['characterName'], attacker['shipTypeID'],
  27. attacker['allianceID'], attacker['allianceName'], attacker['corporationID'], attacker['corporationName'], attacker['factionID'], attacker['factionName'],
  28. attacker['damageDone'], attacker['finalBlow'], attacker['securityStatus'], attacker['weaponTypeID'],
  29. ))
  30. c.executemany('''
  31. INSERT INTO characters (
  32. kill_id, victim, character_id, character_name, ship_type_id,
  33. alliance_id, alliance_name, corporation_id, corporation_name, faction_id, faction_name,
  34. damage, final_blow, security_status, weapon_type_id
  35. ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
  36. ''', parambatch
  37. )
  38. parambatch = []
  39. for item in kill['items']:
  40. parambatch.append((kill['killID'], item['typeID'], item['flag'],
  41. item['qtyDropped'], item['qtyDestroyed'], item['singleton']))
  42. c.executemany('''
  43. INSERT INTO items (
  44. kill_id, type_id, flag, dropped, destroyed, singleton
  45. ) VALUES(?, ?, ?, ?, ?, ?)
  46. ''', parambatch
  47. )
  48. print('done')
  49. def main():
  50. conn = HTTPSConnection('zkillboard.com', timeout=10)
  51. with db.cursor() as c:
  52. groups = db.query(c, 'SELECT groupID FROM eve.invGroups WHERE categoryID = ?', 6)
  53. groups = list(map(operator.itemgetter('groupID'), groups))
  54. for i in range(0, len(groups), 10):
  55. query_groups = list(map(str, groups[i:i+10]))
  56. last_kill_id = None
  57. last_request_time = 0
  58. while True:
  59. path = '/api/losses/api-only/groupID/{}'.format(','.join(query_groups))
  60. if last_kill_id is not None:
  61. path += '/beforeKillID/' + str(last_kill_id)
  62. now = time.time()
  63. if now - last_request_time < 10:
  64. print('sleeping', 10 - (now - last_request_time))
  65. time.sleep(10 - (now - last_request_time))
  66. conn.request('GET', path)
  67. response = conn.getresponse()
  68. if response.status != 200:
  69. raise Exception('got {} {} from zkb'.format(response.status, response.reason))
  70. kills = json.loads(response.read().decode('utf-8'))
  71. response.close()
  72. print('inserting', len(kills), 'kills')
  73. for kill in kills:
  74. insert_kill(c, kill)
  75. db.conn.commit()
  76. last_kill_id = kills[-1]['killID']
  77. last_request_time = now
  78. if __name__ == '__main__':
  79. main()