seed_session.py 2.2 KB

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