lupohan44

Account Spider Place Order Demo Code

Jan 21st, 2025 (edited)
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 KB | None | 0 0
  1. import random
  2. import time
  3.  
  4. import requests
  5. import hashlib
  6. import urllib.parse
  7.  
  8. API_ID = "" # Replace with your actual API ID
  9. API_SECRET = "" # Replace with your actual API Secret
  10. API_BASE_URL = "https://www.accountspider.com" # Replace with the actual base URL from your docs
  11.  
  12. def generate_signature(data: dict, secret: str) -> str:
  13. """
  14. Replicates the provided PHP signature logic:
  15. - Remove 'sign' key if present
  16. - Sort the parameters by key
  17. - Remove empty-string or array/dict values
  18. - Append '&key=secret'
  19. - MD5 the resulting string
  20. """
  21. data.pop('sign', None)
  22. sorted_items = sorted(data.items(), key=lambda x: x[0])
  23.  
  24. filtered = []
  25. for k, v in sorted_items:
  26. # exclude empty or complex values
  27. if v == '' or isinstance(v, (list, dict)):
  28. continue
  29. filtered.append((k, v))
  30.  
  31. query_string = urllib.parse.urlencode(filtered)
  32. query_string += f"&key={secret}"
  33.  
  34. signature = hashlib.md5(query_string.encode('utf-8')).hexdigest()
  35. return signature
  36.  
  37. def post_form(endpoint: str, data: dict) -> dict:
  38. """
  39. Helper function to:
  40. 1) Generate signature
  41. 2) Send POST with form data
  42. 3) Return the server JSON response
  43. """
  44. # Generate signature
  45. signature = generate_signature(data, API_SECRET)
  46.  
  47. # Prepare headers
  48. headers = {
  49. "Api-Id": API_ID,
  50. "Api-Signature": signature,
  51. "Content-Type": "application/x-www-form-urlencoded",
  52. }
  53.  
  54. # Send form-encoded POST
  55. response = requests.post(endpoint, data=data, headers=headers)
  56. return response.json()
  57.  
  58. # 1. 获取全部货源列表 - Get all items
  59. def get_items() -> dict:
  60. url = f"{API_BASE_URL}/plugin/open-api/items"
  61. data = {} # If no specific body params are required, pass an empty dict
  62. return post_form(url, data)
  63.  
  64. # 2. 单独获取某个商货源信息 - Get single item
  65. def get_item(item_id: int) -> dict:
  66. """
  67. Body param: id (int)
  68. """
  69. url = f"{API_BASE_URL}/plugin/open-api/item"
  70. data = {"id": item_id}
  71. return post_form(url, data)
  72.  
  73. # 3. 获取SKU库存数量 - Get SKU stock
  74. def get_sku_stock(sku_id: int) -> dict:
  75. """
  76. Body param: sku_id (int)
  77. """
  78. url = f"{API_BASE_URL}/plugin/open-api/sku/stock"
  79. data = {"sku_id": sku_id}
  80. return post_form(url, data)
  81.  
  82. # 4. 获取SKU当前状态 - Check if SKU can be purchased
  83. def get_sku_state(sku_id: int, quantity: int) -> dict:
  84. """
  85. Body params:
  86. sku_id (int)
  87. quantity (int)
  88. """
  89. url = f"{API_BASE_URL}/plugin/open-api/sku/state"
  90. data = {
  91. "sku_id": sku_id,
  92. "quantity": quantity
  93. }
  94. return post_form(url, data)
  95.  
  96. # 5. 下单(进货) - Place an order
  97. def place_order(sku_id: int, quantity: int, trade_no: str) -> dict:
  98. """
  99. Body params:
  100. sku_id (int)
  101. quantity (int)
  102. trade_no (string, must be 24 digits)
  103. async_url (string, optional)
  104. """
  105. url = f"{API_BASE_URL}/plugin/open-api/trade"
  106. data = {
  107. "sku_id": sku_id,
  108. "quantity": quantity,
  109. "trade_no": trade_no, # must be 24 digits
  110. }
  111.  
  112. return post_form(url, data)
  113.  
  114. # 6. 订单查询 - Query order
  115. def query_order(trade_no: str) -> dict:
  116. """
  117. Body param:
  118. trade_no (string, must be 24 digits)
  119. """
  120. url = f"{API_BASE_URL}/plugin/open-api/query"
  121. data = {
  122. "trade_no": trade_no
  123. }
  124. return post_form(url, data)
  125.  
  126. def generate_order_number() -> str:
  127. """
  128. Generate a 24-digit order number for testing purposes.
  129. """
  130. # current timestamp (10 digits) + random 14 digits
  131. return str(int(time.time())) + str(random.randint(10000000000000, 99999999999999))
  132.  
  133. def main():
  134. """
  135. Demo usage:
  136. 1) Get all items
  137. 2) Get a single item
  138. 3) Get SKU stock
  139. 4) Check SKU purchase state
  140. 5) Place an order
  141. 6) Query that order
  142. """
  143. # 1. Get all items
  144. items_response = get_items()
  145. print("All Items:", items_response)
  146.  
  147. # 2. Get single item (example item_id = 123)
  148. item_response = get_item(item_id=163)
  149. print("Single Item:", item_response)
  150.  
  151. # 3. Get SKU stock (example sku_id = 456)
  152. stock_response = get_sku_stock(sku_id=139)
  153. print("SKU Stock:", stock_response)
  154.  
  155. # 4. Check SKU state
  156. state_response = get_sku_state(sku_id=139, quantity=2)
  157. print("SKU State:", state_response)
  158.  
  159. # 5. Place an order
  160. # trade_no MUST be a 24-digit string
  161. order_trade_no = generate_order_number()
  162. order_response = place_order(
  163. sku_id=139,
  164. quantity=2,
  165. trade_no=order_trade_no
  166. )
  167. print("Place Order:", order_response)
  168.  
  169. # 6. Query that order
  170. query_response = query_order(trade_no=order_trade_no)
  171. print("Query Order:", query_response)
  172.  
  173. if __name__ == "__main__":
  174. main()
  175.  
Advertisement
Add Comment
Please, Sign In to add comment