seed_session.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # -*- coding: utf-8 -*-
  2. """按 ThinkPHP File 缓存格式写入一个测试登录态,验证 Java 拦截器能正确读取。
  3. PHP serialize 字符串长度按 UTF-8 字节计,这里用通用序列化函数自动计算,避免手写长度出错。
  4. """
  5. import hashlib
  6. import os
  7. # 默认写 Java 侧缓存目录;设置 YOSHOP_CACHE 可额外写入其它目录(如本地 PHP 站点的 runtime/cache)
  8. CACHE = os.environ.get(
  9. "YOSHOP_CACHE",
  10. r"C:\Users\Administrator\WorkBuddy\2026-10-17-12-27-10\java-rewrite\runtime\cache")
  11. def php_serialize(v):
  12. if v is None:
  13. return "N;"
  14. if isinstance(v, bool):
  15. return "b:" + ("1" if v else "0") + ";"
  16. if isinstance(v, int):
  17. return "i:%d;" % v
  18. if isinstance(v, float):
  19. return "d:%r;" % v
  20. if isinstance(v, str):
  21. return 's:%d:"%s";' % (len(v.encode("utf-8")), v)
  22. if isinstance(v, dict):
  23. out = "a:%d:{" % len(v)
  24. for k, val in v.items():
  25. out += php_serialize(k) + php_serialize(val)
  26. return out + "}"
  27. if isinstance(v, (list, tuple)):
  28. out = "a:%d:{" % len(v)
  29. for i, val in enumerate(v):
  30. out += "i:%d;" % i + php_serialize(val)
  31. return out + "}"
  32. raise TypeError(type(v))
  33. user = {
  34. "store_user_id": 10001,
  35. "user_name": "admin",
  36. "password": "$2y$10$57o000000000000000000000000000000000000000000000000", # 占位,仅用于读取测试
  37. "real_name": "系统管理员",
  38. "is_super": 1,
  39. "is_delete": 0,
  40. "sort": 100,
  41. "store_id": 10001,
  42. "create_time": 1614556800,
  43. }
  44. cache_value = {"user": user, "store_id": 10001, "is_login": True}
  45. token = "testsession123"
  46. name = hashlib.md5(token.encode()).hexdigest()
  47. path = os.path.join(CACHE, name[:2], name[2:] + ".php")
  48. os.makedirs(os.path.dirname(path), exist_ok=True)
  49. header = "<?php\n//" + format(2099999999, "012d") + "\n exit();?>\n"
  50. assert len(header.encode()) == 32, len(header.encode())
  51. payload = php_serialize(cache_value)
  52. with open(path, "w", encoding="utf-8", newline="") as f:
  53. f.write(header + payload)
  54. print("token :", token)
  55. print("file :", path)
  56. print("header:", len(header.encode()), "bytes | payload:", len(payload.encode()), "bytes")
  57. print("payload 前 150 字:", payload[:150])