| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import time
- import requests
- import sqlite3
- from datetime import datetime
- def get_dmarket_data():
- """从DMarket API获取商品数据"""
- url = "https://api.dmarket.com/exchange/v1/market/items"
- headers = {
- "Accept": "application/json, text/plain, */*",
- "Language": "ZH",
- "Referer": "https://dmarket.com/",
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
- "jkkat": "eafac24b",
- "payment-session-id": "3a1b1e5b-2a62-420b-8064-444495216e98"
- }
- params = {
- "side": "market",
- "orderBy": "updated",
- "orderDir": "desc",
- "priceFrom": 0,
- "priceTo": 0,
- "gameId": "a8db",
- "types": "dmarket",
- "limit": 100, # 每次获取100条,可根据需要调整
- "currency": "USD",
- "platform": "browser"
- }
-
- response = requests.get(url, headers=headers, params=params)
- return response.json()
- def save_to_database(data):
- """保存DMarket数据到数据库"""
- conn = sqlite3.connect('buff_prices.db')
- cursor = conn.cursor()
- current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
-
- try:
- items = data.get('objects', [])
- count = 0
- updated_count = 0
- not_found_count = 0
-
- for item in items:
- # 从DMarket数据中获取商品名称和磨损
- item_name = item.get('extra', {}).get('name', '')
- exterior = item.get('extra', {}).get('exterior', '')
-
- if not item_name:
- continue
-
- # 构建market_hash_name格式
- if exterior:
- market_hash_name = f"{item_name} ({exterior.capitalize()})"
- else:
- market_hash_name = item_name
- print(market_hash_name)
- # 在products表中查找匹配的商品
- cursor.execute('SELECT id FROM products WHERE market_hash_name LIKE ?', ('%' + market_hash_name,))
- product = cursor.fetchone()
-
- if product:
- product_id = product[0]
-
- # DMarket的price.USD单位是美分,转换为美元
- price_usd = item.get('price', {}).get('USD', '')
- if price_usd:
- min_price = float(price_usd) / 100
- else:
- continue
-
- # 插入或更新DMarket平台价格
- cursor.execute('''
- INSERT INTO platform_prices (product_id, platform_code, min_price, recorded_at, currency)
- VALUES (?, ?, ?, ?, 'USD')
- ON CONFLICT(product_id, platform_code) DO UPDATE SET
- min_price = excluded.min_price,
- recorded_at = excluded.recorded_at
- ''', (product_id, 'dmarket', min_price, current_time))
-
- updated_count += 1
- else:
- not_found_count += 1
-
- count += 1
-
- conn.commit()
- print(f"处理了 {count} 条DMarket商品数据")
- print(f"成功更新 {updated_count} 条价格")
- print(f"未匹配到商品 {not_found_count} 条")
-
- except Exception as e:
- conn.rollback()
- print(f"保存数据出错: {e}")
- finally:
- conn.close()
- def main():
- while True:
- response_data = get_dmarket_data()
-
- if response_data and 'objects' in response_data:
- save_to_database(response_data)
- else:
- print("API返回数据异常")
- time.sleep(5)
- if __name__ == "__main__":
- main()
|